From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MvRlD-0004PE-CB for qemu-devel@nongnu.org; Wed, 07 Oct 2009 04:20:35 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MvRl7-0004Io-UL for qemu-devel@nongnu.org; Wed, 07 Oct 2009 04:20:34 -0400 Received: from [199.232.76.173] (port=34418 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MvRl7-0004IX-O5 for qemu-devel@nongnu.org; Wed, 07 Oct 2009 04:20:29 -0400 Received: from mx1.redhat.com ([209.132.183.28]:60217) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MvRl7-0003PQ-Cm for qemu-devel@nongnu.org; Wed, 07 Oct 2009 04:20:29 -0400 Message-ID: <4ACC4F43.1010906@redhat.com> Date: Wed, 07 Oct 2009 10:20:19 +0200 From: Avi Kivity MIME-Version: 1.0 References: <200910051452.n95EphXY002170@d03av01.boulder.ibm.com> In-Reply-To: <200910051452.n95EphXY002170@d03av01.boulder.ibm.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] Re: [Qemu-commits] [COMMIT c0b1905] qemu/pci: reset device registers on bus reset List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Anthony Liguori , "Michael S. Tsirkin" Cc: "qemu-devel@nongnu.org" , kvm-devel On 10/05/2009 04:53 PM, Anthony Liguori wrote: > From: Michael S. Tsirkin > > Reset BARs and a couple of other registers on bus reset, as per PCI > spec. > This commit breaks Windows XP restart. After a restart Windows switches from 800x600 cirrus logic vga to 640x480 standard vga. My guess is that this is due to two mutually-cancelling bugs: - the bios fails to initialize one of the registers touched below - qemu sets up that register in the state the Windows expects the bios to leave it in instead of the on-reset state Once we perform the reset the register reverts to its correct reset state, the bios fails to initialize it, and Windows ignores the device. I reverted this commit from qemu-kvm.git. > diff --git a/hw/pci.c b/hw/pci.c > index 2dd7213..e2f88ff 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) > > > -- Do not meddle in the internals of kernels, for they are subtle and quick to panic.