On 2013-06-23 22:50, Hervé Poussineau wrote: > Jan Kiszka a écrit : >> From: Jan Kiszka >> >> The current ioport dispatcher is a complex beast, mostly due to the >> need to deal with old portio interface users. But we can overcome it >> without converting all portio users by embedding the required base >> address of a MemoryRegionPortio access into that data structure. That >> removes the need to have the additional MemoryRegionIORange structure >> in the loop on every access. >> >> To handle old portio memory ops, we simply install dispatching handlers >> for portio memory regions when registering them with the memory core. >> This removes the need for the old_portio field. >> >> We can drop the additional aliasing of ioport regions and also the >> special address space listener. cpu_in and cpu_out now simply call >> address_space_read/write. And we can concentrate portio handling in a >> single source file. >> >> Signed-off-by: Jan Kiszka >> --- > > ... > >> + >> +static void portio_write(void *opaque, hwaddr addr, uint64_t data, >> + unsigned size) >> +{ >> + MemoryRegionPortioList *mrpio = opaque; >> + const MemoryRegionPortio *mrp = find_portio(mrpio, addr, size, >> true); >> + >> + if (mrp) { >> + mrp->write(mrpio->portio_opaque, mrp->base + addr, data); >> + } else if (size == 2) { >> + mrp = find_portio(mrpio, addr, 1, true); >> + assert(mrp); >> + mrp->write(mrpio->portio_opaque, mrp->base + addr, data & 0xff); >> + mrp->write(mrpio->portio_opaque, mrp->base + addr + 1, data >> >> 8); >> + } >> +} >> + >> +static const MemoryRegionOps portio_ops = { >> + .read = portio_read, >> + .write = portio_write, >> + .valid.unaligned = true, >> + .impl.unaligned = true, >> +}; >> + > > You need to mark these operations as DEVICE_LITTLE_ENDIAN. > In portio_write above, you clearly assume that data is in LE format. Anything behind PIO is little endian, of course. Will add this. > > This fixes PPC PReP emulation, which would otherwise be broken with this > patchset. Thanks, Jan