aboutsummaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
authorMichael S. Tsirkin <mst@redhat.com>2009-12-15 14:58:53 +0200
committerAvi Kivity <avi@redhat.com>2009-12-17 10:25:10 +0200
commitfd398eeea2b95e90b78269ca9cf237a084ec73e8 (patch)
treed086be7735ede2ec8b0f673afeeb8876f29932af /hw
parentcompatfd: trivial compile fix (diff)
downloadqemu-kvm-fd398eeea2b95e90b78269ca9cf237a084ec73e8.tar.gz
qemu-kvm-fd398eeea2b95e90b78269ca9cf237a084ec73e8.tar.bz2
qemu-kvm-fd398eeea2b95e90b78269ca9cf237a084ec73e8.zip
Fix infinite recursion in pci
Make config reads for assigned devices work like they used to: both pci_default_read_config and pci_default_cap_read_config call to pci_read_config, which does the actual work. This fixes infinite recursion introduced by a recent merge. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Reported-by: Hannes Reinecke <hare@suse.de> Tested-by: Hannes Reinecke <hare@suse.de> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'hw')
-rw-r--r--hw/pci.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/hw/pci.c b/hw/pci.c
index 110a5fc07..0c5476098 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -1016,19 +1016,26 @@ static void pci_update_irq_disabled(PCIDevice *d, int was_irq_disabled)
}
}
+static uint32_t pci_read_config(PCIDevice *d,
+ uint32_t address, int len)
+{
+ uint32_t val = 0;
+
+ len = MIN(len, pci_config_size(d) - address);
+ memcpy(&val, d->config + address, len);
+ return le32_to_cpu(val);
+}
+
uint32_t pci_default_read_config(PCIDevice *d,
uint32_t address, int len)
{
- uint32_t val = 0;
assert(len == 1 || len == 2 || len == 4);
if (pci_access_cap_config(d, address, len)) {
return d->cap.config_read(d, address, len);
}
- len = MIN(len, pci_config_size(d) - address);
- memcpy(&val, d->config + address, len);
- return le32_to_cpu(val);
+ return pci_read_config(d, address, len);
}
static void pci_write_config(PCIDevice *pci_dev,
@@ -1052,7 +1059,7 @@ int pci_access_cap_config(PCIDevice *pci_dev, uint32_t address, int len)
uint32_t pci_default_cap_read_config(PCIDevice *pci_dev,
uint32_t address, int len)
{
- return pci_default_read_config(pci_dev, address, len);
+ return pci_read_config(pci_dev, address, len);
}
void pci_default_cap_write_config(PCIDevice *pci_dev,