]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Add virQEMUCapsSupportsGICVersion()
authorAndrea Bolognani <abologna@redhat.com>
Mon, 16 May 2016 11:23:01 +0000 (13:23 +0200)
committerAndrea Bolognani <abologna@redhat.com>
Wed, 18 May 2016 08:39:00 +0000 (10:39 +0200)
This utility function extracts some of the logic from
virQEMUCapsFillDomainFeatureGICCaps() so that it can be used
in a different context.

src/qemu/qemu_capabilities.c
src/qemu/qemu_capabilities.h

index 75401cc5928974d48890d2a10b7e11c0d43b8a79..1c79dbc9a45940220843172881aa14bd51f6d0ba 100644 (file)
@@ -4233,6 +4233,44 @@ virQEMUCapsFillDomainDeviceHostdevCaps(virQEMUCapsPtr qemuCaps,
 }
 
 
+/**
+ * virQEMUCapsSupportsGICVersion:
+ * @qemuCaps: QEMU capabilities
+ * @virtType: domain type
+ * @version: GIC version
+ *
+ * Checks the QEMU binary with capabilities @qemuCaps supports a specific
+ * GIC version for a domain of type @virtType.
+ *
+ * Returns: true if the binary supports the requested GIC version, false
+ *          otherwise
+ */
+bool
+virQEMUCapsSupportsGICVersion(virQEMUCapsPtr qemuCaps,
+                              virDomainVirtType virtType,
+                              virGICVersion version)
+{
+    size_t i;
+
+    for (i = 0; i < qemuCaps->ngicCapabilities; i++) {
+        virGICCapabilityPtr cap = &(qemuCaps->gicCapabilities[i]);
+
+        if (cap->version != version)
+            continue;
+
+        if (virtType == VIR_DOMAIN_VIRT_KVM &&
+            cap->implementation & VIR_GIC_IMPLEMENTATION_KERNEL)
+            return true;
+
+        if (virtType == VIR_DOMAIN_VIRT_QEMU &&
+            cap->implementation & VIR_GIC_IMPLEMENTATION_EMULATED)
+            return true;
+    }
+
+    return false;
+}
+
+
 /**
  * virQEMUCapsFillDomainFeatureGICCaps:
  * @qemuCaps: QEMU capabilities
@@ -4257,7 +4295,7 @@ virQEMUCapsFillDomainFeatureGICCaps(virQEMUCapsPtr qemuCaps,
                                     virDomainCapsPtr domCaps)
 {
     virDomainCapsFeatureGICPtr gic = &domCaps->gic;
-    size_t i;
+    virGICVersion version;
 
     if (domCaps->arch != VIR_ARCH_ARMV7L &&
         domCaps->arch != VIR_ARCH_AARCH64)
@@ -4267,20 +4305,17 @@ virQEMUCapsFillDomainFeatureGICCaps(virQEMUCapsPtr qemuCaps,
         !STRPREFIX(domCaps->machine, "virt-"))
         return 0;
 
-    for (i = 0; i < qemuCaps->ngicCapabilities; i++) {
-        virGICCapabilityPtr cap = &qemuCaps->gicCapabilities[i];
-
-        if (domCaps->virttype == VIR_DOMAIN_VIRT_KVM &&
-            !(cap->implementation & VIR_GIC_IMPLEMENTATION_KERNEL))
-            continue;
-
-        if (domCaps->virttype == VIR_DOMAIN_VIRT_QEMU &&
-            !(cap->implementation & VIR_GIC_IMPLEMENTATION_EMULATED))
+    for (version = VIR_GIC_VERSION_LAST - 1;
+         version > VIR_GIC_VERSION_NONE;
+         version--) {
+        if (!virQEMUCapsSupportsGICVersion(qemuCaps,
+                                           domCaps->virttype,
+                                           version))
             continue;
 
         gic->supported = true;
         VIR_DOMAIN_CAPS_ENUM_SET(gic->version,
-                                 cap->version);
+                                 version);
     }
 
     return 0;
index b94a246abbe368329169df646c6d37e45b1613e2..59db6e051267f104ffef28aa2f1c1a7bf2de9655 100644 (file)
@@ -463,6 +463,10 @@ bool virQEMUCapsSupportsChardev(const virDomainDef *def,
                                 virQEMUCapsPtr qemuCaps,
                                 virDomainChrDefPtr chr);
 
+bool virQEMUCapsSupportsGICVersion(virQEMUCapsPtr qemuCaps,
+                                   virDomainVirtType virtType,
+                                   virGICVersion version);
+
 bool virQEMUCapsIsMachineSupported(virQEMUCapsPtr qemuCaps,
                                    const char *canonical_machine);