>> + * 0x0400 -> 0x041f vga ioports (0x3c0 -> 0x3df), remapped 1:1 > > Do they support word accesses to set both index and data? > >> + * 0x0500 -> 0x0515 bochs dispi interface registers, mapped flat without >> + * index/data ports. Use (index << 1) as offset for >> + * (16bit) register access. >> + */ > > BAR should disappear with -M old. Sure. I have a patch in flight which adds the pc-1.3 machine type, once this is in I can easily add the compat stuff. >> +static const MemoryRegionOps pci_vga_ioport_ops = { >> + .read = pci_vga_ioport_read, >> + .write = pci_vga_ioport_write, >> + .valid.min_access_size = 1, >> + .valid.max_access_size = 4, >> + .impl.min_access_size = 1, >> + .impl.max_access_size = 1, >> + .endianness = DEVICE_LITTLE_ENDIAN, >> +}; > > Looks like word writes are supported provided the memory API breaks up > writes in little endian order. Better to make it explicit. Like the attached incremental patch? cheers, Gerd
>From d46b14dfd74dcc37fe187dc76cd681ad7dbff2d5 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann <kraxel@xxxxxxxxxx> Date: Wed, 19 Sep 2012 13:31:04 +0200 Subject: [PATCH] [fixup] vga mmio Signed-off-by: Gerd Hoffmann <kraxel@xxxxxxxxxx> --- hw/vga-pci.c | 25 ++++++++++++++++++++++--- 1 files changed, 22 insertions(+), 3 deletions(-) diff --git a/hw/vga-pci.c b/hw/vga-pci.c index e05e2ef..7fd305d 100644 --- a/hw/vga-pci.c +++ b/hw/vga-pci.c @@ -78,14 +78,33 @@ static uint64_t pci_vga_ioport_read(void *ptr, target_phys_addr_t addr, unsigned size) { PCIVGAState *d = ptr; - return vga_ioport_read(&d->vga, addr); + uint64_t ret = 0; + + switch (size) { + case 1: + ret = vga_ioport_read(&d->vga, addr); + break; + case 2: + ret = vga_ioport_read(&d->vga, addr); + ret |= vga_ioport_read(&d->vga, addr+1) << 8; + break; + } + return ret; } static void pci_vga_ioport_write(void *ptr, target_phys_addr_t addr, uint64_t val, unsigned size) { PCIVGAState *d = ptr; - vga_ioport_write(&d->vga, addr, val); + switch (size) { + case 1: + vga_ioport_write(&d->vga, addr, val); + break; + case 2: + vga_ioport_write(&d->vga, addr, val & 0xff); + vga_ioport_write(&d->vga, addr+1, (val >> 8) & 0xff); + break; + } } static const MemoryRegionOps pci_vga_ioport_ops = { @@ -94,7 +113,7 @@ static const MemoryRegionOps pci_vga_ioport_ops = { .valid.min_access_size = 1, .valid.max_access_size = 4, .impl.min_access_size = 1, - .impl.max_access_size = 1, + .impl.max_access_size = 2, .endianness = DEVICE_LITTLE_ENDIAN, }; -- 1.7.1