From: ChenLiang <chenlian...@huawei.com> Power-up software can determine how much address space the device requires by writing a value of all 1's to the register and then reading the value back(PCI specification). Qemu should not do pci_update_mappings. Qemu may exit, because the wrong address of this bar is overlap with other memslots.
Signed-off-by: ChenLiang <chenlian...@huawei.com> Signed-off-by: Gonglei <arei.gong...@huawei.com> --- hw/pci/pci.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/hw/pci/pci.c b/hw/pci/pci.c index 6ce75aa..4d44b44 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -1158,12 +1158,12 @@ void pci_default_write_config(PCIDevice *d, uint32_t addr, uint32_t val_in, int d->config[addr + i] = (d->config[addr + i] & ~wmask) | (val & wmask); d->config[addr + i] &= ~(val & w1cmask); /* W1C: Write 1 to Clear */ } - if (ranges_overlap(addr, l, PCI_BASE_ADDRESS_0, 24) || + if (((ranges_overlap(addr, l, PCI_BASE_ADDRESS_0, 24) || ranges_overlap(addr, l, PCI_ROM_ADDRESS, 4) || - ranges_overlap(addr, l, PCI_ROM_ADDRESS1, 4) || - range_covers_byte(addr, l, PCI_COMMAND)) + ranges_overlap(addr, l, PCI_ROM_ADDRESS1, 4)) && + val_in != 0xffffffff) || range_covers_byte(addr, l, PCI_COMMAND)) { pci_update_mappings(d); - + } if (range_covers_byte(addr, l, PCI_COMMAND)) { pci_update_irq_disabled(d, was_irq_disabled); memory_region_set_enabled(&d->bus_master_enable_region, -- 1.7.12.4