]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Support per-device boot ordering
authorJiri Denemark <jdenemar@redhat.com>
Wed, 12 Jan 2011 10:33:34 +0000 (11:33 +0100)
committerJiri Denemark <jdenemar@redhat.com>
Mon, 17 Jan 2011 16:08:13 +0000 (17:08 +0100)
Support for this is included in qemu and seabios from upstream git.

src/qemu/qemu_capabilities.c
src/qemu/qemu_capabilities.h
src/qemu/qemu_command.c
src/qemu/qemu_command.h
src/qemu/qemu_driver.c
src/qemu/qemu_hotplug.c

index f9672558bfe1a800306b1e951bb9c420068cfe41..1f0a3c202770f42935202e96d80ba841c16655fd 100644 (file)
@@ -431,6 +431,7 @@ qemuCapsInitGuest(virCapsPtr caps,
     int nmachines = 0;
     struct stat st;
     unsigned int ncpus;
+    unsigned long long qemuCmdFlags;
     int ret = -1;
 
     /* Check for existance of base emulator, or alternate base
@@ -546,6 +547,11 @@ qemuCapsInitGuest(virCapsPtr caps,
         !virCapabilitiesAddGuestFeature(guest, "cpuselection", 1, 0))
         goto error;
 
+    if (qemuCapsExtractVersionInfo(binary, NULL, &qemuCmdFlags) < 0 ||
+        ((qemuCmdFlags & QEMUD_CMD_FLAG_BOOTINDEX) &&
+         !virCapabilitiesAddGuestFeature(guest, "deviceboot", 1, 0)))
+        goto error;
+
     if (hvm) {
         if (virCapabilitiesAddGuestDomain(guest,
                                           "qemu",
@@ -1047,6 +1053,7 @@ qemuCapsExtractDeviceStr(const char *qemu,
      * '-device ?'.  */
     cmd = virCommandNewArgList(qemu,
                                "-device", "pci-assign,?",
+                               "-device", "virtio-blk-pci,?",
                                NULL);
     virCommandAddEnvPassCommon(cmd);
     /* qemu -help goes to stdout, but qemu -device ? goes to stderr.  */
@@ -1070,6 +1077,8 @@ qemuCapsParseDeviceStr(const char *str, unsigned long long *flags)
 {
     if (strstr(str, "pci-assign.configfd"))
         *flags |= QEMUD_CMD_FLAG_PCI_CONFIGFD;
+    if (strstr(str, "virtio-blk-pci.bootindex"))
+        *flags |= QEMUD_CMD_FLAG_BOOTINDEX;
 
     return 0;
 }
index 8057479f2d31dd2a997f1f6bba0cceac657cd309..e9e2da0d42058d2f03443daf2011067607fa04e6 100644 (file)
@@ -83,6 +83,7 @@ enum qemuCapsFlags {
     QEMUD_CMD_FLAG_SPICE         = (1LL << 46), /* Is -spice avail */
     QEMUD_CMD_FLAG_VGA_NONE      = (1LL << 47), /* The 'none' arg for '-vga' */
     QEMUD_CMD_FLAG_MIGRATE_QEMU_FD = (1LL << 48), /* -incoming fd:n */
+    QEMUD_CMD_FLAG_BOOTINDEX     = (1LL << 49), /* -device bootindex property */
 };
 
 virCapsPtr qemuCapsInit(virCapsPtr old_caps);
index fff1f744001077bcb84f187d563a2272b453886f..d36a30a7c2f5b9b969eb8b002fcdd909d9ec38e3 100644 (file)
@@ -1342,7 +1342,8 @@ error:
 
 
 char *
-qemuBuildDriveDevStr(virDomainDiskDefPtr disk)
+qemuBuildDriveDevStr(virDomainDiskDefPtr disk,
+                     unsigned long long qemuCmdFlags)
 {
     virBuffer opt = VIR_BUFFER_INITIALIZER;
     const char *bus = virDomainDiskQEMUBusTypeToString(disk->bus);
@@ -1382,6 +1383,8 @@ qemuBuildDriveDevStr(virDomainDiskDefPtr disk)
     }
     virBufferVSprintf(&opt, ",drive=%s%s", QEMU_DRIVE_HOST_PREFIX, disk->info.alias);
     virBufferVSprintf(&opt, ",id=%s", disk->info.alias);
+    if (disk->bootIndex && (qemuCmdFlags & QEMUD_CMD_FLAG_BOOTINDEX))
+        virBufferVSprintf(&opt, ",bootindex=%d", disk->bootIndex);
 
     if (virBufferError(&opt)) {
         virReportOOMError();
@@ -1538,7 +1541,9 @@ qemuBuildNicStr(virDomainNetDefPtr net,
 
 
 char *
-qemuBuildNicDevStr(virDomainNetDefPtr net, int vlan)
+qemuBuildNicDevStr(virDomainNetDefPtr net,
+                   int vlan,
+                   unsigned long long qemuCmdFlags)
 {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
     const char *nic;
@@ -1563,6 +1568,8 @@ qemuBuildNicDevStr(virDomainNetDefPtr net, int vlan)
                       net->mac[4], net->mac[5]);
     if (qemuBuildDeviceAddressStr(&buf, &net->info) < 0)
         goto error;
+    if (net->bootIndex && (qemuCmdFlags & QEMUD_CMD_FLAG_BOOTINDEX))
+        virBufferVSprintf(&buf, ",bootindex=%d", net->bootIndex);
 
     if (virBufferError(&buf)) {
         virReportOOMError();
@@ -3125,10 +3132,19 @@ qemuBuildCommandLine(virConnectPtr conn,
                                            disk->info.addr.drive.unit
                                            ? 'B' : 'A',
                                            disk->info.alias);
+
+                    if (disk->bootIndex &&
+                        (qemuCmdFlags & QEMUD_CMD_FLAG_BOOTINDEX)) {
+                        virCommandAddArg(cmd, "-global");
+                        virCommandAddArgFormat(cmd, "isa-fdc.bootindex%c=%d",
+                                               disk->info.addr.drive.unit
+                                               ? 'B' : 'A',
+                                               disk->bootIndex);
+                    }
                 } else {
                     virCommandAddArg(cmd, "-device");
 
-                    if (!(optstr = qemuBuildDriveDevStr(disk)))
+                    if (!(optstr = qemuBuildDriveDevStr(disk, qemuCmdFlags)))
                         goto error;
                     virCommandAddArg(cmd, optstr);
                     VIR_FREE(optstr);
@@ -3352,7 +3368,7 @@ qemuBuildCommandLine(virConnectPtr conn,
             }
             if (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE) {
                 virCommandAddArg(cmd, "-device");
-                if (!(nic = qemuBuildNicDevStr(net, vlan)))
+                if (!(nic = qemuBuildNicDevStr(net, vlan, qemuCmdFlags)))
                     goto error;
                 virCommandAddArg(cmd, nic);
                 VIR_FREE(nic);
index 5b245390350fd52afbe3637103d97efa24c4d096..9c07aca496dab30e5a8e2d0a59d5059c968cc096 100644 (file)
@@ -62,7 +62,8 @@ char * qemuBuildNicStr(virDomainNetDefPtr net,
 
 /* Current, best practice */
 char * qemuBuildNicDevStr(virDomainNetDefPtr net,
-                          int vlan);
+                          int vlan,
+                          unsigned long long qemuCmdFlags);
 
 char *qemuDeviceDriveHostAlias(virDomainDiskDefPtr disk,
                                unsigned long long qemuCmdFlags);
@@ -75,7 +76,8 @@ char *qemuBuildFSStr(virDomainFSDefPtr fs,
                      unsigned long long qemuCmdFlags);
 
 /* Current, best practice */
-char * qemuBuildDriveDevStr(virDomainDiskDefPtr disk);
+char * qemuBuildDriveDevStr(virDomainDiskDefPtr disk,
+                            unsigned long long qemuCmdFlags);
 char * qemuBuildFSDevStr(virDomainFSDefPtr fs);
 /* Current, best practice */
 char * qemuBuildControllerDevStr(virDomainControllerDefPtr def);
index 395f72f23682ecaae64b8aaee3eeb78146b622a7..2beb26826404f89c95e55ae44952ffbe31d51d01 100644 (file)
@@ -6050,6 +6050,7 @@ static char *qemuDomainXMLToNative(virConnectPtr conn,
      */
     for (i = 0 ; i < def->nnets ; i++) {
         virDomainNetDefPtr net = def->nets[i];
+        int bootIndex = net->bootIndex;
         if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK ||
             net->type == VIR_DOMAIN_NET_TYPE_DIRECT) {
             VIR_FREE(net->data.network.name);
@@ -6072,6 +6073,7 @@ static char *qemuDomainXMLToNative(virConnectPtr conn,
             net->data.ethernet.script = script;
             net->data.ethernet.ipaddr = ipaddr;
         }
+        net->bootIndex = bootIndex;
     }
     for (i = 0 ; i < def->ngraphics ; i++) {
         if (def->graphics[i]->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
index b4088acb6dd1580b65cf41cb5ef0ba160557abad..a4227dd5af9bc7db93cbdf8794562fbc0226b31e 100644 (file)
@@ -169,7 +169,7 @@ int qemuDomainAttachPciDiskDevice(struct qemud_driver *driver,
         if (!(drivestr = qemuBuildDriveStr(disk, 0, qemuCmdFlags)))
             goto error;
 
-        if (!(devstr = qemuBuildDriveDevStr(disk)))
+        if (!(devstr = qemuBuildDriveDevStr(disk, qemuCmdFlags)))
             goto error;
     }
 
@@ -380,7 +380,7 @@ int qemuDomainAttachSCSIDisk(struct qemud_driver *driver,
     if (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE) {
         if (qemuAssignDeviceDiskAlias(disk, qemuCmdFlags) < 0)
             goto error;
-        if (!(devstr = qemuBuildDriveDevStr(disk)))
+        if (!(devstr = qemuBuildDriveDevStr(disk, qemuCmdFlags)))
             goto error;
     }
 
@@ -493,7 +493,7 @@ int qemuDomainAttachUsbMassstorageDevice(struct qemud_driver *driver,
             goto error;
         if (!(drivestr = qemuBuildDriveStr(disk, 0, qemuCmdFlags)))
             goto error;
-        if (!(devstr = qemuBuildDriveDevStr(disk)))
+        if (!(devstr = qemuBuildDriveDevStr(disk, qemuCmdFlags)))
             goto error;
     }
 
@@ -675,7 +675,7 @@ int qemuDomainAttachNetDevice(virConnectPtr conn,
     }
 
     if (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE) {
-        if (!(nicstr = qemuBuildNicDevStr(net, vlan)))
+        if (!(nicstr = qemuBuildNicDevStr(net, vlan, qemuCmdFlags)))
             goto try_remove;
     } else {
         if (!(nicstr = qemuBuildNicStr(net, NULL, vlan)))