diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index c7e78266e50e84810d5ecb48071d077fd39a3c3a..a8fce222067dccd5e9e1b5667b090768e9c873c6 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4211,9 +4211,26 @@ qemuBuildDriveDevStr(virDomainDefPtr def, virBufferAddLit(&opt, "ide-drive"); } - virBufferAsprintf(&opt, ",bus=ahci%d.%d", - disk->info.addr.drive.controller, - disk->info.addr.drive.unit); + if (qemuDomainMachineIsQ35(def) && + disk->info.addr.drive.controller == 0) { + /* Q35 machines have an implicit ahci (sata) controller at + * 00:1F.2 which has no "id" associated with it. For this + * reason, we can't refer to it as "ahci0". Instead, we + * don't give an id, which qemu interprets as "use the + * first ahci controller". We then need to specify the + * unit with "unit=%d" rather than adding it onto the bus + * arg. + */ + virBufferAsprintf(&opt, ",unit=%d", disk->info.addr.drive.unit); + } else { + /* All other ahci controllers have been created by + * libvirt, so they *do* have an id, and we can identify + * them that way. + */ + virBufferAsprintf(&opt, ",bus=ahci%d.%d", + disk->info.addr.drive.controller, + disk->info.addr.drive.unit); + } break; case VIR_DOMAIN_DISK_BUS_VIRTIO: if (disk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW) { diff --git a/tests/qemuxml2argvdata/qemuxml2argv-q35.args b/tests/qemuxml2argvdata/qemuxml2argv-q35.args index 5ff4bc7b60e17ec70230f79c664c27fe34c3e3ae..9e67be566071e66fb11a3e4774745b0e789544ca 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-q35.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-q35.args @@ -3,4 +3,6 @@ LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test \ -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c \ -device i82801b11-bridge,id=pci.1,bus=pcie.0,addr=0x2 \ -device pci-bridge,chassis_nr=2,id=pci.2,bus=pci.1,addr=0x1 \ +-drive file=/dev/HostVG/QEMUGuest1,if=none,id=drive-sata0-0-0 \ +-device ide-drive,unit=0,drive=drive-sata0-0-0,id=sata0-0-0 \ -vga qxl -global qxl.ram_size=67108864 -global qxl.vram_size=18874368 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-q35.xml b/tests/qemuxml2argvdata/qemuxml2argv-q35.xml index 3541b146af4242adff8390cd2307909242ce2731..edaf6cbbf03dad394fa236c32dff530a46911656 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-q35.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-q35.xml @@ -14,6 +14,11 @@ destroy /usr/libexec/qemu-kvm + + + +
+ diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 0068d27ed2f9254dfc1ebcbce9c0d909105162a5..679124e35b52dc754a837dec72a71cf131ad2346 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1001,7 +1001,7 @@ mymain(void) DO_TEST("q35", QEMU_CAPS_DEVICE, QEMU_CAPS_DEVICE_PCI_BRIDGE, QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE, - QEMU_CAPS_ICH9_AHCI, + QEMU_CAPS_DRIVE, QEMU_CAPS_ICH9_AHCI, QEMU_CAPS_VGA, QEMU_CAPS_DEVICE_VIDEO_PRIMARY, QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL, QEMU_CAPS_DEVICE_QXL); diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-q35.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-q35.xml index 2a86e61f5701fcb170ac23309bf84da70d47d3ef..96f8eafdce24ab79f0bb94d83441fb4910379558 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-q35.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-q35.xml @@ -14,6 +14,11 @@ destroy /usr/libexec/qemu-kvm + + + +
+