]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
domain capabilities: Expose firmware auto selection feature
authorMichal Privoznik <mprivozn@redhat.com>
Thu, 4 Apr 2019 10:42:14 +0000 (12:42 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Wed, 10 Apr 2019 11:58:51 +0000 (13:58 +0200)
If a management application wants to use firmware auto selection
feature it can't currently know if the libvirtd it's talking to
support is or not. Moreover, it doesn't know which values that
are accepted for the @firmware attribute of <os/> when parsing
will allow successful start of the domain later, i.e. if the mgmt
application wants to use 'bios' whether there exists a FW
descriptor in the system that describes bios.

This commit then adds 'firmware' enum to <os/> element in
<domainCapabilities/> XML like this:

  <enum name='firmware'>
    <value>bios</value>
    <value>efi</value>
  </enum>

We can see both 'bios' and 'efi' listed which means that there
are descriptors for both found in the system (matched with the
machine type and architecture reported in the domain capabilities
earlier and not shown here).

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Acked-by: Laszlo Ersek <lersek@redhat.com>
28 files changed:
docs/formatdomaincaps.html.in
docs/schemas/domaincaps.rng
src/conf/domain_capabilities.c
src/conf/domain_capabilities.h
src/qemu/qemu_capabilities.c
src/qemu/qemu_capabilities.h
src/qemu/qemu_driver.c
tests/Makefile.am
tests/domaincapsschemadata/qemu_1.7.0.x86_64.xml
tests/domaincapsschemadata/qemu_2.12.0-virt.aarch64.xml
tests/domaincapsschemadata/qemu_2.12.0.ppc64.xml
tests/domaincapsschemadata/qemu_2.12.0.s390x.xml
tests/domaincapsschemadata/qemu_2.12.0.x86_64.xml
tests/domaincapsschemadata/qemu_2.6.0-virt.aarch64.xml
tests/domaincapsschemadata/qemu_2.6.0.aarch64.xml
tests/domaincapsschemadata/qemu_2.6.0.ppc64.xml
tests/domaincapsschemadata/qemu_2.6.0.x86_64.xml
tests/domaincapsschemadata/qemu_2.7.0.s390x.xml
tests/domaincapsschemadata/qemu_2.8.0-tcg.x86_64.xml
tests/domaincapsschemadata/qemu_2.8.0.s390x.xml
tests/domaincapsschemadata/qemu_2.8.0.x86_64.xml
tests/domaincapsschemadata/qemu_2.9.0-q35.x86_64.xml
tests/domaincapsschemadata/qemu_2.9.0-tcg.x86_64.xml
tests/domaincapsschemadata/qemu_2.9.0.x86_64.xml
tests/domaincapsschemadata/qemu_3.0.0.s390x.xml
tests/domaincapsschemadata/qemu_3.1.0.x86_64.xml
tests/domaincapsschemadata/qemu_4.0.0.x86_64.xml
tests/domaincapstest.c

index 2583f9bead05aae72e1b7dfd3b477d98d591d9b1..b31b1729f404b87394806f2133295854d1c82243 100644 (file)
 &lt;domainCapabilities&gt;
   ...
   &lt;os supported='yes'&gt;
+    &lt;enum name='firmware'&gt;
+      &lt;value&gt;bios&lt;/value&gt;
+      &lt;value&gt;efi&lt;/value&gt;
+    &lt;/enum&gt;
     &lt;loader supported='yes'&gt;
       &lt;value&gt;/usr/share/OVMF/OVMF_CODE.fd&lt;/value&gt;
       &lt;enum name='type'&gt;
         &lt;value&gt;yes&lt;/value&gt;
         &lt;value&gt;no&lt;/value&gt;
       &lt;/enum&gt;
+      &lt;enum name='secure'&gt;
+        &lt;value&gt;yes&lt;/value&gt;
+        &lt;value&gt;no&lt;/value&gt;
+      &lt;/enum&gt;
     &lt;/loader&gt;
   &lt;/os&gt;
   ...
 &lt;domainCapabilities&gt;
 </pre>
 
+    <p>The <code>firmware</code> enum corresponds to
+      <code>firmware</code> attribute of the <code>os</code> element.
+      Plain presence of this enum means that libvirt is capable of so
+      called firmware auto selection. The listed values then represent
+      accepted values for the domain attribute. Only values for which
+      there exists a firmware descriptor that matches machine type and
+      architecture are listed, i.e. those which won't cause a failure
+      on domain startup.
+    </p>
+
     <p>For the <code>loader</code> element, the following can occur:</p>
 
     <dl>
       <dt><code>readonly</code></dt>
       <dd>Options for the <code>readonly</code> attribute of the
       &lt;loader/&gt; element.</dd>
+
+      <dt><code>secure</code></dt>
+      <dd>Options for the <code>secure</code> attribute of the
+      &lt;loader/&gt; element. Note, that <code>yes</code> is listed
+      only if there is a firmware that supports it.</dd>
     </dl>
 
     <h3><a id="elementsCPU">CPU configuration</a></h3>
index 3c42cb80753ac774168914054752cd6a150bf201..e629d6431f85893e2d1ce4b90f5bfd1250b28911 100644 (file)
@@ -77,6 +77,7 @@
     <element name='os'>
       <interleave>
         <ref name='supported'/>
+        <ref name='enum'/>
         <optional>
           <ref name='loader'/>
         </optional>
index 5a8f48da617a49ff40bd181fed90e940e4fafedf..79357394095f0835744d68e8a2c3896fd0ec1eb0 100644 (file)
@@ -415,6 +415,7 @@ virDomainCapsLoaderFormat(virBufferPtr buf,
     virDomainCapsStringValuesFormat(buf, &loader->values);
     ENUM_PROCESS(loader, type, virDomainLoaderTypeToString);
     ENUM_PROCESS(loader, readonly, virTristateBoolTypeToString);
+    ENUM_PROCESS(loader, secure, virTristateBoolTypeToString);
 
     FORMAT_EPILOGUE(loader);
 }
@@ -427,6 +428,8 @@ virDomainCapsOSFormat(virBufferPtr buf,
 
     FORMAT_PROLOGUE(os);
 
+    ENUM_PROCESS(os, firmware, virDomainOsDefFirmwareTypeToString);
+
     virDomainCapsLoaderFormat(buf, loader);
 
     FORMAT_EPILOGUE(os);
index d31d346a7b36b34c2dbb788941d2aa524f55372b..cd09d50ceec2b67ba9fad98d5aefa8c979c4e40d 100644 (file)
@@ -52,12 +52,14 @@ struct _virDomainCapsLoader {
     virDomainCapsStringValues values;   /* Info about values for the element */
     virDomainCapsEnum type;     /* Info about virDomainLoader */
     virDomainCapsEnum readonly; /* Info about readonly:virTristateBool */
+    virDomainCapsEnum secure;   /* Info about secure:virTristateBool */
 };
 
 typedef struct _virDomainCapsOS virDomainCapsOS;
 typedef virDomainCapsOS *virDomainCapsOSPtr;
 struct _virDomainCapsOS {
     virTristateBool supported;
+    virDomainCapsEnum firmware;     /* Info about virDomainOsDefFirmware */
     virDomainCapsLoader loader;     /* Info about virDomainLoaderDef */
 };
 
index 71d4c0129620de0e5052f389878e9029dfe9f1ff..a2de8630cd2d87a42b41eb3f73936922056e6eb0 100644 (file)
@@ -46,6 +46,7 @@
 #include "qemu_capspriv.h"
 #include "qemu_qapi.h"
 #include "qemu_process.h"
+#include "qemu_firmware.h"
 
 #include <fcntl.h>
 #include <sys/stat.h>
@@ -4920,6 +4921,7 @@ virQEMUCapsGetPreferredMachine(virQEMUCapsPtr qemuCaps)
 
 static int
 virQEMUCapsFillDomainLoaderCaps(virDomainCapsLoaderPtr capsLoader,
+                                bool secure,
                                 virFirmwarePtr *firmwares,
                                 size_t nfirmwares)
 {
@@ -4928,6 +4930,7 @@ virQEMUCapsFillDomainLoaderCaps(virDomainCapsLoaderPtr capsLoader,
     capsLoader->supported = VIR_TRISTATE_BOOL_YES;
     capsLoader->type.report = true;
     capsLoader->readonly.report = true;
+    capsLoader->secure.report = true;
 
     if (VIR_ALLOC_N(capsLoader->values.values, nfirmwares) < 0)
         return -1;
@@ -4956,19 +4959,42 @@ virQEMUCapsFillDomainLoaderCaps(virDomainCapsLoaderPtr capsLoader,
     VIR_DOMAIN_CAPS_ENUM_SET(capsLoader->readonly,
                              VIR_TRISTATE_BOOL_YES,
                              VIR_TRISTATE_BOOL_NO);
+
+    VIR_DOMAIN_CAPS_ENUM_SET(capsLoader->secure,
+                             VIR_TRISTATE_BOOL_NO);
+
+    if (secure)
+        VIR_DOMAIN_CAPS_ENUM_SET(capsLoader->secure,
+                                 VIR_TRISTATE_BOOL_YES);
+
     return 0;
 }
 
 
 static int
 virQEMUCapsFillDomainOSCaps(virDomainCapsOSPtr os,
+                            const char *machine,
+                            virArch arch,
+                            bool privileged,
                             virFirmwarePtr *firmwares,
                             size_t nfirmwares)
 {
     virDomainCapsLoaderPtr capsLoader = &os->loader;
+    uint64_t autoFirmwares = 0;
+    bool secure = false;
 
     os->supported = VIR_TRISTATE_BOOL_YES;
-    if (virQEMUCapsFillDomainLoaderCaps(capsLoader, firmwares, nfirmwares) < 0)
+    os->firmware.report = true;
+
+    if (qemuFirmwareGetSupported(machine, arch, privileged, &autoFirmwares, &secure) < 0)
+        return -1;
+
+    if (autoFirmwares & (1ULL << VIR_DOMAIN_OS_DEF_FIRMWARE_BIOS))
+        VIR_DOMAIN_CAPS_ENUM_SET(os->firmware, VIR_DOMAIN_OS_DEF_FIRMWARE_BIOS);
+    if (autoFirmwares & (1ULL << VIR_DOMAIN_OS_DEF_FIRMWARE_EFI))
+        VIR_DOMAIN_CAPS_ENUM_SET(os->firmware, VIR_DOMAIN_OS_DEF_FIRMWARE_EFI);
+
+    if (virQEMUCapsFillDomainLoaderCaps(capsLoader, secure, firmwares, nfirmwares) < 0)
         return -1;
     return 0;
 }
@@ -5298,6 +5324,7 @@ int
 virQEMUCapsFillDomainCaps(virCapsPtr caps,
                           virDomainCapsPtr domCaps,
                           virQEMUCapsPtr qemuCaps,
+                          bool privileged,
                           virFirmwarePtr *firmwares,
                           size_t nfirmwares)
 {
@@ -5324,7 +5351,11 @@ virQEMUCapsFillDomainCaps(virCapsPtr caps,
     domCaps->genid = virTristateBoolFromBool(
             virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VMGENID));
 
-    if (virQEMUCapsFillDomainOSCaps(os, firmwares, nfirmwares) < 0 ||
+    if (virQEMUCapsFillDomainOSCaps(os,
+                                    domCaps->machine,
+                                    domCaps->arch,
+                                    privileged,
+                                    firmwares, nfirmwares) < 0 ||
         virQEMUCapsFillDomainCPUCaps(caps, qemuCaps, domCaps) < 0 ||
         virQEMUCapsFillDomainIOThreadCaps(qemuCaps, domCaps) < 0 ||
         virQEMUCapsFillDomainDeviceDiskCaps(qemuCaps,
index 1f341fc0cd9df1fe8e55f2fdf8e79e08e722932a..9abeed9014e0ff47f68f6ab3eef782a65d447d01 100644 (file)
@@ -632,6 +632,7 @@ int virQEMUCapsInitGuestFromBinary(virCapsPtr caps,
 int virQEMUCapsFillDomainCaps(virCapsPtr caps,
                               virDomainCapsPtr domCaps,
                               virQEMUCapsPtr qemuCaps,
+                              bool privileged,
                               virFirmwarePtr *firmwares,
                               size_t nfirmwares);
 
index 1b40567dee4614092cc73061dc7212cbbdca6a5d..fe2c5862749b06de88bab7649bf9ccd2d5999f5e 100644 (file)
@@ -19857,6 +19857,7 @@ qemuConnectGetDomainCapabilities(virConnectPtr conn,
         goto cleanup;
 
     if (virQEMUCapsFillDomainCaps(caps, domCaps, qemuCaps,
+                                  driver->privileged,
                                   cfg->firmwares, cfg->nfirmwares) < 0)
         goto cleanup;
 
index 1319c3b12c1cb190d3b2edcc801b836f4e1d6220..46d94d2236f0c202ccf5c9eecd8baa0b9e87dd6e 100644 (file)
@@ -1033,7 +1033,9 @@ domaincapsmock_la_LDFLAGS = $(MOCKLIBS_LDFLAGS)
 domaincapsmock_la_LIBADD = $(MOCKLIBS_LIBS)
 
 domaincapstest_SOURCES = \
-       domaincapstest.c testutils.h testutils.c
+       domaincapstest.c testutils.h testutils.c \
+       virfilewrapper.c virfilewrapper.h \
+       $(NULL)
 domaincapstest_LDADD = $(LDADDS)
 
 if WITH_QEMU
index 497363bbe9485171fd034ffd7070211f53e86b9a..06908cc61e28d387f45966c25a13d82790e09480 100644 (file)
@@ -6,6 +6,10 @@
   <vcpu max='255'/>
   <iothreads supported='no'/>
   <os supported='yes'>
+    <enum name='firmware'>
+      <value>bios</value>
+      <value>efi</value>
+    </enum>
     <loader supported='yes'>
       <value>/usr/share/AAVMF/AAVMF_CODE.fd</value>
       <value>/usr/share/AAVMF/AAVMF32_CODE.fd</value>
@@ -18,6 +22,9 @@
         <value>yes</value>
         <value>no</value>
       </enum>
+      <enum name='secure'>
+        <value>no</value>
+      </enum>
     </loader>
   </os>
   <cpu>
index 7639df44c6b67956eb23c89e63ecc07ee163d316..5983a60887579be85c95613b0b5853dff1228e61 100644 (file)
@@ -6,6 +6,9 @@
   <vcpu max='255'/>
   <iothreads supported='yes'/>
   <os supported='yes'>
+    <enum name='firmware'>
+      <value>efi</value>
+    </enum>
     <loader supported='yes'>
       <value>/usr/share/AAVMF/AAVMF_CODE.fd</value>
       <value>/usr/share/AAVMF/AAVMF32_CODE.fd</value>
@@ -18,6 +21,9 @@
         <value>yes</value>
         <value>no</value>
       </enum>
+      <enum name='secure'>
+        <value>no</value>
+      </enum>
     </loader>
   </os>
   <cpu>
index f10d361359bcac1958a9610838f840d034bd212e..42c67623f45e8ba22b0a1ff14fd7a02b2133e0fa 100644 (file)
@@ -6,6 +6,7 @@
   <vcpu max='1024'/>
   <iothreads supported='yes'/>
   <os supported='yes'>
+    <enum name='firmware'/>
     <loader supported='yes'>
       <value>/usr/share/AAVMF/AAVMF_CODE.fd</value>
       <value>/usr/share/AAVMF/AAVMF32_CODE.fd</value>
@@ -18,6 +19,9 @@
         <value>yes</value>
         <value>no</value>
       </enum>
+      <enum name='secure'>
+        <value>no</value>
+      </enum>
     </loader>
   </os>
   <cpu>
index 41a81ff02ff9d6bef44090c4776f4cbcfb325437..4804c1332918c3a82eec7200c1fb9ef32e314dc0 100644 (file)
@@ -6,6 +6,7 @@
   <vcpu max='248'/>
   <iothreads supported='yes'/>
   <os supported='yes'>
+    <enum name='firmware'/>
     <loader supported='yes'>
       <value>/usr/share/AAVMF/AAVMF_CODE.fd</value>
       <value>/usr/share/AAVMF/AAVMF32_CODE.fd</value>
@@ -18,6 +19,9 @@
         <value>yes</value>
         <value>no</value>
       </enum>
+      <enum name='secure'>
+        <value>no</value>
+      </enum>
     </loader>
   </os>
   <cpu>
index 5913e7fc6320901d6a70fe2cd20c14b76a224cb9..f5f54cb4841c08c0f0019c5cb1f1dbdc05b20dee 100644 (file)
@@ -6,6 +6,10 @@
   <vcpu max='255'/>
   <iothreads supported='yes'/>
   <os supported='yes'>
+    <enum name='firmware'>
+      <value>bios</value>
+      <value>efi</value>
+    </enum>
     <loader supported='yes'>
       <value>/usr/share/AAVMF/AAVMF_CODE.fd</value>
       <value>/usr/share/AAVMF/AAVMF32_CODE.fd</value>
@@ -18,6 +22,9 @@
         <value>yes</value>
         <value>no</value>
       </enum>
+      <enum name='secure'>
+        <value>no</value>
+      </enum>
     </loader>
   </os>
   <cpu>
index 9ee801092ea118b3f8bf59a3865655e11130a787..99ee16e4bba1d86bbdb84dddea79bdc8df757030 100644 (file)
@@ -6,6 +6,9 @@
   <vcpu max='255'/>
   <iothreads supported='yes'/>
   <os supported='yes'>
+    <enum name='firmware'>
+      <value>efi</value>
+    </enum>
     <loader supported='yes'>
       <value>/usr/share/AAVMF/AAVMF_CODE.fd</value>
       <value>/usr/share/AAVMF/AAVMF32_CODE.fd</value>
@@ -18,6 +21,9 @@
         <value>yes</value>
         <value>no</value>
       </enum>
+      <enum name='secure'>
+        <value>no</value>
+      </enum>
     </loader>
   </os>
   <cpu>
index 4dd0b52ed3c1b15cf9ff1f7fab3c9b558d95b069..61fdae009a1cb802fc756628d758b545078598b6 100644 (file)
@@ -6,6 +6,7 @@
   <vcpu max='1'/>
   <iothreads supported='yes'/>
   <os supported='yes'>
+    <enum name='firmware'/>
     <loader supported='yes'>
       <value>/usr/share/AAVMF/AAVMF_CODE.fd</value>
       <value>/usr/share/AAVMF/AAVMF32_CODE.fd</value>
@@ -18,6 +19,9 @@
         <value>yes</value>
         <value>no</value>
       </enum>
+      <enum name='secure'>
+        <value>no</value>
+      </enum>
     </loader>
   </os>
   <cpu>
index aa982d237e92d604573f86212e61afed463386b8..a33960a2af2ccdfe1e21d76029829721b4cd8b9b 100644 (file)
@@ -6,6 +6,7 @@
   <vcpu max='255'/>
   <iothreads supported='yes'/>
   <os supported='yes'>
+    <enum name='firmware'/>
     <loader supported='yes'>
       <value>/usr/share/AAVMF/AAVMF_CODE.fd</value>
       <value>/usr/share/AAVMF/AAVMF32_CODE.fd</value>
@@ -18,6 +19,9 @@
         <value>yes</value>
         <value>no</value>
       </enum>
+      <enum name='secure'>
+        <value>no</value>
+      </enum>
     </loader>
   </os>
   <cpu>
index 6aa3f52ee441270376694186219b99a2fc9637a2..94fe08bc92193ed358f9cf91b1179bf0de894a43 100644 (file)
@@ -6,6 +6,10 @@
   <vcpu max='255'/>
   <iothreads supported='yes'/>
   <os supported='yes'>
+    <enum name='firmware'>
+      <value>bios</value>
+      <value>efi</value>
+    </enum>
     <loader supported='yes'>
       <value>/usr/share/AAVMF/AAVMF_CODE.fd</value>
       <value>/usr/share/AAVMF/AAVMF32_CODE.fd</value>
@@ -18,6 +22,9 @@
         <value>yes</value>
         <value>no</value>
       </enum>
+      <enum name='secure'>
+        <value>no</value>
+      </enum>
     </loader>
   </os>
   <cpu>
index 8daa15ab9ddb19fbc2758d62381db9870ee52f78..1057573681fb7815057a240730a32850f0e2e94f 100644 (file)
@@ -6,6 +6,7 @@
   <vcpu max='248'/>
   <iothreads supported='yes'/>
   <os supported='yes'>
+    <enum name='firmware'/>
     <loader supported='yes'>
       <value>/usr/share/AAVMF/AAVMF_CODE.fd</value>
       <value>/usr/share/AAVMF/AAVMF32_CODE.fd</value>
@@ -18,6 +19,9 @@
         <value>yes</value>
         <value>no</value>
       </enum>
+      <enum name='secure'>
+        <value>no</value>
+      </enum>
     </loader>
   </os>
   <cpu>
index 081805aa4a240c881712d63856fb1edb8d49f8df..39f3bd6d9f1090ebffe3638cfe3b98f29a0ffffb 100644 (file)
@@ -6,6 +6,10 @@
   <vcpu max='255'/>
   <iothreads supported='yes'/>
   <os supported='yes'>
+    <enum name='firmware'>
+      <value>bios</value>
+      <value>efi</value>
+    </enum>
     <loader supported='yes'>
       <value>/usr/share/AAVMF/AAVMF_CODE.fd</value>
       <value>/usr/share/AAVMF/AAVMF32_CODE.fd</value>
@@ -18,6 +22,9 @@
         <value>yes</value>
         <value>no</value>
       </enum>
+      <enum name='secure'>
+        <value>no</value>
+      </enum>
     </loader>
   </os>
   <cpu>
index 62c51e40875298ef9f6e5eced941c577c765adc9..9ae9a1a8bc01ae150b564765777535fb21bd0d19 100644 (file)
@@ -6,6 +6,7 @@
   <vcpu max='248'/>
   <iothreads supported='yes'/>
   <os supported='yes'>
+    <enum name='firmware'/>
     <loader supported='yes'>
       <value>/usr/share/AAVMF/AAVMF_CODE.fd</value>
       <value>/usr/share/AAVMF/AAVMF32_CODE.fd</value>
@@ -18,6 +19,9 @@
         <value>yes</value>
         <value>no</value>
       </enum>
+      <enum name='secure'>
+        <value>no</value>
+      </enum>
     </loader>
   </os>
   <cpu>
index 1bb034aa4fe039c9011c38fa32ed666574d78517..1770c81fdbbf295027be9f5aa891bfae7b6a0568 100644 (file)
@@ -6,6 +6,10 @@
   <vcpu max='255'/>
   <iothreads supported='yes'/>
   <os supported='yes'>
+    <enum name='firmware'>
+      <value>bios</value>
+      <value>efi</value>
+    </enum>
     <loader supported='yes'>
       <value>/usr/share/AAVMF/AAVMF_CODE.fd</value>
       <value>/usr/share/AAVMF/AAVMF32_CODE.fd</value>
@@ -18,6 +22,9 @@
         <value>yes</value>
         <value>no</value>
       </enum>
+      <enum name='secure'>
+        <value>no</value>
+      </enum>
     </loader>
   </os>
   <cpu>
index 67c6d5e77e3c72dbbc7a1c038f6fb5071c2277db..e2ec30fda7e2f04fcdd29b6d551a76d614634c2d 100644 (file)
@@ -6,6 +6,10 @@
   <vcpu max='288'/>
   <iothreads supported='yes'/>
   <os supported='yes'>
+    <enum name='firmware'>
+      <value>bios</value>
+      <value>efi</value>
+    </enum>
     <loader supported='yes'>
       <value>/usr/share/AAVMF/AAVMF_CODE.fd</value>
       <value>/usr/share/AAVMF/AAVMF32_CODE.fd</value>
         <value>yes</value>
         <value>no</value>
       </enum>
+      <enum name='secure'>
+        <value>yes</value>
+        <value>no</value>
+      </enum>
     </loader>
   </os>
   <cpu>
index 588ef08199b682c7577d20889d3614a1227f11f4..65226ee284150c8582ce3e4141d2fdc358d32132 100644 (file)
@@ -6,6 +6,10 @@
   <vcpu max='255'/>
   <iothreads supported='yes'/>
   <os supported='yes'>
+    <enum name='firmware'>
+      <value>bios</value>
+      <value>efi</value>
+    </enum>
     <loader supported='yes'>
       <value>/usr/share/AAVMF/AAVMF_CODE.fd</value>
       <value>/usr/share/AAVMF/AAVMF32_CODE.fd</value>
@@ -18,6 +22,9 @@
         <value>yes</value>
         <value>no</value>
       </enum>
+      <enum name='secure'>
+        <value>no</value>
+      </enum>
     </loader>
   </os>
   <cpu>
index 598937a9719b602fdb16649e8508dc70a96297b8..0093877a0b006064b8bac2493ca2f4a22e8a9649 100644 (file)
@@ -6,6 +6,10 @@
   <vcpu max='255'/>
   <iothreads supported='yes'/>
   <os supported='yes'>
+    <enum name='firmware'>
+      <value>bios</value>
+      <value>efi</value>
+    </enum>
     <loader supported='yes'>
       <value>/usr/share/AAVMF/AAVMF_CODE.fd</value>
       <value>/usr/share/AAVMF/AAVMF32_CODE.fd</value>
@@ -18,6 +22,9 @@
         <value>yes</value>
         <value>no</value>
       </enum>
+      <enum name='secure'>
+        <value>no</value>
+      </enum>
     </loader>
   </os>
   <cpu>
index 1d97f1f344d072625d435700fbf26067bc1d84bd..c8efefc5ba073b2a0de1c42f7b0fd3a4ae1f21ce 100644 (file)
@@ -6,6 +6,7 @@
   <vcpu max='248'/>
   <iothreads supported='yes'/>
   <os supported='yes'>
+    <enum name='firmware'/>
     <loader supported='yes'>
       <value>/usr/share/AAVMF/AAVMF_CODE.fd</value>
       <value>/usr/share/AAVMF/AAVMF32_CODE.fd</value>
@@ -18,6 +19,9 @@
         <value>yes</value>
         <value>no</value>
       </enum>
+      <enum name='secure'>
+        <value>no</value>
+      </enum>
     </loader>
   </os>
   <cpu>
index f3a33aee98b15ca4362b9c79b13fc5d8431ad504..f38a098a3d3534991160f0c3ea3d2e314acb3bfe 100644 (file)
@@ -6,6 +6,10 @@
   <vcpu max='255'/>
   <iothreads supported='yes'/>
   <os supported='yes'>
+    <enum name='firmware'>
+      <value>bios</value>
+      <value>efi</value>
+    </enum>
     <loader supported='yes'>
       <value>/usr/share/AAVMF/AAVMF_CODE.fd</value>
       <value>/usr/share/AAVMF/AAVMF32_CODE.fd</value>
@@ -18,6 +22,9 @@
         <value>yes</value>
         <value>no</value>
       </enum>
+      <enum name='secure'>
+        <value>no</value>
+      </enum>
     </loader>
   </os>
   <cpu>
index df66be9e29f9fd32659e33275e1ace4eda5bda07..ef8184c06bc55fc19f45a70bc247e8c33738f751 100644 (file)
@@ -6,6 +6,10 @@
   <vcpu max='255'/>
   <iothreads supported='yes'/>
   <os supported='yes'>
+    <enum name='firmware'>
+      <value>bios</value>
+      <value>efi</value>
+    </enum>
     <loader supported='yes'>
       <value>/usr/share/AAVMF/AAVMF_CODE.fd</value>
       <value>/usr/share/AAVMF/AAVMF32_CODE.fd</value>
@@ -18,6 +22,9 @@
         <value>yes</value>
         <value>no</value>
       </enum>
+      <enum name='secure'>
+        <value>no</value>
+      </enum>
     </loader>
   </os>
   <cpu>
index 77c5fcfb737cbce66f172f77ba9cad0c74d8ec28..3ee95a4b58d856020b08a128f03d4239a74218ce 100644 (file)
@@ -20,6 +20,8 @@
 
 #include "testutils.h"
 #include "domain_capabilities.h"
+#include "virfilewrapper.h"
+#include "configmake.h"
 
 
 #define VIR_FROM_THIS VIR_FROM_NONE
@@ -104,6 +106,7 @@ fillQemuCaps(virDomainCapsPtr domCaps,
         goto cleanup;
 
     if (virQEMUCapsFillDomainCaps(caps, domCaps, qemuCaps,
+                                  false,
                                   cfg->firmwares,
                                   cfg->nfirmwares) < 0)
         goto cleanup;
@@ -364,6 +367,13 @@ mymain(void)
 
 #if WITH_QEMU
 
+    virFileWrapperAddPrefix(SYSCONFDIR "/qemu/firmware",
+                            abs_srcdir "/qemufirmwaredata/etc/qemu/firmware");
+    virFileWrapperAddPrefix(PREFIX "/share/qemu/firmware",
+                            abs_srcdir "/qemufirmwaredata/usr/share/qemu/firmware");
+    virFileWrapperAddPrefix("/home/user/.config/qemu/firmware",
+                            abs_srcdir "/qemufirmwaredata/home/user/.config/qemu/firmware");
+
     DO_TEST_QEMU("1.7.0", "caps_1.7.0",
                  "/usr/bin/qemu-system-x86_64", NULL,
                  "x86_64", VIR_DOMAIN_VIRT_KVM);
@@ -441,6 +451,10 @@ mymain(void)
                  "x86_64", VIR_DOMAIN_VIRT_KVM);
     virObjectUnref(cfg);
 
+    virFileWrapperRemovePrefix(SYSCONFDIR "/qemu/firmware");
+    virFileWrapperRemovePrefix(PREFIX "/share/qemu/firmware");
+    virFileWrapperRemovePrefix("/home/user/.config/qemu/firmware");
+
 #endif /* WITH_QEMU */
 
 #if WITH_LIBXL
@@ -462,6 +476,8 @@ mymain(void)
     DO_TEST_BHYVE("fbuf", "/usr/sbin/bhyve", &bhyve_caps, VIR_DOMAIN_VIRT_BHYVE);
 #endif /* WITH_BHYVE */
 
+    virFileWrapperClearPrefixes();
+
     return ret;
 }