Hi,

I am trying to use AHCI controllers with xen.  The main reason for that is 
because windows is so picky about which type of controller it can boot on, and 
if you don't have the right registry settings, you get Error 7B 
(http://support.microsoft.com/kb/324103)

So here's my attempt (in "hw/i386/pc_piix.c"):
    ide_drive_get(hd, MAX_IDE_BUS);
    if (pci_enabled) {
        PCIDevice *dev;
#if 1 // Eniac
        dev = pci_create_simple_multifunction(pci_bus,
            piix3_devfn + 1, true, "ich9-ahci");
#else // original code
        if (xen_enabled()) {
            dev = pci_piix3_xen_ide_init(pci_bus, hd, piix3_devfn + 1);
        } else {
            dev = pci_piix3_ide_init(pci_bus, hd, piix3_devfn + 1);
        }
#endif // Eniac
        idebus[0] = qdev_get_child_bus(&dev->qdev, "ide.0");
        idebus[1] = qdev_get_child_bus(&dev->qdev, "ide.1");
    } else {
        for(i = 0; i < MAX_IDE_BUS; i++) {
            ISADevice *dev;
            dev = isa_ide_init(isa_bus, ide_iobase[i], ide_iobase2[i],
                               ide_irq[i],
                               hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 1]);
            idebus[i] = qdev_get_child_bus(DEVICE(dev), "ide.0");
        }
}

And the config file to start xen fvm:
name = 'personal'
builder = 'hvm'
device_model_version = 'qemu-xen'
device_model_override = '/vm/qemu161test/qemu-161-vanilla'

vcpus = 4
memory = 2848
maxmem = 2848

usb = 1
usbdevice = 'tablet'
vnc = 1
vnclisten = '0.0.0.0:0'
serial='pty'

boot = "d"
device_model_args = [ "-drive", "if=none,file=/dev/sda,id=hd", "-device", 
"ide-hd,drive=hd,bus=ide.0", "-drive", 
"if=none,file=/vm/qemu161test/output.iso,id=cd", "-device", 
"ide-cd,drive=cd,bus=ide.1" ]

It works... but not flawlessly.  The grub can load the Ubuntu menu, kernel and 
initrd but then crash when it's trying to mount the rootfs.  In other words, 
bios int13h can read the disk fine but Linux kernel driver can't.  I've seen 
similar corruption happening on Windows boot as well.  After several days of 
triage, I realized that it might have to do with async read.  I found a defect 
report on this and applied that 
(https://code.grnet.gr/projects/qemu/repository/revisions/8464b273d69c61e33c55347e5b6bc0659687bae2)
 but the problem persists.  Here's the command I used to demonstrate the 
corruption:
bash-4.2# for k in `seq 20`; do dd if=/dev/sr0 bs=51200 count=10 2>/dev/null |>
2393220578 512000
2393220578 512000
1498197434 512000
2393220578 512000
2393220578 512000
2393220578 512000
2393220578 512000
2393220578 512000
2393220578 512000
2393220578 512000
2393220578 512000
2393220578 512000
2393220578 512000
2393220578 512000
2393220578 512000
1652232720 512000
2393220578 512000
2393220578 512000
2393220578 512000
2393220578 512000

One may need to run it several times to see the corruption.  It looks like a 
random racing condition.

I then tried several test with vanilla qemu:
# non-xen test
Qemu-1.6.1-vanilla with q35 chipset: no corruption
Qemu-1.6.1-vanilla with 440fx chipset: no corruption
Qemu-1.6.1 with AHCI patch and 440fx chipset: no corruption

# test with vanilla-xen
Qemu-1.6.1-vanilla with 440fx chipset: no corruption
Qemu-1.6.1 with AHCI patch and 440fx chipset: corruption

So the problem lies between the interaction between AHCI controller and xen.  
Has anyone else tried this and/or can take a look to see what's happening here?

Regards/Eniac


Reply via email to