pci: fix corrupted pci conf index register by unaligned write
authorAvi Kivity <avi@redhat.com>
Wed, 4 Jan 2012 14:28:42 +0000 (16:28 +0200)
committerMichael S. Tsirkin <mst@redhat.com>
Sun, 15 Apr 2012 09:17:23 +0000 (12:17 +0300)
Commit d0ed8076cbdc261 converted the PCI config access to the memory
API, but also inadvertantly changed it to accept unaligned writes,
and corrupt the index register in the process.  This causes a regression
booting NetBSD.

Fix by ignoring unaligned or non-dword writes.

https://bugs.launchpad.net/qemu/+bug/897771

Reported-by: Andreas Gustafsson <gson@gson.org>
Signed-off-by: Avi Kivity <avi@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
hw/pci_host.c

index 44c6c207a9fc1ebd23f3de795efe8fbec0bd38f5..804177891a6e36f801ed5a8d68e62a8b468fb534 100644 (file)
@@ -101,6 +101,9 @@ static void pci_host_config_write(void *opaque, target_phys_addr_t addr,
 
     PCI_DPRINTF("%s addr " TARGET_FMT_plx " len %d val %"PRIx64"\n",
                 __func__, addr, len, val);
+    if (addr != 0 || len != 4) {
+        return;
+    }
     s->config_reg = val;
 }