]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Switch over command line capabilities to virBitmap
authorJiri Denemark <jdenemar@redhat.com>
Tue, 8 Feb 2011 14:22:39 +0000 (15:22 +0100)
committerJiri Denemark <jdenemar@redhat.com>
Thu, 24 Feb 2011 11:10:00 +0000 (12:10 +0100)
This is done for two reasons:
- we are getting very close to 64 flags which is the maximum we can use
  with unsigned long long
- by using LL constants in enum we already violates C99 constraint that
  enum values have to fit into int

12 files changed:
cfg.mk
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
src/qemu/qemu_hotplug.h
src/qemu/qemu_migration.c
src/qemu/qemu_process.c
tests/qemuhelptest.c
tests/qemuxml2argvtest.c

diff --git a/cfg.mk b/cfg.mk
index 1bb9cbb72a889c0519cb2d8f4631da7672dbcc3c..5cb2ead59dda77ea27e571fb3229584ec9fe55a5 100644 (file)
--- a/cfg.mk
+++ b/cfg.mk
@@ -71,6 +71,7 @@ VC_LIST_ALWAYS_EXCLUDE_REGEX = ^docs/news.html.in$$
 # Functions like free() that are no-ops on NULL arguments.
 useless_free_options =                         \
   --name=VIR_FREE                              \
+  --name=qemuCapsFree                          \
   --name=sexpr_free                            \
   --name=virBitmapFree                          \
   --name=virCPUDefFree                         \
index fbf426a6b606470d4feee84290fc07a579a2566b..477924d69c96fb7091739e464cc85af8a6ef0f54 100644 (file)
@@ -39,6 +39,7 @@
 #include <unistd.h>
 #include <sys/wait.h>
 #include <sys/utsname.h>
+#include <stdarg.h>
 
 #define VIR_FROM_THIS VIR_FROM_QEMU
 
@@ -377,7 +378,7 @@ error:
 
 int
 qemuCapsProbeCPUModels(const char *qemu,
-                       unsigned long long qemuCaps,
+                       virBitmapPtr qemuCaps,
                        const char *arch,
                        unsigned int *count,
                        const char ***cpus)
@@ -442,7 +443,7 @@ qemuCapsInitGuest(virCapsPtr caps,
     int nmachines = 0;
     struct stat st;
     unsigned int ncpus;
-    unsigned long long qemuCaps;
+    virBitmapPtr qemuCaps = NULL;
     int ret = -1;
 
     /* Check for existance of base emulator, or alternate base
@@ -553,7 +554,7 @@ qemuCapsInitGuest(virCapsPtr caps,
     guest->arch.defaultInfo.emulator_mtime = binary_mtime;
 
     if (caps->host.cpu &&
-        qemuCapsProbeCPUModels(binary, 0, info->arch, &ncpus, NULL) == 0 &&
+        qemuCapsProbeCPUModels(binary, NULL, info->arch, &ncpus, NULL) == 0 &&
         ncpus > 0 &&
         !virCapabilitiesAddGuestFeature(guest, "cpuselection", 1, 0))
         goto error;
@@ -648,6 +649,7 @@ cleanup:
         VIR_FREE(binary);
         VIR_FREE(kvmbin);
     }
+    qemuCapsFree(qemuCaps);
 
     return ret;
 
@@ -781,129 +783,129 @@ virCapsPtr qemuCapsInit(virCapsPtr old_caps)
 }
 
 
-static unsigned long long
+static void
 qemuCapsComputeCmdFlags(const char *help,
                         unsigned int version,
                         unsigned int is_kvm,
-                        unsigned int kvm_version)
+                        unsigned int kvm_version,
+                        virBitmapPtr flags)
 {
-    unsigned long long flags = 0;
     const char *p;
 
     if (strstr(help, "-no-kqemu"))
-        qemuCapsSet(&flags, QEMU_CAPS_KQEMU);
+        qemuCapsSet(flags, QEMU_CAPS_KQEMU);
     if (strstr(help, "-enable-kqemu"))
-        qemuCapsSet(&flags, QEMU_CAPS_ENABLE_KQEMU);
+        qemuCapsSet(flags, QEMU_CAPS_ENABLE_KQEMU);
     if (strstr(help, "-no-kvm"))
-        qemuCapsSet(&flags, QEMU_CAPS_KVM);
+        qemuCapsSet(flags, QEMU_CAPS_KVM);
     if (strstr(help, "-enable-kvm"))
-        qemuCapsSet(&flags, QEMU_CAPS_ENABLE_KVM);
+        qemuCapsSet(flags, QEMU_CAPS_ENABLE_KVM);
     if (strstr(help, "-no-reboot"))
-        qemuCapsSet(&flags, QEMU_CAPS_NO_REBOOT);
+        qemuCapsSet(flags, QEMU_CAPS_NO_REBOOT);
     if (strstr(help, "-name")) {
-        qemuCapsSet(&flags, QEMU_CAPS_NAME);
+        qemuCapsSet(flags, QEMU_CAPS_NAME);
         if (strstr(help, ",process="))
-            qemuCapsSet(&flags, QEMU_CAPS_NAME_PROCESS);
+            qemuCapsSet(flags, QEMU_CAPS_NAME_PROCESS);
     }
     if (strstr(help, "-uuid"))
-        qemuCapsSet(&flags, QEMU_CAPS_UUID);
+        qemuCapsSet(flags, QEMU_CAPS_UUID);
     if (strstr(help, "-xen-domid"))
-        qemuCapsSet(&flags, QEMU_CAPS_XEN_DOMID);
+        qemuCapsSet(flags, QEMU_CAPS_XEN_DOMID);
     else if (strstr(help, "-domid"))
-        qemuCapsSet(&flags, QEMU_CAPS_DOMID);
+        qemuCapsSet(flags, QEMU_CAPS_DOMID);
     if (strstr(help, "-drive")) {
-        qemuCapsSet(&flags, QEMU_CAPS_DRIVE);
+        qemuCapsSet(flags, QEMU_CAPS_DRIVE);
         if (strstr(help, "cache=") &&
             !strstr(help, "cache=on|off"))
-            qemuCapsSet(&flags, QEMU_CAPS_DRIVE_CACHE_V2);
+            qemuCapsSet(flags, QEMU_CAPS_DRIVE_CACHE_V2);
         if (strstr(help, "format="))
-            qemuCapsSet(&flags, QEMU_CAPS_DRIVE_FORMAT);
+            qemuCapsSet(flags, QEMU_CAPS_DRIVE_FORMAT);
         if (strstr(help, "readonly="))
-            qemuCapsSet(&flags, QEMU_CAPS_DRIVE_READONLY);
+            qemuCapsSet(flags, QEMU_CAPS_DRIVE_READONLY);
         if (strstr(help, "aio=threads|native"))
-            qemuCapsSet(&flags, QEMU_CAPS_DRIVE_AIO);
+            qemuCapsSet(flags, QEMU_CAPS_DRIVE_AIO);
     }
     if ((p = strstr(help, "-vga")) && !strstr(help, "-std-vga")) {
         const char *nl = strstr(p, "\n");
 
-        qemuCapsSet(&flags, QEMU_CAPS_VGA);
+        qemuCapsSet(flags, QEMU_CAPS_VGA);
 
         if (strstr(p, "|qxl"))
-            qemuCapsSet(&flags, QEMU_CAPS_VGA_QXL);
+            qemuCapsSet(flags, QEMU_CAPS_VGA_QXL);
         if ((p = strstr(p, "|none")) && p < nl)
-            qemuCapsSet(&flags, QEMU_CAPS_VGA_NONE);
+            qemuCapsSet(flags, QEMU_CAPS_VGA_NONE);
     }
     if (strstr(help, "-spice"))
-        qemuCapsSet(&flags, QEMU_CAPS_SPICE);
+        qemuCapsSet(flags, QEMU_CAPS_SPICE);
     if (strstr(help, "boot=on"))
-        qemuCapsSet(&flags, QEMU_CAPS_DRIVE_BOOT);
+        qemuCapsSet(flags, QEMU_CAPS_DRIVE_BOOT);
     if (strstr(help, "serial=s"))
-        qemuCapsSet(&flags, QEMU_CAPS_DRIVE_SERIAL);
+        qemuCapsSet(flags, QEMU_CAPS_DRIVE_SERIAL);
     if (strstr(help, "-pcidevice"))
-        qemuCapsSet(&flags, QEMU_CAPS_PCIDEVICE);
+        qemuCapsSet(flags, QEMU_CAPS_PCIDEVICE);
     if (strstr(help, "-mem-path"))
-        qemuCapsSet(&flags, QEMU_CAPS_MEM_PATH);
+        qemuCapsSet(flags, QEMU_CAPS_MEM_PATH);
     if (strstr(help, "-chardev")) {
-        qemuCapsSet(&flags, QEMU_CAPS_CHARDEV);
+        qemuCapsSet(flags, QEMU_CAPS_CHARDEV);
         if (strstr(help, "-chardev spicevmc"))
-            qemuCapsSet(&flags, QEMU_CAPS_CHARDEV_SPICEVMC);
+            qemuCapsSet(flags, QEMU_CAPS_CHARDEV_SPICEVMC);
     }
     if (strstr(help, "-balloon"))
-        qemuCapsSet(&flags, QEMU_CAPS_BALLOON);
+        qemuCapsSet(flags, QEMU_CAPS_BALLOON);
     if (strstr(help, "-device")) {
-        qemuCapsSet(&flags, QEMU_CAPS_DEVICE);
+        qemuCapsSet(flags, QEMU_CAPS_DEVICE);
         /*
          * When -device was introduced, qemu already supported drive's
          * readonly option but didn't advertise that.
          */
-        qemuCapsSet(&flags, QEMU_CAPS_DRIVE_READONLY);
+        qemuCapsSet(flags, QEMU_CAPS_DRIVE_READONLY);
     }
     if (strstr(help, "-nodefconfig"))
-        qemuCapsSet(&flags, QEMU_CAPS_NODEFCONFIG);
+        qemuCapsSet(flags, QEMU_CAPS_NODEFCONFIG);
     /* The trailing ' ' is important to avoid a bogus match */
     if (strstr(help, "-rtc "))
-        qemuCapsSet(&flags, QEMU_CAPS_RTC);
+        qemuCapsSet(flags, QEMU_CAPS_RTC);
     /* to wit */
     if (strstr(help, "-rtc-td-hack"))
-        qemuCapsSet(&flags, QEMU_CAPS_RTC_TD_HACK);
+        qemuCapsSet(flags, QEMU_CAPS_RTC_TD_HACK);
     if (strstr(help, "-no-hpet"))
-        qemuCapsSet(&flags, QEMU_CAPS_NO_HPET);
+        qemuCapsSet(flags, QEMU_CAPS_NO_HPET);
     if (strstr(help, "-no-kvm-pit-reinjection"))
-        qemuCapsSet(&flags, QEMU_CAPS_NO_KVM_PIT);
+        qemuCapsSet(flags, QEMU_CAPS_NO_KVM_PIT);
     if (strstr(help, "-tdf"))
-        qemuCapsSet(&flags, QEMU_CAPS_TDF);
+        qemuCapsSet(flags, QEMU_CAPS_TDF);
     if (strstr(help, "-enable-nesting"))
-        qemuCapsSet(&flags, QEMU_CAPS_NESTING);
+        qemuCapsSet(flags, QEMU_CAPS_NESTING);
     if (strstr(help, ",menu=on"))
-        qemuCapsSet(&flags, QEMU_CAPS_BOOT_MENU);
+        qemuCapsSet(flags, QEMU_CAPS_BOOT_MENU);
     if (strstr(help, "-fsdev"))
-        qemuCapsSet(&flags, QEMU_CAPS_FSDEV);
+        qemuCapsSet(flags, QEMU_CAPS_FSDEV);
     if (strstr(help, "-smbios type"))
-        qemuCapsSet(&flags, QEMU_CAPS_SMBIOS_TYPE);
+        qemuCapsSet(flags, QEMU_CAPS_SMBIOS_TYPE);
 
     if (strstr(help, "-netdev")) {
         /* Disable -netdev on 0.12 since although it exists,
          * the corresponding netdev_add/remove monitor commands
          * do not, and we need them to be able todo hotplug */
         if (version >= 13000)
-            qemuCapsSet(&flags, QEMU_CAPS_NETDEV);
+            qemuCapsSet(flags, QEMU_CAPS_NETDEV);
     }
 
     if (strstr(help, "-sdl"))
-        qemuCapsSet(&flags, QEMU_CAPS_SDL);
+        qemuCapsSet(flags, QEMU_CAPS_SDL);
     if (strstr(help, "cores=") &&
         strstr(help, "threads=") &&
         strstr(help, "sockets="))
-        qemuCapsSet(&flags, QEMU_CAPS_SMP_TOPOLOGY);
+        qemuCapsSet(flags, QEMU_CAPS_SMP_TOPOLOGY);
 
     if (version >= 9000)
-        qemuCapsSet(&flags, QEMU_CAPS_VNC_COLON);
+        qemuCapsSet(flags, QEMU_CAPS_VNC_COLON);
 
     if (is_kvm && (version >= 10000 || kvm_version >= 74))
-        qemuCapsSet(&flags, QEMU_CAPS_VNET_HDR);
+        qemuCapsSet(flags, QEMU_CAPS_VNET_HDR);
 
     if (is_kvm && strstr(help, ",vhost=")) {
-        qemuCapsSet(&flags, QEMU_CAPS_VNET_HOST);
+        qemuCapsSet(flags, QEMU_CAPS_VNET_HOST);
     }
 
     /*
@@ -919,22 +921,22 @@ qemuCapsComputeCmdFlags(const char *help,
      * while waiting for data, so pretend it doesn't exist
      */
     if (version >= 10000) {
-        qemuCapsSet(&flags, QEMU_CAPS_MIGRATE_QEMU_TCP);
-        qemuCapsSet(&flags, QEMU_CAPS_MIGRATE_QEMU_EXEC);
+        qemuCapsSet(flags, QEMU_CAPS_MIGRATE_QEMU_TCP);
+        qemuCapsSet(flags, QEMU_CAPS_MIGRATE_QEMU_EXEC);
         if (version >= 12000) {
-            qemuCapsSet(&flags, QEMU_CAPS_MIGRATE_QEMU_UNIX);
-            qemuCapsSet(&flags, QEMU_CAPS_MIGRATE_QEMU_FD);
+            qemuCapsSet(flags, QEMU_CAPS_MIGRATE_QEMU_UNIX);
+            qemuCapsSet(flags, QEMU_CAPS_MIGRATE_QEMU_FD);
         }
     } else if (kvm_version >= 79) {
-        qemuCapsSet(&flags, QEMU_CAPS_MIGRATE_QEMU_TCP);
+        qemuCapsSet(flags, QEMU_CAPS_MIGRATE_QEMU_TCP);
         if (kvm_version >= 80)
-            qemuCapsSet(&flags, QEMU_CAPS_MIGRATE_QEMU_EXEC);
+            qemuCapsSet(flags, QEMU_CAPS_MIGRATE_QEMU_EXEC);
     } else if (kvm_version > 0) {
-        qemuCapsSet(&flags, QEMU_CAPS_MIGRATE_KVM_STDIO);
+        qemuCapsSet(flags, QEMU_CAPS_MIGRATE_KVM_STDIO);
     }
 
     if (version >= 10000)
-        qemuCapsSet(&flags, QEMU_CAPS_0_10);
+        qemuCapsSet(flags, QEMU_CAPS_0_10);
 
     /* While JSON mode was available in 0.12.0, it was too
      * incomplete to contemplate using. The 0.13.0 release
@@ -943,9 +945,7 @@ qemuCapsComputeCmdFlags(const char *help,
      * the downside.
      */
      if (version >= 13000)
-        qemuCapsSet(&flags, QEMU_CAPS_MONITOR_JSON);
-
-    return flags;
+        qemuCapsSet(flags, QEMU_CAPS_MONITOR_JSON);
 }
 
 /* We parse the output of 'qemu -help' to get the QEMU
@@ -974,15 +974,16 @@ qemuCapsComputeCmdFlags(const char *help,
 
 int qemuCapsParseHelpStr(const char *qemu,
                          const char *help,
-                         unsigned long long *flags,
+                         virBitmapPtr flags,
                          unsigned int *version,
                          unsigned int *is_kvm,
                          unsigned int *kvm_version)
 {
     unsigned major, minor, micro;
     const char *p = help;
+    char *strflags;
 
-    *flags = *version = *is_kvm = *kvm_version = 0;
+    *version = *is_kvm = *kvm_version = 0;
 
     if (STRPREFIX(p, QEMU_VERSION_STR_1))
         p += strlen(QEMU_VERSION_STR_1);
@@ -1029,10 +1030,13 @@ int qemuCapsParseHelpStr(const char *qemu,
 
     *version = (major * 1000 * 1000) + (minor * 1000) + micro;
 
-    *flags = qemuCapsComputeCmdFlags(help, *version, *is_kvm, *kvm_version);
+    qemuCapsComputeCmdFlags(help, *version, *is_kvm, *kvm_version, flags);
+
+    strflags = virBitmapString(flags);
+    VIR_DEBUG("Version %u.%u.%u, cooked version %u, flags %s",
+              major, minor, micro, *version, NULLSTR(strflags));
+    VIR_FREE(strflags);
 
-    VIR_DEBUG("Version %u.%u.%u, cooked version %u, flags 0x%llx",
-              major, minor, micro, *version, *flags);
     if (*kvm_version)
         VIR_DEBUG("KVM version %d detected", *kvm_version);
     else if (*is_kvm)
@@ -1056,7 +1060,7 @@ fail:
 
 static int
 qemuCapsExtractDeviceStr(const char *qemu,
-                         unsigned long long *flags)
+                         virBitmapPtr flags)
 {
     char *output = NULL;
     virCommandPtr cmd;
@@ -1094,7 +1098,7 @@ cleanup:
 
 
 int
-qemuCapsParseDeviceStr(const char *str, unsigned long long *flags)
+qemuCapsParseDeviceStr(const char *str, virBitmapPtr flags)
 {
     /* Which devices exist. */
     if (strstr(str, "name \"hda-duplex\""))
