mirror of https://gitee.com/openkylin/qemu.git
pci: fix up w64 size calculation helper
BAR base was calculated incorrectly. Use existing pci_bar_address to get it right. Tested-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Igor Mammedov <imammedo@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
e732ea6387
commit
77d6f4ea76
20
hw/pci/pci.c
20
hw/pci/pci.c
|
@ -2306,7 +2306,7 @@ static void pci_dev_get_w64(PCIBus *b, PCIDevice *dev, void *opaque)
|
||||||
Range *range = opaque;
|
Range *range = opaque;
|
||||||
PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
|
PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
|
||||||
uint16_t cmd = pci_get_word(dev->config + PCI_COMMAND);
|
uint16_t cmd = pci_get_word(dev->config + PCI_COMMAND);
|
||||||
int r;
|
int i;
|
||||||
|
|
||||||
if (!(cmd & PCI_COMMAND_MEMORY)) {
|
if (!(cmd & PCI_COMMAND_MEMORY)) {
|
||||||
return;
|
return;
|
||||||
|
@ -2325,17 +2325,21 @@ static void pci_dev_get_w64(PCIBus *b, PCIDevice *dev, void *opaque)
|
||||||
range_extend(range, &pref_range);
|
range_extend(range, &pref_range);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (r = 0; r < PCI_NUM_REGIONS; ++r) {
|
for (i = 0; i < PCI_NUM_REGIONS; ++i) {
|
||||||
PCIIORegion *region = &dev->io_regions[r];
|
PCIIORegion *r = &dev->io_regions[i];
|
||||||
Range region_range;
|
Range region_range;
|
||||||
|
|
||||||
if (!region->size ||
|
if (!r->size ||
|
||||||
(region->type & PCI_BASE_ADDRESS_SPACE_IO) ||
|
(r->type & PCI_BASE_ADDRESS_SPACE_IO) ||
|
||||||
!(region->type & PCI_BASE_ADDRESS_MEM_TYPE_64)) {
|
!(r->type & PCI_BASE_ADDRESS_MEM_TYPE_64)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
region_range.begin = pci_bar_address(dev, i, r->type, r->size);
|
||||||
|
region_range.end = region_range.begin + r->size;
|
||||||
|
|
||||||
|
if (region_range.begin == PCI_BAR_UNMAPPED) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
region_range.begin = pci_get_quad(dev->config + pci_bar(dev, r));
|
|
||||||
region_range.end = region_range.begin + region->size;
|
|
||||||
|
|
||||||
region_range.begin = MAX(region_range.begin, 0x1ULL << 32);
|
region_range.begin = MAX(region_range.begin, 0x1ULL << 32);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue