]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
kvm: Fix unaligned PCI_CONFIG_ADDRESS accesses
authorPekka Enberg <penberg@kernel.org>
Sun, 15 Aug 2010 11:27:23 +0000 (14:27 +0300)
committerPekka Enberg <penberg@kernel.org>
Sun, 15 Aug 2010 11:27:23 +0000 (14:27 +0300)
This patch fixes unaligned PCI_CONFIG_ADDRESS accesses to use the same
mechanism as with PCI_CONFIG_DATA.

Signed-off-by: Pekka Enberg <penberg@kernel.org>
tools/kvm/pci.c

index e0ef324db766c489a5c68343be97ecdebd3944d1..7b1a05f70ff581365728746f113c9c966bb485bc 100644 (file)
@@ -6,20 +6,31 @@
 
 static struct pci_config_address pci_config_address;
 
+static void *pci_config_address_ptr(uint16_t port)
+{
+       unsigned long offset;
+       void *base;
+
+       offset          = port - PCI_CONFIG_ADDRESS;
+       base            = &pci_config_address;
+
+       return base + offset;
+}
+
 static bool pci_config_address_out(struct kvm *self, uint16_t port, void *data, int size, uint32_t count)
 {
-       struct pci_config_address *addr = data;
+       void *p = pci_config_address_ptr(port);
 
-       pci_config_address      = *addr;
+       memcpy(p, data, size);
 
        return true;
 }
 
 static bool pci_config_address_in(struct kvm *self, uint16_t port, void *data, int size, uint32_t count)
 {
-       struct pci_config_address *addr = data;
+       void *p = pci_config_address_ptr(port);
 
-       *addr           =  pci_config_address;
+       memcpy(data, p, size);
 
        return true;
 }
@@ -108,13 +119,15 @@ static struct ioport_operations virtio_io_ops = {
 
 void pci__init(void)
 {
+       ioport__register(IOPORT_VIRTIO, &virtio_io_ops);
 
-       ioport__register(IOPORT_VIRTIO,         &virtio_io_ops);
-
-       ioport__register(PCI_CONFIG_DATA + 0,   &pci_config_data_ops);
-       ioport__register(PCI_CONFIG_DATA + 1,   &pci_config_data_ops);
-       ioport__register(PCI_CONFIG_DATA + 2,   &pci_config_data_ops);
-       ioport__register(PCI_CONFIG_DATA + 3,   &pci_config_data_ops);
+       ioport__register(PCI_CONFIG_DATA + 0, &pci_config_data_ops);
+       ioport__register(PCI_CONFIG_DATA + 1, &pci_config_data_ops);
+       ioport__register(PCI_CONFIG_DATA + 2, &pci_config_data_ops);
+       ioport__register(PCI_CONFIG_DATA + 3, &pci_config_data_ops);
 
-       ioport__register(PCI_CONFIG_ADDRESS,    &pci_config_address_ops);
+       ioport__register(PCI_CONFIG_ADDRESS + 0, &pci_config_address_ops);
+       ioport__register(PCI_CONFIG_ADDRESS + 1, &pci_config_address_ops);
+       ioport__register(PCI_CONFIG_ADDRESS + 2, &pci_config_address_ops);
+       ioport__register(PCI_CONFIG_ADDRESS + 3, &pci_config_address_ops);
 }