From d1b65b73021f7d6aa301dbf6ceb2d5dfe6e90b29 Mon Sep 17 00:00:00 2001 From: Naphtali Sprei <nsprei@redhat.com> Date: Wed, 29 Jul 2009 20:52:03 +0300 Subject: [PATCH 2/2] fix for bug #508664, KVM: "could not read the boot disk" error message after running "Sys Mark" benchmark on Windows Guest In some cases reboot sequence fails to detect the ide device in the rombios sequence for ata_detect, since ioport writes are ignored when the ide device status indicates busy or data request in progres. The ide if must be reset when system reset. Signed-off-by: Naphtali Sprei <nsprei@redhat.com> Message-ID: <4A708E6A.4000809@redhat.com> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> Bugzilla: 508664 Acked-by: Gleb Natapov <gleb@redhat.com> Acked-by: Dor Laor <dlaor@redhat.com> Acked-by: Avi Kivity <avi@redhat.com> --- qemu/hw/ide.c | 14 ++++++++------ 1 files changed, 8 insertions(+), 6 deletions(-) diff --git a/qemu/hw/ide.c b/qemu/hw/ide.c index dd56f82..30a175e 100644 --- a/qemu/hw/ide.c +++ b/qemu/hw/ide.c @@ -3325,6 +3325,8 @@ static void piix3_reset(void *opaque) for (i = 0; i < 2; i++) ide_dma_cancel(&d->bmdma[i]); + for (i = 0; i < 4; i++) + ide_reset(&d->ide_if[i]); pci_conf[0x04] = 0x00; pci_conf[0x05] = 0x00; @@ -3359,9 +3361,6 @@ void pci_piix3_ide_init(PCIBus *bus, BlockDriverState **hd_table, int devfn, pci_conf[0x0b] = 0x01; // class_base = PCI_mass_storage pci_conf[0x0e] = 0x00; // header_type - qemu_register_reset(piix3_reset, d); - piix3_reset(d); - pci_register_io_region((PCIDevice *)d, 4, 0x10, PCI_ADDRESS_SPACE_IO, bmdma_map); @@ -3374,6 +3373,9 @@ void pci_piix3_ide_init(PCIBus *bus, BlockDriverState **hd_table, int devfn, if (hd_table[i]) hd_table[i]->private = &d->dev; + qemu_register_reset(piix3_reset, d); + piix3_reset(d); + register_savevm("ide", 0, 2, pci_ide_save, pci_ide_load, d); } @@ -3402,9 +3404,6 @@ void pci_piix4_ide_init(PCIBus *bus, BlockDriverState **hd_table, int devfn, pci_conf[0x0b] = 0x01; // class_base = PCI_mass_storage pci_conf[0x0e] = 0x00; // header_type - qemu_register_reset(piix3_reset, d); - piix3_reset(d); - pci_register_io_region((PCIDevice *)d, 4, 0x10, PCI_ADDRESS_SPACE_IO, bmdma_map); @@ -3413,6 +3412,9 @@ void pci_piix4_ide_init(PCIBus *bus, BlockDriverState **hd_table, int devfn, ide_init_ioport(&d->ide_if[0], 0x1f0, 0x3f6); ide_init_ioport(&d->ide_if[2], 0x170, 0x376); + qemu_register_reset(piix3_reset, d); + piix3_reset(d); + register_savevm("ide", 0, 2, pci_ide_save, pci_ide_load, d); } -- 1.6.3.rc4.29.g8146