From f06d190ab7a0400daa8f49937f9610dfdfe49c31 Mon Sep 17 00:00:00 2001 From: Pekka Enberg Date: Sun, 15 Aug 2010 14:27:23 +0300 Subject: [PATCH] kvm: Fix unaligned PCI_CONFIG_ADDRESS accesses This patch fixes unaligned PCI_CONFIG_ADDRESS accesses to use the same mechanism as with PCI_CONFIG_DATA. Signed-off-by: Pekka Enberg --- tools/kvm/pci.c | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/tools/kvm/pci.c b/tools/kvm/pci.c index e0ef324db766..7b1a05f70ff5 100644 --- a/tools/kvm/pci.c +++ b/tools/kvm/pci.c @@ -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); } -- 2.39.5