From: Michael S. Tsirkin Date: Wed, 16 Sep 2009 10:41:09 +0000 (+0300) Subject: qemu/pci: reset device registers on bus reset X-Git-Tag: v0.12.0-rc0~850 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c0b1905b285800cfd1a797347efeac8338bfa655;p=thirdparty%2Fqemu.git qemu/pci: reset device registers on bus reset Reset BARs and a couple of other registers on bus reset, as per PCI spec. Signed-off-by: Michael S. Tsirkin Signed-off-by: Anthony Liguori --- diff --git a/hw/pci.c b/hw/pci.c index 2dd72139d31..e2f88ff75a8 100644 --- a/hw/pci.c +++ b/hw/pci.c @@ -92,7 +92,20 @@ static inline int pci_bar(int reg) static void pci_device_reset(PCIDevice *dev) { + int r; + memset(dev->irq_state, 0, sizeof dev->irq_state); + dev->config[PCI_COMMAND] &= ~(PCI_COMMAND_IO | PCI_COMMAND_MEMORY | + PCI_COMMAND_MASTER); + dev->config[PCI_CACHE_LINE_SIZE] = 0x0; + dev->config[PCI_INTERRUPT_LINE] = 0x0; + for (r = 0; r < PCI_NUM_REGIONS; ++r) { + if (!dev->io_regions[r].size) { + continue; + } + pci_set_long(dev->config + pci_bar(r), dev->io_regions[r].type); + } + pci_update_mappings(dev); } static void pci_bus_reset(void *opaque)