Patchwork [Bug,586175] Re: Windows XP/2003 doesn't boot

login
register
mail settings
Submitter Cole Robinson
Date June 25, 2010, 3:55 p.m.
Message ID <20100625155506.24259.20859.malone@palladium.canonical.com>
Download mbox | patch
Permalink /patch/56978/
State New
Headers show

Comments

Cole Robinson - June 25, 2010, 3:55 p.m.
I can reproduce with qemu-kvm 0.12.4 like the original reporter. I
cannot reproduce with qemu-kvm upstream, qemu stable, or qemu upstream.
So boot=on could be the culprit. Libvirt generated command line:

LC_ALL=C PATH=/sbin:/usr/sbin:/bin:/usr/bin QEMU_AUDIO_DRV=none /usr/bin
/qemu-system-x86_64 -S -M pc-0.12 -no-kvm -m 512 -smp
1,sockets=1,cores=1,threads=1 -name winxp_test -uuid 634dff56-8c5a-fdbb-
b5fc-091bcf78e586 -nodefaults -chardev
socket,id=monitor,path=/var/lib/libvirt/qemu/winxp_test.monitor,server,nowait
-mon chardev=monitor,mode=readline -rtc base=localtime -boot c -drive
file=/var/lib/libvirt/images/winxp_test.img,if=none,id=drive-
ide0-0-0,boot=on,format=raw -device ide-drive,bus=ide.0,unit=0,drive
=drive-ide0-0-0,id=ide0-0-0 -drive
file=/mnt/data/media/win_xp_sp3_32.iso,if=none,media=cdrom,id=drive-
ide0-1-0,readonly=on,format=raw -device ide-drive,bus=ide.1,unit=0,drive
=drive-ide0-1-0,id=ide0-1-0 -device
rtl8139,vlan=0,id=net0,mac=52:54:00:ac:e8:ca,bus=pci.0,addr=0x4 -net
tap,fd=20,vlan=0,name=hostnet0 -chardev pty,id=serial0 -device isa-
serial,chardev=serial0 -usb -device usb-tablet,id=input0 -vnc
127.0.0.1:1 -k en-us -vga std -device virtio-balloon-
pci,id=balloon0,bus=pci.0,addr=0x3

Markus has a patch internally against an older qemu-kvm release that
apparently fixes the issue, however the upstream code is different so it
doesn't cleanly apply. Maybe this will give someone a hint for a proper
upstream solution:

 hw/pc.c |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)
Markus Armbruster - June 26, 2010, 5:27 a.m.
Cole Robinson <crobinso@redhat.com> writes:

> I can reproduce with qemu-kvm 0.12.4 like the original reporter. I
> cannot reproduce with qemu-kvm upstream, qemu stable, or qemu upstream.
> So boot=on could be the culprit. Libvirt generated command line:
>
> LC_ALL=C PATH=/sbin:/usr/sbin:/bin:/usr/bin QEMU_AUDIO_DRV=none /usr/bin
> /qemu-system-x86_64 -S -M pc-0.12 -no-kvm -m 512 -smp
> 1,sockets=1,cores=1,threads=1 -name winxp_test -uuid 634dff56-8c5a-fdbb-
> b5fc-091bcf78e586 -nodefaults -chardev
> socket,id=monitor,path=/var/lib/libvirt/qemu/winxp_test.monitor,server,nowait
> -mon chardev=monitor,mode=readline -rtc base=localtime -boot c -drive
> file=/var/lib/libvirt/images/winxp_test.img,if=none,id=drive-
> ide0-0-0,boot=on,format=raw -device ide-drive,bus=ide.0,unit=0,drive
> =drive-ide0-0-0,id=ide0-0-0 -drive
> file=/mnt/data/media/win_xp_sp3_32.iso,if=none,media=cdrom,id=drive-
> ide0-1-0,readonly=on,format=raw -device ide-drive,bus=ide.1,unit=0,drive
> =drive-ide0-1-0,id=ide0-1-0 -device
> rtl8139,vlan=0,id=net0,mac=52:54:00:ac:e8:ca,bus=pci.0,addr=0x4 -net
> tap,fd=20,vlan=0,name=hostnet0 -chardev pty,id=serial0 -device isa-
> serial,chardev=serial0 -usb -device usb-tablet,id=input0 -vnc
> 127.0.0.1:1 -k en-us -vga std -device virtio-balloon-
> pci,id=balloon0,bus=pci.0,addr=0x3
>
> Markus has a patch internally against an older qemu-kvm release that
> apparently fixes the issue, however the upstream code is different so it
> doesn't cleanly apply. Maybe this will give someone a hint for a proper
> upstream solution:

[snipp...]

That's only the second part of a revolting emergency hack.

Anyway, I posted a fix for current master yesterday:

Subject: [PATCH 12/12] pc: Fix CMOS info for drives defined with -device
Date: Fri, 25 Jun 2010 18:53:32 +0200
Message-Id: <1277484812-22012-13-git-send-email-armbru@redhat.com>

If it still needs backporting it to stable when I've dug myself out of
my current pit, I'll give it a try.  Wouldn't mind if somebody else beat
me to it.

Patch

diff --git a/hw/pc.c b/hw/pc.c
index d142282..c60a79a 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -271,12 +271,16 @@  static void cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
      */
     for (i = 0; i < 4; i++) {
         char id[32];
+        int cylinders, heads, secs;
 
         if (hd_table[i])
             continue;
         snprintf(id, sizeof(id), "drive-ide0-%d-%d",
                  i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
         hd_table[i] = drive_get_by_id(id);
+        if (hd_table[i]) {
+            bdrv_guess_geometry(hd_table[i]->bdrv, &cylinders, &heads, &secs);
+        }
     }
 
     /* various important CMOS locations needed by PC/Bochs bios */