From c0b1905b285800cfd1a797347efeac8338bfa655 Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Wed, 16 Sep 2009 13:41:09 +0300 Subject: [PATCH] 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 --- hw/pci.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/hw/pci.c b/hw/pci.c index 2dd72139d3..e2f88ff75a 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) -- 2.11.4.GIT