@@ -1104,7 +1108,7 @@ qemuCapsParseDeviceStr(const char *str, unsigned long long *flags)
     if (strstr(str, "name \"ccid-card-passthru\""))
         qemuCapsSet(flags, QEMU_CAPS_CCID_PASSTHRU);
     /* Prefer -chardev spicevmc (detected earlier) over -device spicevmc */
-    if (!qemuCapsGet(*flags, QEMU_CAPS_CHARDEV_SPICEVMC) &&
+    if (!qemuCapsGet(flags, QEMU_CAPS_CHARDEV_SPICEVMC) &&
         strstr(str, "name \"spicevmc\""))
         qemuCapsSet(flags, QEMU_CAPS_DEVICE_SPICEVMC);
 
@@ -1124,16 +1128,16 @@ qemuCapsParseDeviceStr(const char *str, unsigned long long *flags)
 
 int qemuCapsExtractVersionInfo(const char *qemu, const char *arch,
                                unsigned int *retversion,
-                               unsigned long long *retflags)
+                               virBitmapPtr *retflags)
 {
     int ret = -1;
     unsigned int version, is_kvm, kvm_version;
-    unsigned long long flags = 0;
+    virBitmapPtr flags = NULL;
     char *help = NULL;
     virCommandPtr cmd;
 
     if (retflags)
-        *retflags = 0;
+        *retflags = NULL;
     if (retversion)
         *retversion = 0;
 
@@ -1154,33 +1158,37 @@ int qemuCapsExtractVersionInfo(const char *qemu, const char *arch,
     if (virCommandRun(cmd, NULL) < 0)
         goto cleanup;
 
-    if (qemuCapsParseHelpStr(qemu, help, &flags,
+    if (!(flags = qemuCapsNew()) ||
+        qemuCapsParseHelpStr(qemu, help, flags,
                              &version, &is_kvm, &kvm_version) == -1)
         goto cleanup;
 
     /* Currently only x86_64 and i686 support PCI-multibus. */
     if (STREQLEN(arch, "x86_64", 6) ||
         STREQLEN(arch, "i686", 4)) {
-        qemuCapsSet(&flags, QEMU_CAPS_PCI_MULTIBUS);
+        qemuCapsSet(flags, QEMU_CAPS_PCI_MULTIBUS);
     }
 
     /* qemuCapsExtractDeviceStr will only set additional flags if qemu
      * understands the 0.13.0+ notion of "-device driver,".  */
     if (qemuCapsGet(flags, QEMU_CAPS_DEVICE) &&
         strstr(help, "-device driver,?") &&
-        qemuCapsExtractDeviceStr(qemu, &flags) < 0)
+        qemuCapsExtractDeviceStr(qemu, flags) < 0)
         goto cleanup;
 
     if (retversion)
         *retversion = version;
-    if (retflags)
+    if (retflags) {
         *retflags = flags;
+        flags = NULL;
+    }
 
     ret = 0;
 
 cleanup:
     VIR_FREE(help);
     virCommandFree(cmd);
+    qemuCapsFree(flags);
 
     return ret;
 }
@@ -1233,25 +1241,55 @@ int qemuCapsExtractVersion(virCapsPtr caps,
 }
 
 
+virBitmapPtr
+qemuCapsNew(void)
+{
+    virBitmapPtr caps;
+
+    if (!(caps = virBitmapAlloc(QEMU_CAPS_LAST)))
+        virReportOOMError();
+
+    return caps;
+}
+
+
 void
-qemuCapsSet(unsigned long long *caps,
+qemuCapsSet(virBitmapPtr caps,
             enum qemuCapsFlags flag)
 {
-    *caps |= flag;
+    ignore_value(virBitmapSetBit(caps, flag));
+}
+
+
+void
+qemuCapsSetList(virBitmapPtr caps, ...)
+{
+    va_list list;
+    int flag;
+
+    va_start(list, caps);
+    while ((flag = va_arg(list, int)) < QEMU_CAPS_LAST)
+        ignore_value(virBitmapSetBit(caps, flag));
+    va_end(list);
 }
 
 
 void
-qemuCapsClear(unsigned long long *caps,
+qemuCapsClear(virBitmapPtr caps,
               enum qemuCapsFlags flag)
 {
-    *caps &= ~flag;
+    ignore_value(virBitmapClearBit(caps, flag));
 }
 
 
 bool
-qemuCapsGet(unsigned long long caps,
+qemuCapsGet(virBitmapPtr caps,
             enum qemuCapsFlags flag)
 {
-    return !!(caps & flag);
+    bool b;
+
+    if (!caps || virBitmapGetBit(caps, flag, &b) < 0)
+        return false;
+    else
+        return b;
 }
index d9eb78298ad1e34c888437989dc91996b63cd6b9..a61b088e52c05ca7e32938968aa9c70e05172dbe 100644 (file)
 #ifndef __QEMU_CAPABILITIES_H__
 # define __QEMU_CAPABILITIES_H__
 
+# include "bitmap.h"
 # include "capabilities.h"
 
 /* Internal flags to keep track of qemu command line capabilities */
 enum qemuCapsFlags {
-    QEMU_CAPS_KQEMU          = (1 << 0), /* Whether KQEMU is compiled in */
-    QEMU_CAPS_VNC_COLON      = (1 << 1), /* Does the VNC take just port, or address + display */
-    QEMU_CAPS_NO_REBOOT      = (1 << 2), /* Is the -no-reboot flag available */
-    QEMU_CAPS_DRIVE          = (1 << 3), /* Is the new -drive arg available */
-    QEMU_CAPS_DRIVE_BOOT     = (1 << 4), /* Does -drive support boot=on */
-    QEMU_CAPS_NAME           = (1 << 5), /* Is the -name flag available */
-    QEMU_CAPS_UUID           = (1 << 6), /* Is the -uuid flag available */
-    QEMU_CAPS_DOMID          = (1 << 7), /* Xenner only, special -domid flag available */
-    QEMU_CAPS_VNET_HDR        = (1 << 8),
-    QEMU_CAPS_MIGRATE_KVM_STDIO = (1 << 9),  /* Original migration code from KVM. Also had tcp, but we can't use that
-                                                   * since it had a design bug blocking the entire monitor console */
-    QEMU_CAPS_MIGRATE_QEMU_TCP  = (1 << 10), /* New migration syntax after merge to QEMU with TCP transport */
-    QEMU_CAPS_MIGRATE_QEMU_EXEC = (1 << 11), /* New migration syntax after merge to QEMU with EXEC transport */
-    QEMU_CAPS_DRIVE_CACHE_V2    = (1 << 12), /* Is the cache= flag wanting new v2 values */
-    QEMU_CAPS_KVM               = (1 << 13), /* Whether KVM is compiled in */
-    QEMU_CAPS_DRIVE_FORMAT      = (1 << 14), /* Is -drive format= avail */
-    QEMU_CAPS_VGA               = (1 << 15), /* Is -vga avail */
+    QEMU_CAPS_KQEMU             =  0, /* Whether KQEMU is compiled in */
+    QEMU_CAPS_VNC_COLON         =  1, /* Does the VNC take just port, or address + display */
+    QEMU_CAPS_NO_REBOOT         =  2, /* Is the -no-reboot flag available */
+    QEMU_CAPS_DRIVE             =  3, /* Is the new -drive arg available */
+    QEMU_CAPS_DRIVE_BOOT        =  4, /* Does -drive support boot=on */
+    QEMU_CAPS_NAME              =  5, /* Is the -name flag available */
+    QEMU_CAPS_UUID              =  6, /* Is the -uuid flag available */
+    QEMU_CAPS_DOMID             =  7, /* Xenner only, special -domid flag available */
+    QEMU_CAPS_VNET_HDR          =  8,
+    QEMU_CAPS_MIGRATE_KVM_STDIO =  9, /* Original migration code from KVM. Also had tcp, but we can't use that
+                                       * since it had a design bug blocking the entire monitor console */
+    QEMU_CAPS_MIGRATE_QEMU_TCP  = 10, /* New migration syntax after merge to QEMU with TCP transport */
+    QEMU_CAPS_MIGRATE_QEMU_EXEC = 11, /* New migration syntax after merge to QEMU with EXEC transport */
+    QEMU_CAPS_DRIVE_CACHE_V2    = 12, /* Is the cache= flag wanting new v2 values */
+    QEMU_CAPS_KVM               = 13, /* Whether KVM is compiled in */
+    QEMU_CAPS_DRIVE_FORMAT      = 14, /* Is -drive format= avail */
+    QEMU_CAPS_VGA               = 15, /* Is -vga avail */
 
     /* features added in qemu-0.10.0 or later */
-    QEMU_CAPS_0_10         = (1 << 16),
-    QEMU_CAPS_NET_NAME     = QEMU_CAPS_0_10, /* -net ...,name=str */
-    QEMU_CAPS_HOST_NET_ADD = QEMU_CAPS_0_10, /* host_net_add monitor command */
-
-    QEMU_CAPS_PCIDEVICE     = (1 << 17), /* PCI device assignment only supported by qemu-kvm */
-    QEMU_CAPS_MEM_PATH      = (1 << 18), /* mmap'ped guest backing supported */
-    QEMU_CAPS_DRIVE_SERIAL  = (1 << 19), /* -driver serial=  available */
-    QEMU_CAPS_XEN_DOMID     = (1 << 20), /* -xen-domid (new style xen integration) */
-    QEMU_CAPS_MIGRATE_QEMU_UNIX = (1 << 21), /* Does qemu support unix domain sockets for migration? */
-    QEMU_CAPS_CHARDEV       = (1 << 22), /* Is the new -chardev arg available */
-    QEMU_CAPS_ENABLE_KVM    = (1 << 23), /* Is the -enable-kvm flag available to "enable KVM full virtualization support" */
-    QEMU_CAPS_MONITOR_JSON  = (1 << 24), /* JSON mode for monitor */
-    QEMU_CAPS_BALLOON       = (1 << 25), /* -balloon available */
-    QEMU_CAPS_DEVICE        = (1 << 26), /* Is the new -device arg available */
-    QEMU_CAPS_SDL           = (1 << 27), /* Is the new -sdl arg available */
-    QEMU_CAPS_SMP_TOPOLOGY  = (1 << 28), /* Is sockets=s,cores=c,threads=t available for -smp? */
-    QEMU_CAPS_NETDEV        = (1 << 29), /* The -netdev flag & netdev_add/remove monitor commands */
-    QEMU_CAPS_RTC           = (1 << 30), /* The -rtc flag for clock options */
-    QEMU_CAPS_VNET_HOST     = (1LL << 31), /* vnet-host support is available in qemu */
-    QEMU_CAPS_RTC_TD_HACK   = (1LL << 32), /* -rtc-td-hack available */
-    QEMU_CAPS_NO_HPET       = (1LL << 33), /* -no-hpet flag is supported */
-    QEMU_CAPS_NO_KVM_PIT    = (1LL << 34), /* -no-kvm-pit-reinjection supported */
-    QEMU_CAPS_TDF           = (1LL << 35), /* -tdf flag (user-mode pit catchup) */
-    QEMU_CAPS_PCI_CONFIGFD  = (1LL << 36), /* pci-assign.configfd */
-    QEMU_CAPS_NODEFCONFIG   = (1LL << 37), /* -nodefconfig */
-    QEMU_CAPS_BOOT_MENU     = (1LL << 38), /* -boot menu=on support */
-    QEMU_CAPS_ENABLE_KQEMU  = (1LL << 39), /* -enable-kqemu flag */
-    QEMU_CAPS_FSDEV         = (1LL << 40), /* -fstype filesystem passthrough */
-    QEMU_CAPS_NESTING       = (1LL << 41), /* -enable-nesting (SVM/VMX) */
-    QEMU_CAPS_NAME_PROCESS  = (1LL << 42), /* Is -name process= available */
-    QEMU_CAPS_DRIVE_READONLY= (1LL << 43), /* -drive readonly=on|off */
-    QEMU_CAPS_SMBIOS_TYPE   = (1LL << 44), /* Is -smbios type= available */
-    QEMU_CAPS_VGA_QXL       = (1LL << 45), /* The 'qxl' arg for '-vga' */
-    QEMU_CAPS_SPICE         = (1LL << 46), /* Is -spice avail */
-    QEMU_CAPS_VGA_NONE      = (1LL << 47), /* The 'none' arg for '-vga' */
-    QEMU_CAPS_MIGRATE_QEMU_FD = (1LL << 48), /* -incoming fd:n */
-    QEMU_CAPS_BOOTINDEX     = (1LL << 49), /* -device bootindex property */
-    QEMU_CAPS_HDA_DUPLEX    = (1LL << 50), /* -device hda-duplex */
-    QEMU_CAPS_DRIVE_AIO     = (1LL << 51), /* -drive aio= supported */
-    QEMU_CAPS_PCI_MULTIBUS  = (1LL << 52), /* bus=pci.0 vs bus=pci */
-    QEMU_CAPS_PCI_BOOTINDEX = (1LL << 53), /* pci-assign.bootindex */
-    QEMU_CAPS_CCID_EMULATED = (1LL << 54), /* -device ccid-card-emulated */
-    QEMU_CAPS_CCID_PASSTHRU = (1LL << 55), /* -device ccid-card-passthru */
-    QEMU_CAPS_CHARDEV_SPICEVMC = (1LL << 56), /* newer -chardev spicevmc */
-    QEMU_CAPS_DEVICE_SPICEVMC = (1LL << 57), /* older -device spicevmc*/
-    QEMU_CAPS_VIRTIO_TX_ALG = (1LL << 58), /* -device virtio-net-pci,tx=string */
+    QEMU_CAPS_0_10              = 16,
+    QEMU_CAPS_NET_NAME          = QEMU_CAPS_0_10, /* -net ...,name=str */
+    QEMU_CAPS_HOST_NET_ADD      = QEMU_CAPS_0_10, /* host_net_add monitor command */
+
+    QEMU_CAPS_PCIDEVICE         = 17, /* PCI device assignment only supported by qemu-kvm */
+    QEMU_CAPS_MEM_PATH          = 18, /* mmap'ped guest backing supported */
+    QEMU_CAPS_DRIVE_SERIAL      = 19, /* -driver serial=  available */
+    QEMU_CAPS_XEN_DOMID         = 20, /* -xen-domid (new style xen integration) */
+    QEMU_CAPS_MIGRATE_QEMU_UNIX = 21, /* Does qemu support unix domain sockets for migration? */
+    QEMU_CAPS_CHARDEV           = 22, /* Is the new -chardev arg available */
+    QEMU_CAPS_ENABLE_KVM        = 23, /* Is the -enable-kvm flag available to "enable KVM full virtualization support" */
+    QEMU_CAPS_MONITOR_JSON      = 24, /* JSON mode for monitor */
+    QEMU_CAPS_BALLOON           = 25, /* -balloon available */
+    QEMU_CAPS_DEVICE            = 26, /* Is the new -device arg available */
+    QEMU_CAPS_SDL               = 27, /* Is the new -sdl arg available */
+    QEMU_CAPS_SMP_TOPOLOGY      = 28, /* Is sockets=s,cores=c,threads=t available for -smp? */
+    QEMU_CAPS_NETDEV            = 29, /* The -netdev flag & netdev_add/remove monitor commands */
+    QEMU_CAPS_RTC               = 30, /* The -rtc flag for clock options */
+    QEMU_CAPS_VNET_HOST         = 31, /* vnet-host support is available in qemu */
+    QEMU_CAPS_RTC_TD_HACK       = 32, /* -rtc-td-hack available */
+    QEMU_CAPS_NO_HPET           = 33, /* -no-hpet flag is supported */
+    QEMU_CAPS_NO_KVM_PIT        = 34, /* -no-kvm-pit-reinjection supported */
+    QEMU_CAPS_TDF               = 35, /* -tdf flag (user-mode pit catchup) */
+    QEMU_CAPS_PCI_CONFIGFD      = 36, /* pci-assign.configfd */
+    QEMU_CAPS_NODEFCONFIG       = 37, /* -nodefconfig */
+    QEMU_CAPS_BOOT_MENU         = 38, /* -boot menu=on support */
+    QEMU_CAPS_ENABLE_KQEMU      = 39, /* -enable-kqemu flag */
+    QEMU_CAPS_FSDEV             = 40, /* -fstype filesystem passthrough */
+    QEMU_CAPS_NESTING           = 41, /* -enable-nesting (SVM/VMX) */
+    QEMU_CAPS_NAME_PROCESS      = 42, /* Is -name process= available */
+    QEMU_CAPS_DRIVE_READONLY    = 43, /* -drive readonly=on|off */
+    QEMU_CAPS_SMBIOS_TYPE       = 44, /* Is -smbios type= available */
+    QEMU_CAPS_VGA_QXL           = 45, /* The 'qxl' arg for '-vga' */
+    QEMU_CAPS_SPICE             = 46, /* Is -spice avail */
+    QEMU_CAPS_VGA_NONE          = 47, /* The 'none' arg for '-vga' */
+    QEMU_CAPS_MIGRATE_QEMU_FD   = 48, /* -incoming fd:n */
+    QEMU_CAPS_BOOTINDEX         = 49, /* -device bootindex property */
+    QEMU_CAPS_HDA_DUPLEX        = 50, /* -device hda-duplex */
+    QEMU_CAPS_DRIVE_AIO         = 51, /* -drive aio= supported */
+    QEMU_CAPS_PCI_MULTIBUS      = 52, /* bus=pci.0 vs bus=pci */
+    QEMU_CAPS_PCI_BOOTINDEX     = 53, /* pci-assign.bootindex */
+    QEMU_CAPS_CCID_EMULATED     = 54, /* -device ccid-card-emulated */
+    QEMU_CAPS_CCID_PASSTHRU     = 55, /* -device ccid-card-passthru */
+    QEMU_CAPS_CHARDEV_SPICEVMC  = 56, /* newer -chardev spicevmc */
+    QEMU_CAPS_DEVICE_SPICEVMC   = 57, /* older -device spicevmc*/
+    QEMU_CAPS_VIRTIO_TX_ALG     = 58, /* -device virtio-net-pci,tx=string */
+
+    QEMU_CAPS_LAST,                   /* this must always be the last item */
 };
 
-void qemuCapsSet(unsigned long long *caps,
-                 enum qemuCapsFlags flag);
+virBitmapPtr qemuCapsNew(void);
+
+# define qemuCapsFree(caps)  virBitmapFree(caps)
+
+void qemuCapsSet(virBitmapPtr caps,
+                 enum qemuCapsFlags flag) ATTRIBUTE_NONNULL(1);
+
+void qemuCapsSetList(virBitmapPtr caps, ...) ATTRIBUTE_NONNULL(1);
 
-void qemuCapsClear(unsigned long long *caps,
-                   enum qemuCapsFlags flag);
+void qemuCapsClear(virBitmapPtr caps,
+                   enum qemuCapsFlags flag) ATTRIBUTE_NONNULL(1);
 
-bool qemuCapsGet(unsigned long long caps,
+bool qemuCapsGet(virBitmapPtr caps,
                  enum qemuCapsFlags flag);
 
 virCapsPtr qemuCapsInit(virCapsPtr old_caps);
@@ -111,7 +120,7 @@ int qemuCapsProbeMachineTypes(const char *binary,
                               int *nmachines);
 
 int qemuCapsProbeCPUModels(const char *qemu,
-                           unsigned long long qemuCaps,
+                           virBitmapPtr qemuCaps,
                            const char *arch,
                            unsigned int *count,
                            const char ***cpus);
@@ -120,16 +129,16 @@ int qemuCapsExtractVersion(virCapsPtr caps,
                            unsigned int *version);
 int qemuCapsExtractVersionInfo(const char *qemu, const char *arch,
                                unsigned int *version,
-                               unsigned long long *qemuCaps);
+                               virBitmapPtr *qemuCaps);
 
 int qemuCapsParseHelpStr(const char *qemu,
                          const char *str,
-                         unsigned long long *qemuCaps,
+                         virBitmapPtr qemuCaps,
                          unsigned int *version,
                          unsigned int *is_kvm,
                          unsigned int *kvm_version);
 int qemuCapsParseDeviceStr(const char *str,
-                           unsigned long long *qemuCaps);
+                           virBitmapPtr qemuCaps);
 
 
 #endif /* __QEMU_CAPABILITIES_H__*/
index 99e044a0b16a82b8cf12cc2f68cc7fc57fa54356..ddd218f308bf5a86aa9ff2aef1e9ea833b1f4a9a 100644 (file)
@@ -109,7 +109,7 @@ int
 qemuPhysIfaceConnect(virConnectPtr conn,
                      struct qemud_driver *driver,
                      virDomainNetDefPtr net,
-                     unsigned long long qemuCaps,
+                     virBitmapPtr qemuCaps,
                      const unsigned char *vmuuid,
                      enum virVMOperationType vmop)
 {
@@ -170,7 +170,7 @@ int
 qemuNetworkIfaceConnect(virConnectPtr conn,
                         struct qemud_driver *driver,
                         virDomainNetDefPtr net,
-                        unsigned long long qemuCaps)
+                        virBitmapPtr qemuCaps)
 {
     char *brname = NULL;
     int err;
@@ -305,7 +305,7 @@ cleanup:
 
 static int
 qemuOpenVhostNet(virDomainNetDefPtr net,
-                 unsigned long long qemuCaps,
+                 virBitmapPtr qemuCaps,
                  int *vhostfd)
 {
 
@@ -403,7 +403,7 @@ static int qemuAssignDeviceDiskAliasLegacy(virDomainDiskDefPtr disk)
 
 
 char *qemuDeviceDriveHostAlias(virDomainDiskDefPtr disk,
-                               unsigned long long qemuCaps)
+                               virBitmapPtr qemuCaps)
 {
     char *ret;
 
@@ -501,7 +501,7 @@ no_memory:
 
 
 int
-qemuAssignDeviceDiskAlias(virDomainDiskDefPtr def, unsigned long long qemuCaps)
+qemuAssignDeviceDiskAlias(virDomainDiskDefPtr def, virBitmapPtr qemuCaps)
 {
     if (qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE)) {
         if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
@@ -584,7 +584,7 @@ qemuAssignDeviceControllerAlias(virDomainControllerDefPtr controller)
 
 
 static int
-qemuAssignDeviceAliases(virDomainDefPtr def, unsigned long long qemuCaps)
+qemuAssignDeviceAliases(virDomainDefPtr def, virBitmapPtr qemuCaps)
 {
     int i;
 
@@ -720,7 +720,7 @@ int
 qemuDomainAssignPCIAddresses(virDomainDefPtr def)
 {
     int ret = -1;
-    unsigned long long qemuCaps = 0;
+    virBitmapPtr qemuCaps = NULL;
     qemuDomainPCIAddressSetPtr addrs = NULL;
 
     if (qemuCapsExtractVersionInfo(def->emulator, def->os.arch,
@@ -739,6 +739,7 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def)
     ret = 0;
 
 cleanup:
+    qemuCapsFree(qemuCaps);
     qemuDomainPCIAddressSetFree(addrs);
 
     return ret;
@@ -1126,7 +1127,7 @@ error:
 static int
 qemuBuildDeviceAddressStr(virBufferPtr buf,
                           virDomainDeviceInfoPtr info,
-                          unsigned long long qemuCaps)
+                          virBitmapPtr qemuCaps)
 {
     if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
         if (info->addr.pci.domain != 0) {
@@ -1180,7 +1181,7 @@ qemuSafeSerialParamValue(const char *value)
 char *
 qemuBuildDriveStr(virDomainDiskDefPtr disk,
                   int bootable,
-                  unsigned long long qemuCaps)
+                  virBitmapPtr qemuCaps)
 {
     virBuffer opt = VIR_BUFFER_INITIALIZER;
     const char *bus = virDomainDiskQEMUBusTypeToString(disk->bus);
@@ -1396,7 +1397,7 @@ error:
 
 char *
 qemuBuildDriveDevStr(virDomainDiskDefPtr disk,
-                     unsigned long long qemuCaps)
+                     virBitmapPtr qemuCaps)
 {
     virBuffer opt = VIR_BUFFER_INITIALIZER;
     const char *bus = virDomainDiskQEMUBusTypeToString(disk->bus);
@@ -1453,7 +1454,7 @@ error:
 
 
 char *qemuBuildFSStr(virDomainFSDefPtr fs,
-                     unsigned long long qemuCaps ATTRIBUTE_UNUSED)
+                     virBitmapPtr qemuCaps ATTRIBUTE_UNUSED)
 {
     virBuffer opt = VIR_BUFFER_INITIALIZER;
 
@@ -1489,7 +1490,7 @@ error:
 
 char *
 qemuBuildFSDevStr(virDomainFSDefPtr fs,
-                  unsigned long long qemuCaps)
+                  virBitmapPtr qemuCaps)
 {
     virBuffer opt = VIR_BUFFER_INITIALIZER;
 
@@ -1520,7 +1521,7 @@ error:
 
 char *
 qemuBuildControllerDevStr(virDomainControllerDefPtr def,
-                          unsigned long long qemuCaps)
+                          virBitmapPtr qemuCaps)
 {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
 
@@ -1605,7 +1606,7 @@ qemuBuildNicStr(virDomainNetDefPtr net,
 char *
 qemuBuildNicDevStr(virDomainNetDefPtr net,
                    int vlan,
-                   unsigned long long qemuCaps)
+                   virBitmapPtr qemuCaps)
 {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
     const char *nic;
@@ -1777,7 +1778,7 @@ qemuBuildHostNetStr(virDomainNetDefPtr net,
 
 char *
 qemuBuildWatchdogDevStr(virDomainWatchdogDefPtr dev,
-                        unsigned long long qemuCaps)
+                        virBitmapPtr qemuCaps)
 {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
 
@@ -1808,7 +1809,7 @@ error:
 
 char *
 qemuBuildMemballoonDevStr(virDomainMemballoonDefPtr dev,
-                          unsigned long long qemuCaps)
+                          virBitmapPtr qemuCaps)
 {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
 
@@ -1855,7 +1856,7 @@ error:
 
 char *
 qemuBuildSoundDevStr(virDomainSoundDefPtr sound,
-                     unsigned long long qemuCaps)
+                     virBitmapPtr qemuCaps)
 {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
     const char *model = virDomainSoundModelTypeToString(sound->model);
@@ -1917,7 +1918,7 @@ error:
 
 static char *
 qemuBuildVideoDevStr(virDomainVideoDefPtr video,
-                     unsigned long long qemuCaps)
+                     virBitmapPtr qemuCaps)
 {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
     const char *model = qemuVideoTypeToString(video->type);
@@ -1973,7 +1974,7 @@ qemuOpenPCIConfig(virDomainHostdevDefPtr dev)
 
 char *
 qemuBuildPCIHostdevDevStr(virDomainHostdevDefPtr dev, const char *configfd,
-                          unsigned long long qemuCaps)
+                          virBitmapPtr qemuCaps)
 {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
 
@@ -2066,7 +2067,7 @@ qemuBuildUSBHostdevUsbDevStr(virDomainHostdevDefPtr dev)
  * host side of the character device */
 static char *
 qemuBuildChrChardevStr(virDomainChrSourceDefPtr dev, const char *alias,
-                       unsigned long long qemuCaps)
+                       virBitmapPtr qemuCaps)
 {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
     bool telnet;
@@ -2244,7 +2245,7 @@ error:
 
 static char *
 qemuBuildVirtioSerialPortDevStr(virDomainChrDefPtr dev,
-                                unsigned long long qemuCaps)
+                                virBitmapPtr qemuCaps)
 {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
     if (dev->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE)
@@ -2482,7 +2483,7 @@ static int
 qemuBuildCpuArgStr(const struct qemud_driver *driver,
                    const virDomainDefPtr def,
                    const char *emulator,
-                   unsigned long long qemuCaps,
+                   virBitmapPtr qemuCaps,
                    const struct utsname *ut,
                    char **opt,
                    bool *hasHwVirt)
@@ -2607,7 +2608,7 @@ no_memory:
 
 static char *
 qemuBuildSmpArgStr(const virDomainDefPtr def,
-                   unsigned long long qemuCaps)
+                   virBitmapPtr qemuCaps)
 {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
 
@@ -2660,7 +2661,7 @@ qemuBuildCommandLine(virConnectPtr conn,
                      virDomainDefPtr def,
                      virDomainChrSourceDefPtr monitor_chr,
                      bool monitor_json,
-                     unsigned long long qemuCaps,
+                     virBitmapPtr qemuCaps,
                      const char *migrateFrom,
                      int migrateFd,
                      virDomainSnapshotObjPtr current_snapshot,
@@ -2698,7 +2699,7 @@ qemuBuildCommandLine(virConnectPtr conn,
      */
     if (qemuCapsGet(qemuCaps, QEMU_CAPS_KVM) &&
         (def->virtType == VIR_DOMAIN_VIRT_QEMU))
-        qemuCapsClear(&qemuCaps, QEMU_CAPS_DRIVE_BOOT);
+        qemuCapsClear(qemuCaps, QEMU_CAPS_DRIVE_BOOT);
 
     switch (def->virtType) {
     case VIR_DOMAIN_VIRT_QEMU:
@@ -3241,13 +3242,13 @@ qemuBuildCommandLine(virConnectPtr conn,
                 if (disk->bus != VIR_DOMAIN_DISK_BUS_XEN) {
                     withDeviceArg = 1;
                 } else {
-                    qemuCapsClear(&qemuCaps, QEMU_CAPS_DEVICE);
+                    qemuCapsClear(qemuCaps, QEMU_CAPS_DEVICE);
                     deviceFlagMasked = true;
                 }
             }
             optstr = qemuBuildDriveStr(disk, bootable, qemuCaps);
             if (deviceFlagMasked)
-                qemuCapsSet(&qemuCaps, QEMU_CAPS_DEVICE);
+                qemuCapsSet(qemuCaps, QEMU_CAPS_DEVICE);
             if (!optstr)
                 goto error;
             virCommandAddArg(cmd, optstr);
index 332d5a3e8f3dd14251ef556e482c7c0b7f163d5c..1902472b81eb3ff886278a34bf696644b5bc34c8 100644 (file)
@@ -46,7 +46,7 @@ virCommandPtr qemuBuildCommandLine(virConnectPtr conn,
                                    virDomainDefPtr def,
                                    virDomainChrSourceDefPtr monitor_chr,
                                    bool monitor_json,
-                                   unsigned long long qemuCaps,
+                                   virBitmapPtr qemuCaps,
                                    const char *migrateFrom,
                                    int migrateFd,
                                    virDomainSnapshotObjPtr current_snapshot,
@@ -68,44 +68,44 @@ char * qemuBuildNicStr(virDomainNetDefPtr net,
 /* Current, best practice */
 char * qemuBuildNicDevStr(virDomainNetDefPtr net,
                           int vlan,
-                          unsigned long long qemuCaps);
+                          virBitmapPtr qemuCaps);
 
 char *qemuDeviceDriveHostAlias(virDomainDiskDefPtr disk,
-                               unsigned long long qemuCaps);
+                               virBitmapPtr qemuCaps);
 
 /* Both legacy & current support */
 char *qemuBuildDriveStr(virDomainDiskDefPtr disk,
                         int bootable,
-                        unsigned long long qemuCaps);
+                        virBitmapPtr qemuCaps);
 char *qemuBuildFSStr(virDomainFSDefPtr fs,
-                     unsigned long long qemuCaps);
+                     virBitmapPtr qemuCaps);
 
 /* Current, best practice */
 char * qemuBuildDriveDevStr(virDomainDiskDefPtr disk,
-                            unsigned long long qemuCaps);
+                            virBitmapPtr qemuCaps);
 char * qemuBuildFSDevStr(virDomainFSDefPtr fs,
-                         unsigned long long qemuCaps);
+                         virBitmapPtr qemuCaps);
 /* Current, best practice */
 char * qemuBuildControllerDevStr(virDomainControllerDefPtr def,
-                                 unsigned long long qemuCaps);
+                                 virBitmapPtr qemuCaps);
 
 char * qemuBuildWatchdogDevStr(virDomainWatchdogDefPtr dev,
-                               unsigned long long qemuCaps);
+                               virBitmapPtr qemuCaps);
 
 char * qemuBuildMemballoonDevStr(virDomainMemballoonDefPtr dev,
-                                 unsigned long long qemuCaps);
+                                 virBitmapPtr qemuCaps);
 
 char * qemuBuildUSBInputDevStr(virDomainInputDefPtr dev);
 
 char * qemuBuildSoundDevStr(virDomainSoundDefPtr sound,
-                            unsigned long long qemuCaps);
+                            virBitmapPtr qemuCaps);
 
 /* Legacy, pre device support */
 char * qemuBuildPCIHostdevPCIDevStr(virDomainHostdevDefPtr dev);
 /* Current, best practice */
 char * qemuBuildPCIHostdevDevStr(virDomainHostdevDefPtr dev,
                                  const char *configfd,
-                                 unsigned long long qemuCaps);
+                                 virBitmapPtr qemuCaps);
 
 int qemuOpenPCIConfig(virDomainHostdevDefPtr dev);
 
@@ -119,13 +119,13 @@ char * qemuBuildUSBHostdevDevStr(virDomainHostdevDefPtr dev);
 int qemuNetworkIfaceConnect(virConnectPtr conn,
                             struct qemud_driver *driver,
                             virDomainNetDefPtr net,
-                            unsigned long long qemCmdFlags)
+                            virBitmapPtr qemuCaps)
     ATTRIBUTE_NONNULL(1);
 
 int qemuPhysIfaceConnect(virConnectPtr conn,
                          struct qemud_driver *driver,
                          virDomainNetDefPtr net,
-                         unsigned long long qemuCaps,
+                         virBitmapPtr qemuCaps,
                          const unsigned char *vmuuid,
                          enum virVMOperationType vmop);
 
@@ -156,7 +156,7 @@ int  qemuAssignDevicePCISlots(virDomainDefPtr def, qemuDomainPCIAddressSetPtr ad
 
 int qemuDomainNetVLAN(virDomainNetDefPtr def);
 int qemuAssignDeviceNetAlias(virDomainDefPtr def, virDomainNetDefPtr net, int idx);
-int qemuAssignDeviceDiskAlias(virDomainDiskDefPtr def, unsigned long long qemuCaps);
+int qemuAssignDeviceDiskAlias(virDomainDiskDefPtr def, virBitmapPtr qemuCaps);
 int qemuAssignDeviceHostdevAlias(virDomainDefPtr def, virDomainHostdevDefPtr net, int idx);
 int qemuAssignDeviceControllerAlias(virDomainControllerDefPtr controller);
 
index 83f7583d945b6118fbd9ae0b3d5ca698e553e8f5..c58c20e118b3a1493cc614c6b3073cdc62460edb 100644 (file)
@@ -3538,7 +3538,7 @@ static char *qemuDomainXMLToNative(virConnectPtr conn,
     struct qemud_driver *driver = conn->privateData;
     virDomainDefPtr def = NULL;
     virDomainChrSourceDef monConfig;
-    unsigned long long qemuCaps;
+    virBitmapPtr qemuCaps = NULL;
     virCommandPtr cmd = NULL;
     char *ret = NULL;
     int i;
@@ -3611,6 +3611,7 @@ static char *qemuDomainXMLToNative(virConnectPtr conn,
 cleanup:
     qemuDriverUnlock(driver);
 
+    qemuCapsFree(qemuCaps);
     virCommandFree(cmd);
     virDomainDefFree(def);
     return ret;
@@ -3947,7 +3948,7 @@ static int qemudDomainAttachDevice(virDomainPtr dom,
     struct qemud_driver *driver = dom->conn->privateData;
     virDomainObjPtr vm;
     virDomainDeviceDefPtr dev = NULL;
-    unsigned long long qemuCaps;
+    virBitmapPtr qemuCaps = NULL;
     virCgroupPtr cgroup = NULL;
     int ret = -1;
 
@@ -4078,6 +4079,7 @@ cleanup:
     if (cgroup)
         virCgroupFree(&cgroup);
 
+    qemuCapsFree(qemuCaps);
     virDomainDeviceDefFree(dev);
     if (vm)
         virDomainObjUnlock(vm);
@@ -4105,7 +4107,7 @@ static int qemuDomainUpdateDeviceFlags(virDomainPtr dom,
     struct qemud_driver *driver = dom->conn->privateData;
     virDomainObjPtr vm;
     virDomainDeviceDefPtr dev = NULL;
-    unsigned long long qemuCaps;
+    virBitmapPtr qemuCaps = NULL;
     virCgroupPtr cgroup = NULL;
     int ret = -1;
     bool force = (flags & VIR_DOMAIN_DEVICE_MODIFY_FORCE) != 0;
@@ -4211,6 +4213,7 @@ cleanup:
     if (cgroup)
         virCgroupFree(&cgroup);
 
+    qemuCapsFree(qemuCaps);
     virDomainDeviceDefFree(dev);
     if (vm)
         virDomainObjUnlock(vm);
@@ -4223,7 +4226,7 @@ static int qemudDomainDetachDevice(virDomainPtr dom,
                                    const char *xml) {
     struct qemud_driver *driver = dom->conn->privateData;
     virDomainObjPtr vm;
-    unsigned long long qemuCaps;
+    virBitmapPtr qemuCaps = NULL;
     virDomainDeviceDefPtr dev = NULL;
     int ret = -1;
 
@@ -4296,6 +4299,7 @@ endjob:
         vm = NULL;
 
 cleanup:
+    qemuCapsFree(qemuCaps);
     virDomainDeviceDefFree(dev);
     if (vm)
         virDomainObjUnlock(vm);
index 31f0ebb7a9ca0038fc15d160f4480337bd9576c4..0002af06bc3971dac4a3d56057f24a774dd73ee3 100644 (file)
@@ -44,7 +44,7 @@
 int qemuDomainChangeEjectableMedia(struct qemud_driver *driver,
                                    virDomainObjPtr vm,
                                    virDomainDiskDefPtr disk,
-                                   unsigned long long qemuCaps,
+                                   virBitmapPtr qemuCaps,
                                    bool force)
 {
     virDomainDiskDefPtr origdisk = NULL;
@@ -140,7 +140,7 @@ error:
 int qemuDomainAttachPciDiskDevice(struct qemud_driver *driver,
                                   virDomainObjPtr vm,
                                   virDomainDiskDefPtr disk,
-                                  unsigned long long qemuCaps)
+                                  virBitmapPtr qemuCaps)
 {
     int i, ret;
     const char* type = virDomainDiskBusTypeToString(disk->bus);
@@ -235,7 +235,7 @@ error:
 int qemuDomainAttachPciControllerDevice(struct qemud_driver *driver,
                                         virDomainObjPtr vm,
                                         virDomainControllerDefPtr controller,
-                                        unsigned long long qemuCaps)
+                                        virBitmapPtr qemuCaps)
 {
     int i;
     int ret = -1;
@@ -300,7 +300,7 @@ static virDomainControllerDefPtr
 qemuDomainFindOrCreateSCSIDiskController(struct qemud_driver *driver,
                                          virDomainObjPtr vm,
                                          int controller,
-                                         unsigned long long qemuCaps)
+                                         virBitmapPtr qemuCaps)
 {
     int i;
     virDomainControllerDefPtr cont;
@@ -346,7 +346,7 @@ qemuDomainFindOrCreateSCSIDiskController(struct qemud_driver *driver,
 int qemuDomainAttachSCSIDisk(struct qemud_driver *driver,
                              virDomainObjPtr vm,
                              virDomainDiskDefPtr disk,
-                             unsigned long long qemuCaps)
+                             virBitmapPtr qemuCaps)
 {
     int i;
     qemuDomainObjPrivatePtr priv = vm->privateData;
@@ -462,7 +462,7 @@ error:
 int qemuDomainAttachUsbMassstorageDevice(struct qemud_driver *driver,
                                          virDomainObjPtr vm,
                                          virDomainDiskDefPtr disk,
-                                         unsigned long long qemuCaps)
+                                         virBitmapPtr qemuCaps)
 {
     qemuDomainObjPrivatePtr priv = vm->privateData;
     int i, ret;
@@ -547,7 +547,7 @@ int qemuDomainAttachNetDevice(virConnectPtr conn,
                               struct qemud_driver *driver,
                               virDomainObjPtr vm,
                               virDomainNetDefPtr net,
-                              unsigned long long qemuCaps)
+                              virBitmapPtr qemuCaps)
 {
     qemuDomainObjPrivatePtr priv = vm->privateData;
     char *tapfd_name = NULL;
@@ -777,7 +777,7 @@ no_memory:
 int qemuDomainAttachHostPciDevice(struct qemud_driver *driver,
                                   virDomainObjPtr vm,
                                   virDomainHostdevDefPtr hostdev,
-                                  unsigned long long qemuCaps)
+                                  virBitmapPtr qemuCaps)
 {
     qemuDomainObjPrivatePtr priv = vm->privateData;
     int ret;
@@ -872,7 +872,7 @@ error:
 int qemuDomainAttachHostUsbDevice(struct qemud_driver *driver,
                                   virDomainObjPtr vm,
                                   virDomainHostdevDefPtr hostdev,
-                                  unsigned long long qemuCaps)
+                                  virBitmapPtr qemuCaps)
 {
     int ret;
     qemuDomainObjPrivatePtr priv = vm->privateData;
@@ -935,7 +935,7 @@ error:
 int qemuDomainAttachHostDevice(struct qemud_driver *driver,
                                virDomainObjPtr vm,
                                virDomainHostdevDefPtr hostdev,
-                               unsigned long long qemuCaps)
+                               virBitmapPtr qemuCaps)
 {
     if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) {
         qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
@@ -1130,7 +1130,7 @@ static inline int qemuFindDisk(virDomainDefPtr def, const char *dst)
 int qemuDomainDetachPciDiskDevice(struct qemud_driver *driver,
                                   virDomainObjPtr vm,
                                   virDomainDeviceDefPtr dev,
-                                  unsigned long long qemuCaps)
+                                  virBitmapPtr qemuCaps)
 {
     int i, ret = -1;
     virDomainDiskDefPtr detach = NULL;
@@ -1221,7 +1221,7 @@ cleanup:
 int qemuDomainDetachSCSIDiskDevice(struct qemud_driver *driver,
                                    virDomainObjPtr vm,
                                    virDomainDeviceDefPtr dev,
-                                   unsigned long long qemuCaps)
+                                   virBitmapPtr qemuCaps)
 {
     int i, ret = -1;
     virDomainDiskDefPtr detach = NULL;
@@ -1350,7 +1350,7 @@ static bool qemuDomainControllerIsBusy(virDomainObjPtr vm,
 int qemuDomainDetachPciControllerDevice(struct qemud_driver *driver,
                                         virDomainObjPtr vm,
                                         virDomainDeviceDefPtr dev,
-                                        unsigned long long qemuCaps)
+                                        virBitmapPtr qemuCaps)
 {
     int i, ret = -1;
     virDomainControllerDefPtr detach = NULL;
@@ -1434,7 +1434,7 @@ cleanup:
 int qemuDomainDetachNetDevice(struct qemud_driver *driver,
                               virDomainObjPtr vm,
                               virDomainDeviceDefPtr dev,
-                              unsigned long long qemuCaps)
+                              virBitmapPtr qemuCaps)
 {
     int i, ret = -1;
     virDomainNetDefPtr detach = NULL;
@@ -1561,7 +1561,7 @@ cleanup:
 int qemuDomainDetachHostPciDevice(struct qemud_driver *driver,
                                   virDomainObjPtr vm,
                                   virDomainDeviceDefPtr dev,
-                                  unsigned long long qemuCaps)
+                                  virBitmapPtr qemuCaps)
 {
     virDomainHostdevDefPtr detach = NULL;
     qemuDomainObjPrivatePtr priv = vm->privateData;
@@ -1661,7 +1661,7 @@ int qemuDomainDetachHostPciDevice(struct qemud_driver *driver,
 int qemuDomainDetachHostUsbDevice(struct qemud_driver *driver,
                                   virDomainObjPtr vm,
                                   virDomainDeviceDefPtr dev,
-                                  unsigned long long qemuCaps)
+                                  virBitmapPtr qemuCaps)
 {
     virDomainHostdevDefPtr detach = NULL;
     qemuDomainObjPrivatePtr priv = vm->privateData;
@@ -1743,7 +1743,7 @@ int qemuDomainDetachHostUsbDevice(struct qemud_driver *driver,
 int qemuDomainDetachHostDevice(struct qemud_driver *driver,
                                virDomainObjPtr vm,
                                virDomainDeviceDefPtr dev,
-                               unsigned long long qemuCaps)
+                               virBitmapPtr qemuCaps)
 {
     virDomainHostdevDefPtr hostdev = dev->data.hostdev;
     int ret;
index a5eadd3469d87131e7b908ead57e2493c3470b69..984c3b8795dce214879caa22defa9664cec70046 100644 (file)
 int qemuDomainChangeEjectableMedia(struct qemud_driver *driver,
                                    virDomainObjPtr vm,
                                    virDomainDiskDefPtr disk,
-                                   unsigned long long qemuCaps,
+                                   virBitmapPtr qemuCaps,
                                    bool force);
 int qemuDomainAttachPciDiskDevice(struct qemud_driver *driver,
                                   virDomainObjPtr vm,
                                   virDomainDiskDefPtr disk,
-                                  unsigned long long qemuCaps);
+                                  virBitmapPtr qemuCaps);
 int qemuDomainAttachPciControllerDevice(struct qemud_driver *driver,
                                         virDomainObjPtr vm,
                                         virDomainControllerDefPtr controller,
-                                        unsigned long long qemuCaps);
+                                        virBitmapPtr qemuCaps);
 int qemuDomainAttachSCSIDisk(struct qemud_driver *driver,
                              virDomainObjPtr vm,
                              virDomainDiskDefPtr disk,
-                             unsigned long long qemuCaps);
+                             virBitmapPtr qemuCaps);
 int qemuDomainAttachUsbMassstorageDevice(struct qemud_driver *driver,
                                          virDomainObjPtr vm,
                                          virDomainDiskDefPtr disk,
-                                         unsigned long long qemuCaps);
+                                         virBitmapPtr qemuCaps);
 int qemuDomainAttachNetDevice(virConnectPtr conn,
                               struct qemud_driver *driver,
                               virDomainObjPtr vm,
                               virDomainNetDefPtr net,
-                              unsigned long long qemuCaps);
+                              virBitmapPtr qemuCaps);
 int qemuDomainAttachHostPciDevice(struct qemud_driver *driver,
                                   virDomainObjPtr vm,
                                   virDomainHostdevDefPtr hostdev,
-                                  unsigned long long qemuCaps);
+                                  virBitmapPtr qemuCaps);
 int qemuDomainAttachHostUsbDevice(struct qemud_driver *driver,
                                   virDomainObjPtr vm,
                                   virDomainHostdevDefPtr hostdev,
-                                  unsigned long long qemuCaps);
+                                  virBitmapPtr qemuCaps);
 int qemuDomainAttachHostDevice(struct qemud_driver *driver,
                                virDomainObjPtr vm,
                                virDomainHostdevDefPtr hostdev,
-                               unsigned long long qemuCaps);
+                               virBitmapPtr qemuCaps);
 int qemuDomainChangeGraphics(struct qemud_driver *driver,
                              virDomainObjPtr vm,
                              virDomainGraphicsDefPtr dev);
@@ -78,31 +78,31 @@ int qemuDomainChangeGraphicsPasswords(struct qemud_driver *driver,
 int qemuDomainDetachPciDiskDevice(struct qemud_driver *driver,
                                   virDomainObjPtr vm,
                                   virDomainDeviceDefPtr dev,
-                                  unsigned long long qemuCaps);
+                                  virBitmapPtr qemuCaps);
 int qemuDomainDetachSCSIDiskDevice(struct qemud_driver *driver,
                                    virDomainObjPtr vm,
                                    virDomainDeviceDefPtr dev,
-                                   unsigned long long qemuCaps);
+                                   virBitmapPtr qemuCaps);
 int qemuDomainDetachPciControllerDevice(struct qemud_driver *driver,
                                         virDomainObjPtr vm,
                                         virDomainDeviceDefPtr dev,
-                                        unsigned long long qemuCaps);
+                                        virBitmapPtr qemuCaps);
 int qemuDomainDetachNetDevice(struct qemud_driver *driver,
                               virDomainObjPtr vm,
                               virDomainDeviceDefPtr dev,
-                              unsigned long long qemuCaps);
+                              virBitmapPtr qemuCaps);
 int qemuDomainDetachHostPciDevice(struct qemud_driver *driver,
                                   virDomainObjPtr vm,
                                   virDomainDeviceDefPtr dev,
-                                  unsigned long long qemuCaps);
+                                  virBitmapPtr qemuCaps);
 int qemuDomainDetachHostUsbDevice(struct qemud_driver *driver,
                                   virDomainObjPtr vm,
                                   virDomainDeviceDefPtr dev,
-                                  unsigned long long qemuCaps);
+                                  virBitmapPtr qemuCaps);
 int qemuDomainDetachHostDevice(struct qemud_driver *driver,
                                virDomainObjPtr vm,
                                virDomainDeviceDefPtr dev,
-                               unsigned long long qemuCaps);
+                               virBitmapPtr qemuCaps);
 
 
 #endif /* __QEMU_HOTPLUG_H__ */
index 3a52bce175da70f7cf0117916cca727189645a1d..822cb18aca2050269a46674554ee268d88f7bbfa 100644 (file)
@@ -244,7 +244,7 @@ qemuMigrationPrepareTunnel(struct qemud_driver *driver,
     int ret = -1;
     int internalret;
     char *unixfile = NULL;
-    unsigned long long qemuCaps;
+    virBitmapPtr qemuCaps = NULL;
     qemuDomainObjPrivatePtr priv = NULL;
     struct timeval now;
 
@@ -376,6 +376,7 @@ endjob:
     }
 
 cleanup:
+    qemuCapsFree(qemuCaps);
     virDomainDefFree(def);
     if (unixfile)
         unlink(unixfile);
@@ -708,7 +709,7 @@ static int doTunnelMigrate(struct qemud_driver *driver,
     virStreamPtr st = NULL;
     char *unixfile = NULL;
     int internalret;
-    unsigned long long qemuCaps;
+    virBitmapPtr qemuCaps = NULL;
     int status;
     unsigned long long transferred, remaining, total;
     unsigned int background_flags = QEMU_MONITOR_MIGRATE_BACKGROUND;
@@ -894,6 +895,7 @@ finish:
 cleanup:
     VIR_FORCE_CLOSE(client_sock);
     VIR_FORCE_CLOSE(qemu_sock);
+    qemuCapsFree(qemuCaps);
 
     if (ddomain)
         virUnrefDomain(ddomain);
index 12e55950d17f4413eac02e4afcb707e784fcf018..7879165455e75c9177661e78b8cad2cfc1628ef4 100644 (file)
@@ -1137,7 +1137,7 @@ static int
 qemuProcessInitPasswords(virConnectPtr conn,
                          struct qemud_driver *driver,
                          virDomainObjPtr vm,
-                         unsigned long long qemuCaps)
+                         virBitmapPtr qemuCaps)
 {
     int ret = 0;
     qemuDomainObjPrivatePtr priv = vm->privateData;
@@ -1789,7 +1789,7 @@ qemuProcessReconnect(void *payload, const char *name ATTRIBUTE_UNUSED, void *opa
     struct qemuProcessReconnectData *data = opaque;
     struct qemud_driver *driver = data->driver;
     qemuDomainObjPrivatePtr priv;
-    unsigned long long qemuCaps;
+    virBitmapPtr qemuCaps = NULL;
     virConnectPtr conn = data->conn;
 
     virDomainObjLock(obj);
@@ -1835,9 +1835,12 @@ qemuProcessReconnect(void *payload, const char *name ATTRIBUTE_UNUSED, void *opa
 
     if (virDomainObjUnref(obj) > 0)
         virDomainObjUnlock(obj);
+
+    qemuCapsFree(qemuCaps);
     return;
 
 error:
+    qemuCapsFree(qemuCaps);
     if (!virDomainObjIsActive(obj)) {
         if (virDomainObjUnref(obj) > 0)
             virDomainObjUnlock(obj);
@@ -1879,7 +1882,7 @@ int qemuProcessStart(virConnectPtr conn,
                      enum virVMOperationType vmop)
 {
     int ret;
-    unsigned long long qemuCaps;
+    virBitmapPtr qemuCaps = NULL;
     off_t pos = -1;
     char ebuf[1024];
     char *pidfile = NULL;
@@ -2220,6 +2223,7 @@ int qemuProcessStart(virConnectPtr conn,
     if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0)
         goto cleanup;
 
+    qemuCapsFree(qemuCaps);
     virCommandFree(cmd);
     VIR_FORCE_CLOSE(logfile);
 
@@ -2229,6 +2233,7 @@ cleanup:
     /* We jump here if we failed to start the VM for any reason, or
      * if we failed to initialize the now running VM. kill it off and
      * pretend we never started it */
+    qemuCapsFree(qemuCaps);
     virCommandFree(cmd);
     VIR_FORCE_CLOSE(logfile);
     qemuProcessStop(driver, vm, 0);
index 75ecf58de13b1b170f39b30b05a3ffef981f2101..335364f2042ceeb1c9ff9ef56d4df4e9a813ed01 100644 (file)
@@ -13,7 +13,7 @@
 
 struct testInfo {
     const char *name;
-    unsigned long long flags;
+    virBitmapPtr flags;
     unsigned int version;
     unsigned int is_kvm;
     unsigned int kvm_version;
@@ -22,14 +22,14 @@ struct testInfo {
 static char *progname;
 static char *abs_srcdir;
 
-static void printMismatchedFlags(unsigned long long got,
-                                 unsigned long long expect)
+static void printMismatchedFlags(virBitmapPtr got,
+                                 virBitmapPtr expect)
 {
     int i;
 
-    for (i = 0 ; i < (sizeof(got)*CHAR_BIT) ; i++) {
-        unsigned long long gotFlag = (got & (1LL << i));
-        unsigned long long expectFlag = (expect & (1LL << i));
+    for (i = 0 ; i < QEMU_CAPS_LAST ; i++) {
+        bool gotFlag = qemuCapsGet(got, i);
+        bool expectFlag = qemuCapsGet(expect, i);
         if (gotFlag && !expectFlag)
             fprintf(stderr, "Extra flag %i\n", i);
         if (!gotFlag && expectFlag)
@@ -44,8 +44,10 @@ static int testHelpStrParsing(const void *data)
     char helpStr[MAX_HELP_OUTPUT_SIZE];
     char *help = &(helpStr[0]);
     unsigned int version, is_kvm, kvm_version;
-    unsigned long long flags;
+    virBitmapPtr flags = NULL;
     int ret = -1;
+    char *got = NULL;
+    char *expected = NULL;
 
     if (virAsprintf(&path, "%s/qemuhelpdata/%s", abs_srcdir, info->name) < 0)
         return -1;
@@ -53,7 +55,10 @@ static int testHelpStrParsing(const void *data)
     if (virtTestLoadFile(path, &help, MAX_HELP_OUTPUT_SIZE) < 0)
         goto cleanup;
 
-    if (qemuCapsParseHelpStr("QEMU", help, &flags,
+    if (!(flags = qemuCapsNew()))
+        goto cleanup;
+
+    if (qemuCapsParseHelpStr("QEMU", help, flags,
                              &version, &is_kvm, &kvm_version) == -1)
         goto cleanup;
 
@@ -66,14 +71,19 @@ static int testHelpStrParsing(const void *data)
         if (virtTestLoadFile(path, &help, MAX_HELP_OUTPUT_SIZE) < 0)
             goto cleanup;
 
-        if (qemuCapsParseDeviceStr(help, &flags) < 0)
+        if (qemuCapsParseDeviceStr(help, flags) < 0)
             goto cleanup;
     }
 
-    if (flags != info->flags) {
+    got = virBitmapString(flags);
+    expected = virBitmapString(info->flags);
+    if (!got || !expected)
+        goto cleanup;
+
+    if (STRNEQ(got, expected)) {
         fprintf(stderr,
-                "Computed flags do not match: got 0x%llx, expected 0x%llx\n",
-                flags, info->flags);
+                "Computed flags do not match: got %s, expected %s\n",
+                got, expected);
 
         if (getenv("VIR_TEST_DEBUG"))
             printMismatchedFlags(flags, info->flags);
@@ -104,6 +114,9 @@ static int testHelpStrParsing(const void *data)
     ret = 0;
 cleanup:
     VIR_FREE(path);
+    qemuCapsFree(flags);
+    VIR_FREE(got);
+    VIR_FREE(expected);
     return ret;
 }
 
@@ -124,365 +137,359 @@ mymain(int argc, char **argv)
     if (!abs_srcdir)
         abs_srcdir = getcwd(cwd, sizeof(cwd));
 
-# define DO_TEST(name, flags, version, is_kvm, kvm_version)                          \
-    do {                                                                            \
-        const struct testInfo info = { name, flags, version, is_kvm, kvm_version }; \
-        if (virtTestRun("QEMU Help String Parsing " name,                           \
-                        1, testHelpStrParsing, &info) < 0)                          \
-            ret = -1;                                                               \
+# define DO_TEST(name, version, is_kvm, kvm_version, ...)                   \
+    do {                                                                    \
+        struct testInfo info = {                                            \
+            name, NULL, version, is_kvm, kvm_version                        \
+        };                                                                  \
+        if (!(info.flags = qemuCapsNew()))                                  \
+            return EXIT_FAILURE;                                            \
+        qemuCapsSetList(info.flags, __VA_ARGS__, QEMU_CAPS_LAST);           \
+        if (virtTestRun("QEMU Help String Parsing " name,                   \
+                        1, testHelpStrParsing, &info) < 0)                  \
+            ret = -1;                                                       \
+        qemuCapsFree(info.flags);                                           \
     } while (0)
 
-    DO_TEST("qemu-0.9.1",
-            QEMU_CAPS_KQEMU |
-            QEMU_CAPS_VNC_COLON |
-            QEMU_CAPS_NO_REBOOT |
-            QEMU_CAPS_DRIVE |
+    DO_TEST("qemu-0.9.1", 9001, 0, 0,
+            QEMU_CAPS_KQEMU,
+            QEMU_CAPS_VNC_COLON,
+            QEMU_CAPS_NO_REBOOT,
+            QEMU_CAPS_DRIVE,
+            QEMU_CAPS_NAME);
+    DO_TEST("kvm-74", 9001, 1, 74,
+            QEMU_CAPS_VNC_COLON,
+            QEMU_CAPS_NO_REBOOT,
+            QEMU_CAPS_DRIVE,
+            QEMU_CAPS_DRIVE_BOOT,
             QEMU_CAPS_NAME,
-            9001,  0,  0);
-    DO_TEST("kvm-74",
-            QEMU_CAPS_VNC_COLON |
-            QEMU_CAPS_NO_REBOOT |
-            QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DRIVE_BOOT |
-            QEMU_CAPS_NAME |
-            QEMU_CAPS_VNET_HDR |
-            QEMU_CAPS_MIGRATE_KVM_STDIO |
-            QEMU_CAPS_KVM |
-            QEMU_CAPS_DRIVE_FORMAT |
-            QEMU_CAPS_MEM_PATH |
+            QEMU_CAPS_VNET_HDR,
+            QEMU_CAPS_MIGRATE_KVM_STDIO,
+            QEMU_CAPS_KVM,
+            QEMU_CAPS_DRIVE_FORMAT,
+            QEMU_CAPS_MEM_PATH,
+            QEMU_CAPS_TDF);
+    DO_TEST("kvm-83-rhel56", 9001, 1, 83,
+            QEMU_CAPS_VNC_COLON,
+            QEMU_CAPS_NO_REBOOT,
+            QEMU_CAPS_DRIVE,
+            QEMU_CAPS_DRIVE_BOOT,
+            QEMU_CAPS_NAME,
+            QEMU_CAPS_UUID,
+            QEMU_CAPS_VNET_HDR,
+            QEMU_CAPS_MIGRATE_QEMU_TCP,
+            QEMU_CAPS_MIGRATE_QEMU_EXEC,
+            QEMU_CAPS_DRIVE_CACHE_V2,
+            QEMU_CAPS_KVM,
+            QEMU_CAPS_DRIVE_FORMAT,
+            QEMU_CAPS_DRIVE_SERIAL,
+            QEMU_CAPS_VGA,
+            QEMU_CAPS_PCIDEVICE,
+            QEMU_CAPS_MEM_PATH,
+            QEMU_CAPS_BALLOON,
+            QEMU_CAPS_RTC_TD_HACK,
+            QEMU_CAPS_NO_HPET,
+            QEMU_CAPS_NO_KVM_PIT,
             QEMU_CAPS_TDF,
-            9001,  1, 74);
-    DO_TEST("kvm-83-rhel56",
-            QEMU_CAPS_VNC_COLON |
-            QEMU_CAPS_NO_REBOOT |
-            QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DRIVE_BOOT |
-            QEMU_CAPS_NAME |
-            QEMU_CAPS_UUID |
-            QEMU_CAPS_VNET_HDR |
-            QEMU_CAPS_MIGRATE_QEMU_TCP |
-            QEMU_CAPS_MIGRATE_QEMU_EXEC |
-            QEMU_CAPS_DRIVE_CACHE_V2 |
-            QEMU_CAPS_KVM |
-            QEMU_CAPS_DRIVE_FORMAT |
-            QEMU_CAPS_DRIVE_SERIAL |
-            QEMU_CAPS_VGA |
-            QEMU_CAPS_PCIDEVICE |
-            QEMU_CAPS_MEM_PATH |
-            QEMU_CAPS_BALLOON |
-            QEMU_CAPS_RTC_TD_HACK |
-            QEMU_CAPS_NO_HPET |
-            QEMU_CAPS_NO_KVM_PIT |
-            QEMU_CAPS_TDF |
-            QEMU_CAPS_DRIVE_READONLY |
-            QEMU_CAPS_SMBIOS_TYPE |
-            QEMU_CAPS_SPICE,
-            9001, 1,  83);
-    DO_TEST("qemu-0.10.5",
-            QEMU_CAPS_KQEMU |
-            QEMU_CAPS_VNC_COLON |
-            QEMU_CAPS_NO_REBOOT |
-            QEMU_CAPS_DRIVE |
-            QEMU_CAPS_NAME |
-            QEMU_CAPS_UUID |
-            QEMU_CAPS_MIGRATE_QEMU_TCP |
-            QEMU_CAPS_MIGRATE_QEMU_EXEC |
-            QEMU_CAPS_DRIVE_CACHE_V2 |
-            QEMU_CAPS_DRIVE_FORMAT |
-            QEMU_CAPS_DRIVE_SERIAL |
-            QEMU_CAPS_VGA |
-            QEMU_CAPS_0_10 |
-            QEMU_CAPS_ENABLE_KVM |
-            QEMU_CAPS_SDL |
-            QEMU_CAPS_RTC_TD_HACK |
-            QEMU_CAPS_NO_HPET |
+            QEMU_CAPS_DRIVE_READONLY,
+            QEMU_CAPS_SMBIOS_TYPE,
+            QEMU_CAPS_SPICE);
+    DO_TEST("qemu-0.10.5", 10005, 0, 0,
+            QEMU_CAPS_KQEMU,
+            QEMU_CAPS_VNC_COLON,
+            QEMU_CAPS_NO_REBOOT,
+            QEMU_CAPS_DRIVE,
+            QEMU_CAPS_NAME,
+            QEMU_CAPS_UUID,
+            QEMU_CAPS_MIGRATE_QEMU_TCP,
+            QEMU_CAPS_MIGRATE_QEMU_EXEC,
+            QEMU_CAPS_DRIVE_CACHE_V2,
+            QEMU_CAPS_DRIVE_FORMAT,
+            QEMU_CAPS_DRIVE_SERIAL,
+            QEMU_CAPS_VGA,
+            QEMU_CAPS_0_10,
+            QEMU_CAPS_ENABLE_KVM,
+            QEMU_CAPS_SDL,
+            QEMU_CAPS_RTC_TD_HACK,
+            QEMU_CAPS_NO_HPET,
+            QEMU_CAPS_VGA_NONE);
+    DO_TEST("qemu-kvm-0.10.5", 10005, 1, 0,
+            QEMU_CAPS_VNC_COLON,
+            QEMU_CAPS_NO_REBOOT,
+            QEMU_CAPS_DRIVE,
+            QEMU_CAPS_DRIVE_BOOT,
+            QEMU_CAPS_NAME,
+            QEMU_CAPS_UUID,
+            QEMU_CAPS_VNET_HDR,
+            QEMU_CAPS_MIGRATE_QEMU_TCP,
+            QEMU_CAPS_MIGRATE_QEMU_EXEC,
+            QEMU_CAPS_DRIVE_CACHE_V2,
+            QEMU_CAPS_KVM,
+            QEMU_CAPS_DRIVE_FORMAT,
+            QEMU_CAPS_DRIVE_SERIAL,
+            QEMU_CAPS_VGA,
+            QEMU_CAPS_0_10,
+            QEMU_CAPS_PCIDEVICE,
+            QEMU_CAPS_MEM_PATH,
+            QEMU_CAPS_SDL,
+            QEMU_CAPS_RTC_TD_HACK,
+            QEMU_CAPS_NO_HPET,
+            QEMU_CAPS_NO_KVM_PIT,
+            QEMU_CAPS_TDF,
+            QEMU_CAPS_NESTING,
+            QEMU_CAPS_VGA_NONE);
+    DO_TEST("kvm-86", 10050, 1, 0,
+            QEMU_CAPS_VNC_COLON,
+            QEMU_CAPS_NO_REBOOT,
+            QEMU_CAPS_DRIVE,
+            QEMU_CAPS_DRIVE_BOOT,
+            QEMU_CAPS_NAME,
+            QEMU_CAPS_UUID,
+            QEMU_CAPS_VNET_HDR,
+            QEMU_CAPS_MIGRATE_QEMU_TCP,
+            QEMU_CAPS_MIGRATE_QEMU_EXEC,
+            QEMU_CAPS_DRIVE_CACHE_V2,
+            QEMU_CAPS_KVM,
+            QEMU_CAPS_DRIVE_FORMAT,
+            QEMU_CAPS_DRIVE_SERIAL,
+            QEMU_CAPS_VGA,
+            QEMU_CAPS_0_10,
+            QEMU_CAPS_PCIDEVICE,
+            QEMU_CAPS_SDL,
+            QEMU_CAPS_RTC_TD_HACK,
+            QEMU_CAPS_NO_HPET,
+            QEMU_CAPS_NO_KVM_PIT,
+            QEMU_CAPS_TDF,
+            QEMU_CAPS_NESTING,
+            QEMU_CAPS_SMBIOS_TYPE,
+            QEMU_CAPS_VGA_NONE);
+    DO_TEST("qemu-kvm-0.11.0-rc2", 10092, 1, 0,
+            QEMU_CAPS_VNC_COLON,
+            QEMU_CAPS_NO_REBOOT,
+            QEMU_CAPS_DRIVE,
+            QEMU_CAPS_DRIVE_BOOT,
+            QEMU_CAPS_NAME,
+            QEMU_CAPS_UUID,
+            QEMU_CAPS_VNET_HDR,
+            QEMU_CAPS_MIGRATE_QEMU_TCP,
+            QEMU_CAPS_MIGRATE_QEMU_EXEC,
+            QEMU_CAPS_DRIVE_CACHE_V2,
+            QEMU_CAPS_KVM,
+            QEMU_CAPS_DRIVE_FORMAT,
+            QEMU_CAPS_DRIVE_SERIAL,
+            QEMU_CAPS_VGA,
+            QEMU_CAPS_0_10,
+            QEMU_CAPS_PCIDEVICE,
+            QEMU_CAPS_MEM_PATH,
+            QEMU_CAPS_ENABLE_KVM,
+            QEMU_CAPS_BALLOON,
+            QEMU_CAPS_SDL,
+            QEMU_CAPS_RTC_TD_HACK,
+            QEMU_CAPS_NO_HPET,
+            QEMU_CAPS_NO_KVM_PIT,
+            QEMU_CAPS_TDF,
+            QEMU_CAPS_BOOT_MENU,
+            QEMU_CAPS_NESTING,
+            QEMU_CAPS_NAME_PROCESS,
+            QEMU_CAPS_SMBIOS_TYPE,
+            QEMU_CAPS_VGA_NONE);
+    DO_TEST("qemu-0.12.1", 12001, 0, 0,
+            QEMU_CAPS_VNC_COLON,
+            QEMU_CAPS_NO_REBOOT,
+            QEMU_CAPS_DRIVE,
+            QEMU_CAPS_NAME,
+            QEMU_CAPS_UUID,
+            QEMU_CAPS_MIGRATE_QEMU_TCP,
+            QEMU_CAPS_MIGRATE_QEMU_EXEC,
+            QEMU_CAPS_DRIVE_CACHE_V2,
+            QEMU_CAPS_DRIVE_FORMAT,
+            QEMU_CAPS_DRIVE_SERIAL,
+            QEMU_CAPS_DRIVE_READONLY,
+            QEMU_CAPS_VGA,
+            QEMU_CAPS_0_10,
+            QEMU_CAPS_ENABLE_KVM,
+            QEMU_CAPS_SDL,
+            QEMU_CAPS_XEN_DOMID,
+            QEMU_CAPS_MIGRATE_QEMU_UNIX,
+            QEMU_CAPS_CHARDEV,
+            QEMU_CAPS_BALLOON,
+            QEMU_CAPS_DEVICE,
+            QEMU_CAPS_SMP_TOPOLOGY,
+            QEMU_CAPS_RTC,
+            QEMU_CAPS_NO_HPET,
+            QEMU_CAPS_BOOT_MENU,
+            QEMU_CAPS_NAME_PROCESS,
+            QEMU_CAPS_SMBIOS_TYPE,
             QEMU_CAPS_VGA_NONE,
-            10005, 0,  0);
-    DO_TEST("qemu-kvm-0.10.5",
-            QEMU_CAPS_VNC_COLON |
-            QEMU_CAPS_NO_REBOOT |
-            QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DRIVE_BOOT |
-            QEMU_CAPS_NAME |
-            QEMU_CAPS_UUID |
-            QEMU_CAPS_VNET_HDR |
-            QEMU_CAPS_MIGRATE_QEMU_TCP |
-            QEMU_CAPS_MIGRATE_QEMU_EXEC |
-            QEMU_CAPS_DRIVE_CACHE_V2 |
-            QEMU_CAPS_KVM |
-            QEMU_CAPS_DRIVE_FORMAT |
-            QEMU_CAPS_DRIVE_SERIAL |
-            QEMU_CAPS_VGA |
-            QEMU_CAPS_0_10 |
-            QEMU_CAPS_PCIDEVICE |
-            QEMU_CAPS_MEM_PATH |
-            QEMU_CAPS_SDL |
-            QEMU_CAPS_RTC_TD_HACK |
-            QEMU_CAPS_NO_HPET |
-            QEMU_CAPS_NO_KVM_PIT |
-            QEMU_CAPS_TDF |
-            QEMU_CAPS_NESTING |
+            QEMU_CAPS_MIGRATE_QEMU_FD,
+            QEMU_CAPS_DRIVE_AIO);
+    DO_TEST("qemu-kvm-0.12.1.2-rhel60", 12001, 1, 0,
+            QEMU_CAPS_VNC_COLON,
+            QEMU_CAPS_NO_REBOOT,
+            QEMU_CAPS_DRIVE,
+            QEMU_CAPS_DRIVE_BOOT,
+            QEMU_CAPS_NAME,
+            QEMU_CAPS_UUID,
+            QEMU_CAPS_VNET_HDR,
+            QEMU_CAPS_MIGRATE_QEMU_TCP,
+            QEMU_CAPS_MIGRATE_QEMU_EXEC,
+            QEMU_CAPS_DRIVE_CACHE_V2,
+            QEMU_CAPS_KVM,
+            QEMU_CAPS_DRIVE_FORMAT,
+            QEMU_CAPS_DRIVE_SERIAL,
+            QEMU_CAPS_DRIVE_READONLY,
+            QEMU_CAPS_VGA,
+            QEMU_CAPS_0_10,
+            QEMU_CAPS_PCIDEVICE,
+            QEMU_CAPS_MEM_PATH,
+            QEMU_CAPS_MIGRATE_QEMU_UNIX,
+            QEMU_CAPS_CHARDEV,
+            QEMU_CAPS_ENABLE_KVM,
+            QEMU_CAPS_BALLOON,
+            QEMU_CAPS_DEVICE,
+            QEMU_CAPS_SMP_TOPOLOGY,
+            QEMU_CAPS_RTC,
+            QEMU_CAPS_VNET_HOST,
+            QEMU_CAPS_NO_KVM_PIT,
+            QEMU_CAPS_TDF,
+            QEMU_CAPS_PCI_CONFIGFD,
+            QEMU_CAPS_NODEFCONFIG,
+            QEMU_CAPS_BOOT_MENU,
+            QEMU_CAPS_NESTING,
+            QEMU_CAPS_NAME_PROCESS,
+            QEMU_CAPS_SMBIOS_TYPE,
+            QEMU_CAPS_VGA_QXL,
+            QEMU_CAPS_SPICE,
             QEMU_CAPS_VGA_NONE,
-            10005, 1,  0);
-    DO_TEST("kvm-86",
-            QEMU_CAPS_VNC_COLON |
-            QEMU_CAPS_NO_REBOOT |
-            QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DRIVE_BOOT |
-            QEMU_CAPS_NAME |
-            QEMU_CAPS_UUID |
-            QEMU_CAPS_VNET_HDR |
-            QEMU_CAPS_MIGRATE_QEMU_TCP |
-            QEMU_CAPS_MIGRATE_QEMU_EXEC |
-            QEMU_CAPS_DRIVE_CACHE_V2 |
-            QEMU_CAPS_KVM |
-            QEMU_CAPS_DRIVE_FORMAT |
-            QEMU_CAPS_DRIVE_SERIAL |
-            QEMU_CAPS_VGA |
-            QEMU_CAPS_0_10 |
-            QEMU_CAPS_PCIDEVICE |
-            QEMU_CAPS_SDL |
-            QEMU_CAPS_RTC_TD_HACK |
-            QEMU_CAPS_NO_HPET |
-            QEMU_CAPS_NO_KVM_PIT |
-            QEMU_CAPS_TDF |
-            QEMU_CAPS_NESTING |
-            QEMU_CAPS_SMBIOS_TYPE |
+            QEMU_CAPS_MIGRATE_QEMU_FD,
+            QEMU_CAPS_DRIVE_AIO,
+            QEMU_CAPS_DEVICE_SPICEVMC);
+    DO_TEST("qemu-kvm-0.12.3", 12003, 1, 0,
+            QEMU_CAPS_VNC_COLON,
+            QEMU_CAPS_NO_REBOOT,
+            QEMU_CAPS_DRIVE,
+            QEMU_CAPS_DRIVE_BOOT,
+            QEMU_CAPS_NAME,
+            QEMU_CAPS_UUID,
+            QEMU_CAPS_VNET_HDR,
+            QEMU_CAPS_MIGRATE_QEMU_TCP,
+            QEMU_CAPS_MIGRATE_QEMU_EXEC,
+            QEMU_CAPS_DRIVE_CACHE_V2,
+            QEMU_CAPS_KVM,
+            QEMU_CAPS_DRIVE_FORMAT,
+            QEMU_CAPS_DRIVE_SERIAL,
+            QEMU_CAPS_DRIVE_READONLY,
+            QEMU_CAPS_VGA,
+            QEMU_CAPS_0_10,
+            QEMU_CAPS_PCIDEVICE,
+            QEMU_CAPS_MEM_PATH,
+            QEMU_CAPS_SDL,
+            QEMU_CAPS_MIGRATE_QEMU_UNIX,
+            QEMU_CAPS_CHARDEV,
+            QEMU_CAPS_BALLOON,
+            QEMU_CAPS_DEVICE,
+            QEMU_CAPS_SMP_TOPOLOGY,
+            QEMU_CAPS_RTC,
+            QEMU_CAPS_VNET_HOST,
+            QEMU_CAPS_NO_HPET,
+            QEMU_CAPS_NO_KVM_PIT,
+            QEMU_CAPS_TDF,
+            QEMU_CAPS_BOOT_MENU,
+            QEMU_CAPS_NESTING,
+            QEMU_CAPS_NAME_PROCESS,
+            QEMU_CAPS_SMBIOS_TYPE,
             QEMU_CAPS_VGA_NONE,
-            10050, 1,  0);
-    DO_TEST("qemu-kvm-0.11.0-rc2",
-            QEMU_CAPS_VNC_COLON |
-            QEMU_CAPS_NO_REBOOT |
-            QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DRIVE_BOOT |
-            QEMU_CAPS_NAME |
-            QEMU_CAPS_UUID |
-            QEMU_CAPS_VNET_HDR |
-            QEMU_CAPS_MIGRATE_QEMU_TCP |
-            QEMU_CAPS_MIGRATE_QEMU_EXEC |
-            QEMU_CAPS_DRIVE_CACHE_V2 |
-            QEMU_CAPS_KVM |
-            QEMU_CAPS_DRIVE_FORMAT |
-            QEMU_CAPS_DRIVE_SERIAL |
-            QEMU_CAPS_VGA |
-            QEMU_CAPS_0_10 |
-            QEMU_CAPS_PCIDEVICE |
-            QEMU_CAPS_MEM_PATH |
-            QEMU_CAPS_ENABLE_KVM |
-            QEMU_CAPS_BALLOON |
-            QEMU_CAPS_SDL |
-            QEMU_CAPS_RTC_TD_HACK |
-            QEMU_CAPS_NO_HPET |
-            QEMU_CAPS_NO_KVM_PIT |
-            QEMU_CAPS_TDF |
-            QEMU_CAPS_BOOT_MENU |
-            QEMU_CAPS_NESTING |
-            QEMU_CAPS_NAME_PROCESS |
-            QEMU_CAPS_SMBIOS_TYPE |
+            QEMU_CAPS_MIGRATE_QEMU_FD,
+            QEMU_CAPS_DRIVE_AIO);
+    DO_TEST("qemu-kvm-0.13.0", 13000, 1, 0,
+            QEMU_CAPS_VNC_COLON,
+            QEMU_CAPS_NO_REBOOT,
+            QEMU_CAPS_DRIVE,
+            QEMU_CAPS_DRIVE_BOOT,
+            QEMU_CAPS_NAME,
+            QEMU_CAPS_UUID,
+            QEMU_CAPS_VNET_HDR,
+            QEMU_CAPS_MIGRATE_QEMU_TCP,
+            QEMU_CAPS_MIGRATE_QEMU_EXEC,
+            QEMU_CAPS_DRIVE_CACHE_V2,
+            QEMU_CAPS_KVM,
+            QEMU_CAPS_DRIVE_FORMAT,
+            QEMU_CAPS_DRIVE_SERIAL,
+            QEMU_CAPS_XEN_DOMID,
+            QEMU_CAPS_DRIVE_READONLY,
+            QEMU_CAPS_VGA,
+            QEMU_CAPS_0_10,
+            QEMU_CAPS_PCIDEVICE,
+            QEMU_CAPS_MEM_PATH,
+            QEMU_CAPS_SDL,
+            QEMU_CAPS_MIGRATE_QEMU_UNIX,
+            QEMU_CAPS_CHARDEV,
+            QEMU_CAPS_ENABLE_KVM,
+            QEMU_CAPS_MONITOR_JSON,
+            QEMU_CAPS_BALLOON,
+            QEMU_CAPS_DEVICE,
+            QEMU_CAPS_SMP_TOPOLOGY,
+            QEMU_CAPS_NETDEV,
+            QEMU_CAPS_RTC,
+            QEMU_CAPS_VNET_HOST,
+            QEMU_CAPS_NO_HPET,
+            QEMU_CAPS_NO_KVM_PIT,
+            QEMU_CAPS_TDF,
+            QEMU_CAPS_PCI_CONFIGFD,
+            QEMU_CAPS_NODEFCONFIG,
+            QEMU_CAPS_BOOT_MENU,
+            QEMU_CAPS_FSDEV,
+            QEMU_CAPS_NESTING,
+            QEMU_CAPS_NAME_PROCESS,
+            QEMU_CAPS_SMBIOS_TYPE,
+            QEMU_CAPS_SPICE,
             QEMU_CAPS_VGA_NONE,
-            10092, 1,  0);
-    DO_TEST("qemu-0.12.1",
-            QEMU_CAPS_VNC_COLON |
-            QEMU_CAPS_NO_REBOOT |
-            QEMU_CAPS_DRIVE |
-            QEMU_CAPS_NAME |
-            QEMU_CAPS_UUID |
-            QEMU_CAPS_MIGRATE_QEMU_TCP |
-            QEMU_CAPS_MIGRATE_QEMU_EXEC |
-            QEMU_CAPS_DRIVE_CACHE_V2 |
-            QEMU_CAPS_DRIVE_FORMAT |
-            QEMU_CAPS_DRIVE_SERIAL |
-            QEMU_CAPS_DRIVE_READONLY |
-            QEMU_CAPS_VGA |
-            QEMU_CAPS_0_10 |
-            QEMU_CAPS_ENABLE_KVM |
-            QEMU_CAPS_SDL |
-            QEMU_CAPS_XEN_DOMID |
-            QEMU_CAPS_MIGRATE_QEMU_UNIX |
-            QEMU_CAPS_CHARDEV |
-            QEMU_CAPS_BALLOON |
-            QEMU_CAPS_DEVICE |
-            QEMU_CAPS_SMP_TOPOLOGY |
-            QEMU_CAPS_RTC |
-            QEMU_CAPS_NO_HPET |
-            QEMU_CAPS_BOOT_MENU |
-            QEMU_CAPS_NAME_PROCESS |
-            QEMU_CAPS_SMBIOS_TYPE |
-            QEMU_CAPS_VGA_NONE |
-            QEMU_CAPS_MIGRATE_QEMU_FD |
+            QEMU_CAPS_MIGRATE_QEMU_FD,
             QEMU_CAPS_DRIVE_AIO,
-            12001, 0,  0);
-    DO_TEST("qemu-kvm-0.12.1.2-rhel60",
-            QEMU_CAPS_VNC_COLON |
-            QEMU_CAPS_NO_REBOOT |
-            QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DRIVE_BOOT |
-            QEMU_CAPS_NAME |
-            QEMU_CAPS_UUID |
-            QEMU_CAPS_VNET_HDR |
-            QEMU_CAPS_MIGRATE_QEMU_TCP |
-            QEMU_CAPS_MIGRATE_QEMU_EXEC |
-            QEMU_CAPS_DRIVE_CACHE_V2 |
-            QEMU_CAPS_KVM |
-            QEMU_CAPS_DRIVE_FORMAT |
-            QEMU_CAPS_DRIVE_SERIAL |
-            QEMU_CAPS_DRIVE_READONLY |
-            QEMU_CAPS_VGA |
-            QEMU_CAPS_0_10 |
-            QEMU_CAPS_PCIDEVICE |
-            QEMU_CAPS_MEM_PATH |
-            QEMU_CAPS_MIGRATE_QEMU_UNIX |
-            QEMU_CAPS_CHARDEV |
-            QEMU_CAPS_ENABLE_KVM |
-            QEMU_CAPS_BALLOON |
-            QEMU_CAPS_DEVICE |
-            QEMU_CAPS_SMP_TOPOLOGY |
-            QEMU_CAPS_RTC |
-            QEMU_CAPS_VNET_HOST |
-            QEMU_CAPS_NO_KVM_PIT |
-            QEMU_CAPS_TDF |
-            QEMU_CAPS_PCI_CONFIGFD |
-            QEMU_CAPS_NODEFCONFIG |
-            QEMU_CAPS_BOOT_MENU |
-            QEMU_CAPS_NESTING |
-            QEMU_CAPS_NAME_PROCESS |
-            QEMU_CAPS_SMBIOS_TYPE |
-            QEMU_CAPS_VGA_QXL |
-            QEMU_CAPS_SPICE |
-            QEMU_CAPS_VGA_NONE |
-            QEMU_CAPS_MIGRATE_QEMU_FD |
-            QEMU_CAPS_DRIVE_AIO |
-            QEMU_CAPS_DEVICE_SPICEVMC,
-            12001, 1,  0);
-    DO_TEST("qemu-kvm-0.12.3",
-            QEMU_CAPS_VNC_COLON |
-            QEMU_CAPS_NO_REBOOT |
-            QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DRIVE_BOOT |
-            QEMU_CAPS_NAME |
-            QEMU_CAPS_UUID |
-            QEMU_CAPS_VNET_HDR |
-            QEMU_CAPS_MIGRATE_QEMU_TCP |
-            QEMU_CAPS_MIGRATE_QEMU_EXEC |
-            QEMU_CAPS_DRIVE_CACHE_V2 |
-            QEMU_CAPS_KVM |
-            QEMU_CAPS_DRIVE_FORMAT |
-            QEMU_CAPS_DRIVE_SERIAL |
-            QEMU_CAPS_DRIVE_READONLY |
-            QEMU_CAPS_VGA |
-            QEMU_CAPS_0_10 |
-            QEMU_CAPS_PCIDEVICE |
-            QEMU_CAPS_MEM_PATH |
-            QEMU_CAPS_SDL |
-            QEMU_CAPS_MIGRATE_QEMU_UNIX |
-            QEMU_CAPS_CHARDEV |
-            QEMU_CAPS_BALLOON |
-            QEMU_CAPS_DEVICE |
-            QEMU_CAPS_SMP_TOPOLOGY |
-            QEMU_CAPS_RTC |
-            QEMU_CAPS_VNET_HOST |
-            QEMU_CAPS_NO_HPET |
-            QEMU_CAPS_NO_KVM_PIT |
-            QEMU_CAPS_TDF |
-            QEMU_CAPS_BOOT_MENU |
-            QEMU_CAPS_NESTING |
-            QEMU_CAPS_NAME_PROCESS |
-            QEMU_CAPS_SMBIOS_TYPE |
-            QEMU_CAPS_VGA_NONE |
-            QEMU_CAPS_MIGRATE_QEMU_FD |
+            QEMU_CAPS_DEVICE_SPICEVMC);
+    DO_TEST("qemu-kvm-0.12.1.2-rhel61", 12001, 1, 0,
+            QEMU_CAPS_VNC_COLON,
+            QEMU_CAPS_NO_REBOOT,
+            QEMU_CAPS_DRIVE,
+            QEMU_CAPS_NAME,
+            QEMU_CAPS_UUID,
+            QEMU_CAPS_VNET_HDR,
+            QEMU_CAPS_MIGRATE_QEMU_TCP,
+            QEMU_CAPS_MIGRATE_QEMU_EXEC,
+            QEMU_CAPS_DRIVE_CACHE_V2,
+            QEMU_CAPS_KVM,
+            QEMU_CAPS_DRIVE_FORMAT,
+            QEMU_CAPS_DRIVE_SERIAL,
+            QEMU_CAPS_DRIVE_READONLY,
+            QEMU_CAPS_VGA,
+            QEMU_CAPS_0_10,
+            QEMU_CAPS_PCIDEVICE,
+            QEMU_CAPS_MEM_PATH,
+            QEMU_CAPS_MIGRATE_QEMU_UNIX,
+            QEMU_CAPS_CHARDEV,
+            QEMU_CAPS_ENABLE_KVM,
+            QEMU_CAPS_BALLOON,
+            QEMU_CAPS_DEVICE,
+            QEMU_CAPS_SMP_TOPOLOGY,
+            QEMU_CAPS_RTC,
+            QEMU_CAPS_VNET_HOST,
+            QEMU_CAPS_NO_KVM_PIT,
+            QEMU_CAPS_TDF,
+            QEMU_CAPS_PCI_CONFIGFD,
+            QEMU_CAPS_NODEFCONFIG,
+            QEMU_CAPS_BOOT_MENU,
+            QEMU_CAPS_NESTING,
+            QEMU_CAPS_NAME_PROCESS,
+            QEMU_CAPS_SMBIOS_TYPE,
+            QEMU_CAPS_VGA_QXL,
+            QEMU_CAPS_SPICE,
+            QEMU_CAPS_VGA_NONE,
+            QEMU_CAPS_MIGRATE_QEMU_FD,
+            QEMU_CAPS_HDA_DUPLEX,
             QEMU_CAPS_DRIVE_AIO,
-            12003, 1,  0);
-    DO_TEST("qemu-kvm-0.13.0",
-            QEMU_CAPS_VNC_COLON |
-            QEMU_CAPS_NO_REBOOT |
-            QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DRIVE_BOOT |
-            QEMU_CAPS_NAME |
-            QEMU_CAPS_UUID |
-            QEMU_CAPS_VNET_HDR |
-            QEMU_CAPS_MIGRATE_QEMU_TCP |
-            QEMU_CAPS_MIGRATE_QEMU_EXEC |
-            QEMU_CAPS_DRIVE_CACHE_V2 |
-            QEMU_CAPS_KVM |
-            QEMU_CAPS_DRIVE_FORMAT |
-            QEMU_CAPS_DRIVE_SERIAL |
-            QEMU_CAPS_XEN_DOMID |
-            QEMU_CAPS_DRIVE_READONLY |
-            QEMU_CAPS_VGA |
-            QEMU_CAPS_0_10 |
-            QEMU_CAPS_PCIDEVICE |
-            QEMU_CAPS_MEM_PATH |
-            QEMU_CAPS_SDL |
-            QEMU_CAPS_MIGRATE_QEMU_UNIX |
-            QEMU_CAPS_CHARDEV |
-            QEMU_CAPS_ENABLE_KVM |
-            QEMU_CAPS_MONITOR_JSON |
-            QEMU_CAPS_BALLOON |
-            QEMU_CAPS_DEVICE |
-            QEMU_CAPS_SMP_TOPOLOGY |
-            QEMU_CAPS_NETDEV |
-            QEMU_CAPS_RTC |
-            QEMU_CAPS_VNET_HOST |
-            QEMU_CAPS_NO_HPET |
-            QEMU_CAPS_NO_KVM_PIT |
-            QEMU_CAPS_TDF |
-            QEMU_CAPS_PCI_CONFIGFD |
-            QEMU_CAPS_NODEFCONFIG |
-            QEMU_CAPS_BOOT_MENU |
-            QEMU_CAPS_FSDEV |
-            QEMU_CAPS_NESTING |
-            QEMU_CAPS_NAME_PROCESS |
-            QEMU_CAPS_SMBIOS_TYPE |
-            QEMU_CAPS_SPICE |
-            QEMU_CAPS_VGA_NONE |
-            QEMU_CAPS_MIGRATE_QEMU_FD |
-            QEMU_CAPS_DRIVE_AIO |
-            QEMU_CAPS_DEVICE_SPICEVMC,
-            13000, 1,  0);
-    DO_TEST("qemu-kvm-0.12.1.2-rhel61",
-            QEMU_CAPS_VNC_COLON |
-            QEMU_CAPS_NO_REBOOT |
-            QEMU_CAPS_DRIVE |
-            QEMU_CAPS_NAME |
-            QEMU_CAPS_UUID |
-            QEMU_CAPS_VNET_HDR |
-            QEMU_CAPS_MIGRATE_QEMU_TCP |
-            QEMU_CAPS_MIGRATE_QEMU_EXEC |
-            QEMU_CAPS_DRIVE_CACHE_V2 |
-            QEMU_CAPS_KVM |
-            QEMU_CAPS_DRIVE_FORMAT |
-            QEMU_CAPS_DRIVE_SERIAL |
-            QEMU_CAPS_DRIVE_READONLY |
-            QEMU_CAPS_VGA |
-            QEMU_CAPS_0_10 |
-            QEMU_CAPS_PCIDEVICE |
-            QEMU_CAPS_MEM_PATH |
-            QEMU_CAPS_MIGRATE_QEMU_UNIX |
-            QEMU_CAPS_CHARDEV |
-            QEMU_CAPS_ENABLE_KVM |
-            QEMU_CAPS_BALLOON |
-            QEMU_CAPS_DEVICE |
-            QEMU_CAPS_SMP_TOPOLOGY |
-            QEMU_CAPS_RTC |
-            QEMU_CAPS_VNET_HOST |
-            QEMU_CAPS_NO_KVM_PIT |
-            QEMU_CAPS_TDF |
-            QEMU_CAPS_PCI_CONFIGFD |
-            QEMU_CAPS_NODEFCONFIG |
-            QEMU_CAPS_BOOT_MENU |
-            QEMU_CAPS_NESTING |
-            QEMU_CAPS_NAME_PROCESS |
-            QEMU_CAPS_SMBIOS_TYPE |
-            QEMU_CAPS_VGA_QXL |
-            QEMU_CAPS_SPICE |
-            QEMU_CAPS_VGA_NONE |
-            QEMU_CAPS_MIGRATE_QEMU_FD |
-            QEMU_CAPS_HDA_DUPLEX |
-            QEMU_CAPS_DRIVE_AIO |
-            QEMU_CAPS_CCID_PASSTHRU |
-            QEMU_CAPS_CHARDEV_SPICEVMC |
-            QEMU_CAPS_VIRTIO_TX_ALG,
-            12001, 1,  0);
+            QEMU_CAPS_CCID_PASSTHRU,
+            QEMU_CAPS_CHARDEV_SPICEVMC,
+            QEMU_CAPS_VIRTIO_TX_ALG);
 
     return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
 }
index 5092e70129923056d95e5d1be0efc298e5af1bff..fec0dbcbc7d182f02a7d5952118f7db147a17151 100644 (file)
@@ -29,7 +29,7 @@ static struct qemud_driver driver;
 
 static int testCompareXMLToArgvFiles(const char *xml,
                                      const char *cmdline,
-                                     unsigned long long extraFlags,
+                                     virBitmapPtr extraFlags,
                                      const char *migrateFrom,
                                      int migrateFd,
                                      bool expectError) {
@@ -38,7 +38,6 @@ static int testCompareXMLToArgvFiles(const char *xml,
     int len;
     char *actualargv = NULL;
     int ret = -1;
-    unsigned long long flags;
     virDomainDefPtr vmdef = NULL;
     virDomainChrSourceDef monitor_chr;
     virConnectPtr conn;
@@ -89,14 +88,15 @@ static int testCompareXMLToArgvFiles(const char *xml,
     monitor_chr.data.nix.path = (char *)"/tmp/test-monitor";
     monitor_chr.data.nix.listen = true;
 
-    flags = QEMU_CAPS_VNC_COLON |
-        QEMU_CAPS_NO_REBOOT |
-        extraFlags;
+    qemuCapsSetList(extraFlags,
+                    QEMU_CAPS_VNC_COLON,
+                    QEMU_CAPS_NO_REBOOT,
+                    QEMU_CAPS_LAST);
 
     if (qemudCanonicalizeMachine(&driver, vmdef) < 0)
         goto fail;
 
-    if (qemuCapsGet(flags, QEMU_CAPS_DEVICE)) {
+    if (qemuCapsGet(extraFlags, QEMU_CAPS_DEVICE)) {
         qemuDomainPCIAddressSetPtr pciaddrs;
         if (!(pciaddrs = qemuDomainPCIAddressSetCreate(vmdef)))
             goto fail;
@@ -117,11 +117,11 @@ static int testCompareXMLToArgvFiles(const char *xml,
      */
     if (STREQLEN(vmdef->os.arch, "x86_64", 6) ||
         STREQLEN(vmdef->os.arch, "i686", 4)) {
-        qemuCapsSet(&flags, QEMU_CAPS_PCI_MULTIBUS);
+        qemuCapsSet(extraFlags, QEMU_CAPS_PCI_MULTIBUS);
     }
 
     if (!(cmd = qemuBuildCommandLine(conn, &driver,
-                                     vmdef, &monitor_chr, false, flags,
+                                     vmdef, &monitor_chr, false, extraFlags,
                                      migrateFrom, migrateFd, NULL,
                                      VIR_VM_OP_CREATE)))
         goto fail;
@@ -169,7 +169,7 @@ static int testCompareXMLToArgvFiles(const char *xml,
 
 struct testInfo {
     const char *name;
-    unsigned long long extraFlags;
+    virBitmapPtr extraFlags;
     const char *migrateFrom;
     int migrateFd;
     bool expectError;
@@ -230,18 +230,24 @@ mymain(int argc, char **argv)
     if (cpuMapOverride(map) < 0)
         return EXIT_FAILURE;
 
-# define DO_TEST_FULL(name, extraFlags, migrateFrom, migrateFd, expectError) \
+# define DO_TEST_FULL(name, migrateFrom, migrateFd, expectError, ...)   \
     do {                                                                \
-        const struct testInfo info = {                                  \
-            name, extraFlags, migrateFrom, migrateFd, expectError       \
+        struct testInfo info = {                                        \
+            name, NULL, migrateFrom, migrateFd, expectError             \
         };                                                              \
+        if (!(info.extraFlags = qemuCapsNew()))                         \
+            return EXIT_FAILURE;                                        \
+        qemuCapsSetList(info.extraFlags, __VA_ARGS__, QEMU_CAPS_LAST);  \
         if (virtTestRun("QEMU XML-2-ARGV " name,                        \
                         1, testCompareXMLToArgvHelper, &info) < 0)      \
             ret = -1;                                                   \
+        qemuCapsFree(info.extraFlags);                                  \
     } while (0)
 
-# define DO_TEST(name, extraFlags, expectError)                         \
-    DO_TEST_FULL(name, extraFlags, NULL, -1, expectError)
+# define DO_TEST(name, expectError, ...)                                \
+    DO_TEST_FULL(name, NULL, -1, expectError, __VA_ARGS__)
+
+# define NONE QEMU_CAPS_LAST
 
     /* Unset or set all envvars here that are copied in qemudBuildCommandLine
      * using ADD_ENV_COPY, otherwise these tests may fail due to unexpected
@@ -256,241 +262,235 @@ mymain(int argc, char **argv)
     unsetenv("QEMU_AUDIO_DRV");
     unsetenv("SDL_AUDIODRIVER");
 
-    DO_TEST("minimal", QEMU_CAPS_NAME, false);
-    DO_TEST("machine-aliases1", 0, false);
-    DO_TEST("machine-aliases2", 0, true);
-    DO_TEST("boot-cdrom", 0, false);
-    DO_TEST("boot-network", 0, false);
-    DO_TEST("boot-floppy", 0, false);
-    DO_TEST("boot-multi", QEMU_CAPS_BOOT_MENU, false);
-    DO_TEST("boot-menu-disable", QEMU_CAPS_BOOT_MENU, false);
-    DO_TEST("boot-order", QEMU_CAPS_BOOTINDEX |
-            QEMU_CAPS_DRIVE | QEMU_CAPS_DEVICE, false);
-    DO_TEST("bootloader", QEMU_CAPS_DOMID, true);
-    DO_TEST("clock-utc", 0, false);
-    DO_TEST("clock-localtime", 0, false);
+    DO_TEST("minimal", false, QEMU_CAPS_NAME);
+    DO_TEST("machine-aliases1", false, NONE);
+    DO_TEST("machine-aliases2", true, NONE);
+    DO_TEST("boot-cdrom", false, NONE);
+    DO_TEST("boot-network", false, NONE);
+    DO_TEST("boot-floppy", false, NONE);
+    DO_TEST("boot-multi", false, QEMU_CAPS_BOOT_MENU);
+    DO_TEST("boot-menu-disable", false, QEMU_CAPS_BOOT_MENU);
+    DO_TEST("boot-order", false,
+            QEMU_CAPS_BOOTINDEX, QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE);
+    DO_TEST("bootloader", true, QEMU_CAPS_DOMID);
+    DO_TEST("clock-utc", false, NONE);
+    DO_TEST("clock-localtime", false, NONE);
     /*
      * Can't be enabled since the absolute timestamp changes every time
-    DO_TEST("clock-variable", QEMU_CAPS_RTC, false);
+    DO_TEST("clock-variable", false, QEMU_CAPS_RTC);
     */
-    DO_TEST("clock-france", QEMU_CAPS_RTC, false);
-
-    DO_TEST("hugepages", QEMU_CAPS_MEM_PATH, false);
-    DO_TEST("disk-cdrom", 0, false);
-    DO_TEST("disk-cdrom-empty", QEMU_CAPS_DRIVE, false);
-    DO_TEST("disk-floppy", 0, false);
-    DO_TEST("disk-many", 0, false);
-    DO_TEST("disk-virtio", QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DRIVE_BOOT, false);
-    DO_TEST("disk-xenvbd", QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DRIVE_BOOT, false);
-    DO_TEST("disk-drive-boot-disk", QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DRIVE_BOOT, false);
-    DO_TEST("disk-drive-boot-cdrom", QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DRIVE_BOOT, false);
-    DO_TEST("floppy-drive-fat", QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DRIVE_BOOT | QEMU_CAPS_DRIVE_FORMAT, false);
-    DO_TEST("disk-drive-fat", QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DRIVE_BOOT | QEMU_CAPS_DRIVE_FORMAT, false);
-    DO_TEST("disk-drive-readonly-disk", QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DRIVE_READONLY | QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG, false);
-    DO_TEST("disk-drive-readonly-no-device", QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DRIVE_READONLY | QEMU_CAPS_NODEFCONFIG, false);
-    DO_TEST("disk-drive-fmt-qcow", QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DRIVE_BOOT | QEMU_CAPS_DRIVE_FORMAT, false);
-    DO_TEST("disk-drive-shared", QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DRIVE_FORMAT | QEMU_CAPS_DRIVE_SERIAL, false);
-    DO_TEST("disk-drive-cache-v1-wt", QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DRIVE_FORMAT, false);
-    DO_TEST("disk-drive-cache-v1-wb", QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DRIVE_FORMAT, false);
-    DO_TEST("disk-drive-cache-v1-none", QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DRIVE_FORMAT, false);
-    DO_TEST("disk-drive-error-policy-stop", QEMU_CAPS_DRIVE |
-            QEMU_CAPS_MONITOR_JSON |
-            QEMU_CAPS_DRIVE_FORMAT, false);
-    DO_TEST("disk-drive-cache-v2-wt", QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DRIVE_CACHE_V2 | QEMU_CAPS_DRIVE_FORMAT, false);
-    DO_TEST("disk-drive-cache-v2-wb", QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DRIVE_CACHE_V2 | QEMU_CAPS_DRIVE_FORMAT, false);
-    DO_TEST("disk-drive-cache-v2-none", QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DRIVE_CACHE_V2 | QEMU_CAPS_DRIVE_FORMAT, false);
-    DO_TEST("disk-drive-network-nbd", QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DRIVE_FORMAT, false);
-    DO_TEST("disk-drive-network-rbd", QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DRIVE_FORMAT, false);
-    DO_TEST("disk-drive-network-sheepdog", QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DRIVE_FORMAT, false);
-    DO_TEST("disk-usb", 0, false);
-    DO_TEST("disk-usb-device", QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DEVICE | QEMU_CAPS_NODEFCONFIG, false);
-    DO_TEST("disk-scsi-device", QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DEVICE | QEMU_CAPS_NODEFCONFIG, false);
-    DO_TEST("disk-scsi-device-auto", QEMU_CAPS_DRIVE |
-            QEMU_CAPS_DEVICE | QEMU_CAPS_NODEFCONFIG, false);
-    DO_TEST("disk-aio", QEMU_CAPS_DRIVE | QEMU_CAPS_DRIVE_AIO |
-            QEMU_CAPS_DRIVE_CACHE_V2 | QEMU_CAPS_DRIVE_FORMAT, false);
-    DO_TEST("graphics-vnc", 0, false);
-    DO_TEST("graphics-vnc-socket", 0, false);
+    DO_TEST("clock-france", false, QEMU_CAPS_RTC);
+
+    DO_TEST("hugepages", false, QEMU_CAPS_MEM_PATH);
+    DO_TEST("disk-cdrom", false, NONE);
+    DO_TEST("disk-cdrom-empty", false, QEMU_CAPS_DRIVE);
+    DO_TEST("disk-floppy", false, NONE);
+    DO_TEST("disk-many", false, NONE);
+    DO_TEST("disk-virtio", false, QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT);
+    DO_TEST("disk-xenvbd", false, QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT);
+    DO_TEST("disk-drive-boot-disk", false,
+            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT);
+    DO_TEST("disk-drive-boot-cdrom", false,
+            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT);
+    DO_TEST("floppy-drive-fat", false,
+            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT, QEMU_CAPS_DRIVE_FORMAT);
+    DO_TEST("disk-drive-fat", false,
+            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT, QEMU_CAPS_DRIVE_FORMAT);
+    DO_TEST("disk-drive-readonly-disk", false,
+            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_READONLY,
+            QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
+    DO_TEST("disk-drive-readonly-no-device", false,
+            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_READONLY, QEMU_CAPS_NODEFCONFIG);
+    DO_TEST("disk-drive-fmt-qcow", false,
+            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT, QEMU_CAPS_DRIVE_FORMAT);
+    DO_TEST("disk-drive-shared", false,
+            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT, QEMU_CAPS_DRIVE_SERIAL);
+    DO_TEST("disk-drive-cache-v1-wt", false,
+            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT);
+    DO_TEST("disk-drive-cache-v1-wb", false,
+            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT);
+    DO_TEST("disk-drive-cache-v1-none", false,
+            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT);
+    DO_TEST("disk-drive-error-policy-stop", false,
+            QEMU_CAPS_DRIVE, QEMU_CAPS_MONITOR_JSON, QEMU_CAPS_DRIVE_FORMAT);
+    DO_TEST("disk-drive-cache-v2-wt", false,
+            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_CACHE_V2, QEMU_CAPS_DRIVE_FORMAT);
+    DO_TEST("disk-drive-cache-v2-wb", false,
+            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_CACHE_V2, QEMU_CAPS_DRIVE_FORMAT);
+    DO_TEST("disk-drive-cache-v2-none", false,
+            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_CACHE_V2, QEMU_CAPS_DRIVE_FORMAT);
+    DO_TEST("disk-drive-network-nbd", false,
+            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT);
+    DO_TEST("disk-drive-network-rbd", false,
+            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT);
+    DO_TEST("disk-drive-network-sheepdog", false,
+            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT);
+    DO_TEST("disk-usb", false, NONE);
+    DO_TEST("disk-usb-device", false,
+            QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
+    DO_TEST("disk-scsi-device", false,
+            QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
+    DO_TEST("disk-scsi-device-auto", false,
+            QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
+    DO_TEST("disk-aio", false,
+            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_AIO,
+            QEMU_CAPS_DRIVE_CACHE_V2, QEMU_CAPS_DRIVE_FORMAT);
+    DO_TEST("graphics-vnc", false, NONE);
+    DO_TEST("graphics-vnc-socket", false, NONE);
 
     driver.vncSASL = 1;
     driver.vncSASLdir = strdup("/root/.sasl2");
-    DO_TEST("graphics-vnc-sasl", QEMU_CAPS_VGA, false);
+    DO_TEST("graphics-vnc-sasl", false, QEMU_CAPS_VGA);
     driver.vncTLS = 1;
     driver.vncTLSx509verify = 1;
     driver.vncTLSx509certdir = strdup("/etc/pki/tls/qemu");
-    DO_TEST("graphics-vnc-tls", 0, false);
+    DO_TEST("graphics-vnc-tls", false, NONE);
     driver.vncSASL = driver.vncTLSx509verify = driver.vncTLS = 0;
     free(driver.vncSASLdir);
     free(driver.vncTLSx509certdir);
     driver.vncSASLdir = driver.vncTLSx509certdir = NULL;
 
-    DO_TEST("graphics-sdl", 0, false);
-    DO_TEST("graphics-sdl-fullscreen", 0, false);
-    DO_TEST("nographics", QEMU_CAPS_VGA, false);
-    DO_TEST("nographics-vga", QEMU_CAPS_VGA |
-                              QEMU_CAPS_VGA_NONE, false);
-    DO_TEST("graphics-spice",
-            QEMU_CAPS_VGA | QEMU_CAPS_VGA_QXL |
-            QEMU_CAPS_DEVICE | QEMU_CAPS_SPICE, false);
-
-    DO_TEST("input-usbmouse", 0, false);
-    DO_TEST("input-usbtablet", 0, false);
-    DO_TEST("input-xen", QEMU_CAPS_DOMID, true);
-    DO_TEST("misc-acpi", 0, false);
-    DO_TEST("misc-no-reboot", 0, false);
-    DO_TEST("misc-uuid", QEMU_CAPS_NAME |
-            QEMU_CAPS_UUID, false);
-    DO_TEST("net-user", 0, false);
-    DO_TEST("net-virtio", 0, false);
-    DO_TEST("net-virtio-device", QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG | QEMU_CAPS_VIRTIO_TX_ALG, false);
-    DO_TEST("net-virtio-netdev", QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NETDEV | QEMU_CAPS_NODEFCONFIG, false);
-    DO_TEST("net-eth", 0, false);
-    DO_TEST("net-eth-ifname", 0, false);
-    DO_TEST("net-eth-names", QEMU_CAPS_NET_NAME, false);
-
-    DO_TEST("serial-vc", 0, false);
-    DO_TEST("serial-pty", 0, false);
-    DO_TEST("serial-dev", 0, false);
-    DO_TEST("serial-file", 0, false);
-    DO_TEST("serial-unix", 0, false);
-    DO_TEST("serial-tcp", 0, false);
-    DO_TEST("serial-udp", 0, false);
-    DO_TEST("serial-tcp-telnet", 0, false);
-    DO_TEST("serial-many", 0, false);
-    DO_TEST("parallel-tcp", 0, false);
-    DO_TEST("console-compat", 0, false);
-    DO_TEST("console-compat-auto", 0, false);
-
-    DO_TEST("serial-vc-chardev", QEMU_CAPS_CHARDEV|QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG, false);
-    DO_TEST("serial-pty-chardev", QEMU_CAPS_CHARDEV|QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG, false);
-    DO_TEST("serial-dev-chardev", QEMU_CAPS_CHARDEV|QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG, false);
-    DO_TEST("serial-file-chardev", QEMU_CAPS_CHARDEV|QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG, false);
-    DO_TEST("serial-unix-chardev", QEMU_CAPS_CHARDEV|QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG, false);
-    DO_TEST("serial-tcp-chardev", QEMU_CAPS_CHARDEV|QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG, false);
-    DO_TEST("serial-udp-chardev", QEMU_CAPS_CHARDEV|QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG, false);
-    DO_TEST("serial-tcp-telnet-chardev", QEMU_CAPS_CHARDEV|QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG, false);
-    DO_TEST("serial-many-chardev", QEMU_CAPS_CHARDEV|QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG, false);
-    DO_TEST("parallel-tcp-chardev", QEMU_CAPS_CHARDEV|QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG, false);
-    DO_TEST("console-compat-chardev", QEMU_CAPS_CHARDEV|QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG, false);
-
-    DO_TEST("channel-guestfwd", QEMU_CAPS_CHARDEV|QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG, false);
-    DO_TEST("channel-virtio", QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG, false);
-    DO_TEST("channel-virtio-auto", QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG, false);
-    DO_TEST("console-virtio", QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG, false);
-    DO_TEST("channel-spicevmc", QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG | QEMU_CAPS_SPICE |
-            QEMU_CAPS_CHARDEV_SPICEVMC, false);
-    DO_TEST("channel-spicevmc-old", QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG | QEMU_CAPS_SPICE |
-            QEMU_CAPS_DEVICE_SPICEVMC, false);
-
-    DO_TEST("smartcard-host",
-            QEMU_CAPS_CHARDEV | QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG | QEMU_CAPS_CCID_EMULATED, false);
-    DO_TEST("smartcard-host-certificates",
-            QEMU_CAPS_CHARDEV | QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG | QEMU_CAPS_CCID_EMULATED, false);
-    DO_TEST("smartcard-passthrough-tcp",
-            QEMU_CAPS_CHARDEV | QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG | QEMU_CAPS_CCID_PASSTHRU, false);
-    DO_TEST("smartcard-passthrough-spicevmc",
-            QEMU_CAPS_CHARDEV | QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG | QEMU_CAPS_CCID_PASSTHRU |
-            QEMU_CAPS_CHARDEV_SPICEVMC, false);
-    DO_TEST("smartcard-controller",
-            QEMU_CAPS_CHARDEV | QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG | QEMU_CAPS_CCID_EMULATED, false);
-
-    DO_TEST("smbios", QEMU_CAPS_SMBIOS_TYPE, false);
-
-    DO_TEST("watchdog", 0, false);
-    DO_TEST("watchdog-device", QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG, false);
-    DO_TEST("watchdog-dump", 0, false);
-    DO_TEST("balloon-device", QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG, false);
-    DO_TEST("balloon-device-auto", QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG, false);
-    DO_TEST("sound", 0, false);
-    DO_TEST("sound-device", QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG | QEMU_CAPS_HDA_DUPLEX, false);
-    DO_TEST("fs9p", QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG | QEMU_CAPS_FSDEV, false);
-
-    DO_TEST("hostdev-usb-address", 0, false);
-    DO_TEST("hostdev-usb-address-device", QEMU_CAPS_DEVICE |
-            QEMU_CAPS_NODEFCONFIG, false);
-    DO_TEST("hostdev-pci-address", QEMU_CAPS_PCIDEVICE, false);
-    DO_TEST("hostdev-pci-address-device", QEMU_CAPS_PCIDEVICE |
-            QEMU_CAPS_DEVICE | QEMU_CAPS_NODEFCONFIG, false);
-
-    DO_TEST_FULL("restore-v1", QEMU_CAPS_MIGRATE_KVM_STDIO, "stdio", 7,
-                 false);
-    DO_TEST_FULL("restore-v2", QEMU_CAPS_MIGRATE_QEMU_EXEC, "stdio", 7,
-                 false);
-    DO_TEST_FULL("restore-v2", QEMU_CAPS_MIGRATE_QEMU_EXEC, "exec:cat", 7,
-                 false);
-    DO_TEST_FULL("restore-v2-fd", QEMU_CAPS_MIGRATE_QEMU_FD, "stdio", 7,
-                 false);
-    DO_TEST_FULL("restore-v2-fd", QEMU_CAPS_MIGRATE_QEMU_FD, "fd:7", 7,
-                 false);
-    DO_TEST_FULL("migrate", QEMU_CAPS_MIGRATE_QEMU_TCP,
-                 "tcp:10.0.0.1:5000", -1, false);
-
-    DO_TEST("qemu-ns", 0, false);
-
-    DO_TEST("smp", QEMU_CAPS_SMP_TOPOLOGY, false);
-
-    DO_TEST("cpu-topology1", QEMU_CAPS_SMP_TOPOLOGY, false);
-    DO_TEST("cpu-topology2", QEMU_CAPS_SMP_TOPOLOGY, false);
-    DO_TEST("cpu-topology3", 0, false);
-    DO_TEST("cpu-minimum1", 0, false);
-    DO_TEST("cpu-minimum2", 0, false);
-    DO_TEST("cpu-exact1", 0, false);
-    DO_TEST("cpu-exact2", 0, false);
-    DO_TEST("cpu-strict1", 0, false);
-
-    DO_TEST("memtune", QEMU_CAPS_NAME, false);
-    DO_TEST("blkiotune", QEMU_CAPS_NAME, false);
+    DO_TEST("graphics-sdl", false, NONE);
+    DO_TEST("graphics-sdl-fullscreen", false, NONE);
+    DO_TEST("nographics", false, QEMU_CAPS_VGA);
+    DO_TEST("nographics-vga", false,
+            QEMU_CAPS_VGA, QEMU_CAPS_VGA_NONE);
+    DO_TEST("graphics-spice", false,
+            QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL,
+            QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE);
+
+    DO_TEST("input-usbmouse", false, NONE);
+    DO_TEST("input-usbtablet", false, NONE);
+    DO_TEST("input-xen", true, QEMU_CAPS_DOMID);
+    DO_TEST("misc-acpi", false, NONE);
+    DO_TEST("misc-no-reboot", false, NONE);
+    DO_TEST("misc-uuid", false, QEMU_CAPS_NAME, QEMU_CAPS_UUID);
+    DO_TEST("net-user", false, NONE);
+    DO_TEST("net-virtio", false, NONE);
+    DO_TEST("net-virtio-device", false,
+            QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_VIRTIO_TX_ALG);
+    DO_TEST("net-virtio-netdev", false,
+            QEMU_CAPS_DEVICE, QEMU_CAPS_NETDEV, QEMU_CAPS_NODEFCONFIG);
+    DO_TEST("net-eth", false, NONE);
+    DO_TEST("net-eth-ifname", false, NONE);
+    DO_TEST("net-eth-names", false, QEMU_CAPS_NET_NAME);
+
+    DO_TEST("serial-vc", false, NONE);
+    DO_TEST("serial-pty", false, NONE);
+    DO_TEST("serial-dev", false, NONE);
+    DO_TEST("serial-file", false, NONE);
+    DO_TEST("serial-unix", false, NONE);
+    DO_TEST("serial-tcp", false, NONE);
+    DO_TEST("serial-udp", false, NONE);
+    DO_TEST("serial-tcp-telnet", false, NONE);
+    DO_TEST("serial-many", false, NONE);
+    DO_TEST("parallel-tcp", false, NONE);
+    DO_TEST("console-compat", false, NONE);
+    DO_TEST("console-compat-auto", false, NONE);
+
+    DO_TEST("serial-vc-chardev", false,
+            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
+    DO_TEST("serial-pty-chardev", false,
+            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
+    DO_TEST("serial-dev-chardev", false,
+            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
+    DO_TEST("serial-file-chardev", false,
+            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
+    DO_TEST("serial-unix-chardev", false,
+            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
+    DO_TEST("serial-tcp-chardev", false,
+            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
+    DO_TEST("serial-udp-chardev", false,
+            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
+    DO_TEST("serial-tcp-telnet-chardev", false,
+            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
+    DO_TEST("serial-many-chardev", false,
+            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
+    DO_TEST("parallel-tcp-chardev", false,
+            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
+    DO_TEST("console-compat-chardev", false,
+            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
+
+    DO_TEST("channel-guestfwd", false,
+            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
+    DO_TEST("channel-virtio", false,
+            QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
+    DO_TEST("channel-virtio-auto", false,
+            QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
+    DO_TEST("console-virtio", false,
+            QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
+    DO_TEST("channel-spicevmc", false,
+            QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG,
+            QEMU_CAPS_SPICE, QEMU_CAPS_CHARDEV_SPICEVMC);
+    DO_TEST("channel-spicevmc-old", false,
+            QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG,
+            QEMU_CAPS_SPICE, QEMU_CAPS_DEVICE_SPICEVMC);
+
+    DO_TEST("smartcard-host", false,
+            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE,
+            QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_CCID_EMULATED);
+    DO_TEST("smartcard-host-certificates", false,
+            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE,
+            QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_CCID_EMULATED);
+    DO_TEST("smartcard-passthrough-tcp", false,
+            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE,
+            QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_CCID_PASSTHRU);
+    DO_TEST("smartcard-passthrough-spicevmc", false,
+            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG,
+            QEMU_CAPS_CCID_PASSTHRU, QEMU_CAPS_CHARDEV_SPICEVMC);
+    DO_TEST("smartcard-controller", false,
+            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE,
+            QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_CCID_EMULATED);
+
+    DO_TEST("smbios", false, QEMU_CAPS_SMBIOS_TYPE);
+
+    DO_TEST("watchdog", false, NONE);
+    DO_TEST("watchdog-device", false, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
+    DO_TEST("watchdog-dump", false, NONE);
+    DO_TEST("balloon-device", false, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
+    DO_TEST("balloon-device-auto", false,
+            QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
+    DO_TEST("sound", false, NONE);
+    DO_TEST("sound-device", false,
+            QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_HDA_DUPLEX);
+    DO_TEST("fs9p", false,
+            QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_FSDEV);
+
+    DO_TEST("hostdev-usb-address", false, NONE);
+    DO_TEST("hostdev-usb-address-device", false,
+            QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
+    DO_TEST("hostdev-pci-address", false, QEMU_CAPS_PCIDEVICE);
+    DO_TEST("hostdev-pci-address-device", false,
+            QEMU_CAPS_PCIDEVICE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
+
+    DO_TEST_FULL("restore-v1", "stdio", 7, false,
+            QEMU_CAPS_MIGRATE_KVM_STDIO);
+    DO_TEST_FULL("restore-v2", "stdio", 7, false,
+            QEMU_CAPS_MIGRATE_QEMU_EXEC);
+    DO_TEST_FULL("restore-v2", "exec:cat", 7, false,
+            QEMU_CAPS_MIGRATE_QEMU_EXEC);
+    DO_TEST_FULL("restore-v2-fd", "stdio", 7, false,
+            QEMU_CAPS_MIGRATE_QEMU_FD);
+    DO_TEST_FULL("restore-v2-fd", "fd:7", 7, false,
+            QEMU_CAPS_MIGRATE_QEMU_FD);
+    DO_TEST_FULL("migrate", "tcp:10.0.0.1:5000", -1, false,
+            QEMU_CAPS_MIGRATE_QEMU_TCP);
+
+    DO_TEST("qemu-ns", false, NONE);
+
+    DO_TEST("smp", false, QEMU_CAPS_SMP_TOPOLOGY);
+
+    DO_TEST("cpu-topology1", false, QEMU_CAPS_SMP_TOPOLOGY);
+    DO_TEST("cpu-topology2", false, QEMU_CAPS_SMP_TOPOLOGY);
+    DO_TEST("cpu-topology3", false, NONE);
+    DO_TEST("cpu-minimum1", false, NONE);
+    DO_TEST("cpu-minimum2", false, NONE);
+    DO_TEST("cpu-exact1", false, NONE);
+    DO_TEST("cpu-exact2", false, NONE);
+    DO_TEST("cpu-strict1", false, NONE);
+
+    DO_TEST("memtune", false, QEMU_CAPS_NAME);
+    DO_TEST("blkiotune", false, QEMU_CAPS_NAME);
 
     free(driver.stateDir);
     virCapabilitiesFree(driver.caps);