Blame SOURCES/libvirt-qemu-support-firmware-descriptor-flash-mode-for-optional-NVRAM.patch

119c2d
From 3cde498c98be902fc8fe87c895dfeaaa95352b38 Mon Sep 17 00:00:00 2001
119c2d
Message-Id: <3cde498c98be902fc8fe87c895dfeaaa95352b38@dist-git>
119c2d
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
119c2d
Date: Thu, 3 Feb 2022 13:43:18 +0000
119c2d
Subject: [PATCH] qemu: support firmware descriptor flash 'mode' for optional
119c2d
 NVRAM
119c2d
MIME-Version: 1.0
119c2d
Content-Type: text/plain; charset=UTF-8
119c2d
Content-Transfer-Encoding: 8bit
119c2d
119c2d
Currently the 'nvram_template' entry is mandatory when parsing the
119c2d
firmware descriptor based on flash. QEMU is extending the firmware
119c2d
descriptor spec to make the 'nvram_template' optional, depending
119c2d
on the value of a new 'mode' field:
119c2d
119c2d
  - "split"
119c2d
      * "executable" contains read-only CODE
119c2d
      * "nvram_template" contains read-write VARS
119c2d
119c2d
  - "combined"
119c2d
      * "executable" contains read-write CODE and VARs
119c2d
      * "nvram_template" not present
119c2d
119c2d
  - "stateless"
119c2d
      * "executable" contains read-only CODE and VARs
119c2d
      * "nvram_template" not present
119c2d
119c2d
In the latter case, the guest OS can write vars but the
119c2d
firmware will make no attempt to persist them, so any changes
119c2d
will be lost at poweroff.
119c2d
119c2d
For now we parse this new 'mode' but discard any firmware
119c2d
which is not 'mode=split' when matching for a domain.
119c2d
119c2d
In the tests we have a mixture of files with and without the
119c2d
mode attribute.
119c2d
119c2d
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
119c2d
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
119c2d
(cherry picked from commit 32b9d8b0ae00669555f01f91ee11612a636c4b69)
119c2d
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2057769
119c2d
---
119c2d
 src/qemu/qemu_firmware.c                      | 79 ++++++++++++++++---
119c2d
 .../share/qemu/firmware/50-ovmf-sb-keys.json  | 33 ++++++++
119c2d
 .../out/usr/share/qemu/firmware/61-ovmf.json  | 31 ++++++++
119c2d
 .../out/usr/share/qemu/firmware/70-aavmf.json | 28 +++++++
119c2d
 .../qemu/firmware/45-ovmf-sev-stateless.json  | 31 ++++++++
119c2d
 .../qemu/firmware/55-ovmf-sb-combined.json    | 33 ++++++++
119c2d
 .../usr/share/qemu/firmware/60-ovmf-sb.json   |  1 +
119c2d
 tests/qemufirmwaretest.c                      | 31 ++++++--
119c2d
 8 files changed, 246 insertions(+), 21 deletions(-)
119c2d
 create mode 100644 tests/qemufirmwaredata/out/usr/share/qemu/firmware/50-ovmf-sb-keys.json
119c2d
 create mode 100644 tests/qemufirmwaredata/out/usr/share/qemu/firmware/61-ovmf.json
119c2d
 create mode 100644 tests/qemufirmwaredata/out/usr/share/qemu/firmware/70-aavmf.json
119c2d
 create mode 100644 tests/qemufirmwaredata/usr/share/qemu/firmware/45-ovmf-sev-stateless.json
119c2d
 create mode 100644 tests/qemufirmwaredata/usr/share/qemu/firmware/55-ovmf-sb-combined.json
119c2d
119c2d
diff --git a/src/qemu/qemu_firmware.c b/src/qemu/qemu_firmware.c
119c2d
index 529ab8d68e..7911d45aa0 100644
119c2d
--- a/src/qemu/qemu_firmware.c
119c2d
+++ b/src/qemu/qemu_firmware.c
119c2d
@@ -59,6 +59,22 @@ VIR_ENUM_IMPL(qemuFirmwareOSInterface,
119c2d
 );
119c2d
 
119c2d
 
119c2d
+typedef enum {
119c2d
+    QEMU_FIRMWARE_FLASH_MODE_SPLIT,
119c2d
+    QEMU_FIRMWARE_FLASH_MODE_COMBINED,
119c2d
+    QEMU_FIRMWARE_FLASH_MODE_STATELESS,
119c2d
+
119c2d
+    QEMU_FIRMWARE_FLASH_MODE_LAST,
119c2d
+} qemuFirmwareFlashMode;
119c2d
+
119c2d
+VIR_ENUM_DECL(qemuFirmwareFlashMode);
119c2d
+VIR_ENUM_IMPL(qemuFirmwareFlashMode,
119c2d
+              QEMU_FIRMWARE_FLASH_MODE_LAST,
119c2d
+              "split",
119c2d
+              "combined",
119c2d
+              "stateless",
119c2d
+);
119c2d
+
119c2d
 typedef struct _qemuFirmwareFlashFile qemuFirmwareFlashFile;
119c2d
 struct _qemuFirmwareFlashFile {
119c2d
     char *filename;
119c2d
@@ -68,6 +84,7 @@ struct _qemuFirmwareFlashFile {
119c2d
 
119c2d
 typedef struct _qemuFirmwareMappingFlash qemuFirmwareMappingFlash;
119c2d
 struct _qemuFirmwareMappingFlash {
119c2d
+    qemuFirmwareFlashMode mode;
119c2d
     qemuFirmwareFlashFile executable;
119c2d
     qemuFirmwareFlashFile nvram_template;
119c2d
 };
119c2d
@@ -359,9 +376,31 @@ qemuFirmwareMappingFlashParse(const char *path,
119c2d
                               virJSONValue *doc,
119c2d
                               qemuFirmwareMappingFlash *flash)
119c2d
 {
119c2d
+    virJSONValue *mode;
119c2d
     virJSONValue *executable;
119c2d
     virJSONValue *nvram_template;
119c2d
 
119c2d
+    if (!(mode = virJSONValueObjectGet(doc, "mode"))) {
119c2d
+        /* Historical default */
119c2d
+        flash->mode = QEMU_FIRMWARE_FLASH_MODE_SPLIT;
119c2d
+    } else {
119c2d
+        const char *modestr = virJSONValueGetString(mode);
119c2d
+        int modeval;
119c2d
+        if (!modestr) {
119c2d
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
119c2d
+                           _("Firmware flash mode value was malformed"));
119c2d
+            return -1;
119c2d
+        }
119c2d
+        modeval = qemuFirmwareFlashModeTypeFromString(modestr);
119c2d
+        if (modeval < 0) {
119c2d
+            virReportError(VIR_ERR_INTERNAL_ERROR,
119c2d
+                           _("Firmware flash mode value '%s' unexpected"),
119c2d
+                           modestr);
119c2d
+            return -1;
119c2d
+        }
119c2d
+        flash->mode = modeval;
119c2d
+    }
119c2d
+
119c2d
     if (!(executable = virJSONValueObjectGet(doc, "executable"))) {
119c2d
         virReportError(VIR_ERR_INTERNAL_ERROR,
119c2d
                        _("missing 'executable' in '%s'"),
119c2d
@@ -372,15 +411,17 @@ qemuFirmwareMappingFlashParse(const char *path,
119c2d
     if (qemuFirmwareFlashFileParse(path, executable, &flash->executable) < 0)
119c2d
         return -1;
119c2d
 
119c2d
-    if (!(nvram_template = virJSONValueObjectGet(doc, "nvram-template"))) {
119c2d
-        virReportError(VIR_ERR_INTERNAL_ERROR,
119c2d
-                       _("missing 'nvram-template' in '%s'"),
119c2d
-                       path);
119c2d
-        return -1;
119c2d
-    }
119c2d
+    if (flash->mode == QEMU_FIRMWARE_FLASH_MODE_SPLIT) {
119c2d
+        if (!(nvram_template = virJSONValueObjectGet(doc, "nvram-template"))) {
119c2d
+            virReportError(VIR_ERR_INTERNAL_ERROR,
119c2d
+                           _("missing 'nvram-template' in '%s'"),
119c2d
+                           path);
119c2d
+            return -1;
119c2d
+        }
119c2d
 
119c2d
-    if (qemuFirmwareFlashFileParse(path, nvram_template, &flash->nvram_template) < 0)
119c2d
-        return -1;
119c2d
+        if (qemuFirmwareFlashFileParse(path, nvram_template, &flash->nvram_template) < 0)
119c2d
+            return -1;
119c2d
+    }
119c2d
 
119c2d
     return 0;
119c2d
 }
119c2d
@@ -693,10 +734,12 @@ qemuFirmwareMappingFlashFormat(virJSONValue *mapping,
119c2d
     g_autoptr(virJSONValue) executable = NULL;
119c2d
     g_autoptr(virJSONValue) nvram_template = NULL;
119c2d
 
119c2d
-    if (!(executable = qemuFirmwareFlashFileFormat(flash->executable)))
119c2d
+    if (virJSONValueObjectAppendString(mapping,
119c2d
+                                       "mode",
119c2d
+                                       qemuFirmwareFlashModeTypeToString(flash->mode)) < 0)
119c2d
         return -1;
119c2d
 
119c2d
-    if (!(nvram_template = qemuFirmwareFlashFileFormat(flash->nvram_template)))
119c2d
+    if (!(executable = qemuFirmwareFlashFileFormat(flash->executable)))
119c2d
         return -1;
119c2d
 
119c2d
     if (virJSONValueObjectAppend(mapping,
119c2d
@@ -704,11 +747,15 @@ qemuFirmwareMappingFlashFormat(virJSONValue *mapping,
119c2d
                                  &executable) < 0)
119c2d
         return -1;
119c2d
 
119c2d
+    if (flash->mode == QEMU_FIRMWARE_FLASH_MODE_SPLIT) {
119c2d
+        if (!(nvram_template = qemuFirmwareFlashFileFormat(flash->nvram_template)))
119c2d
+            return -1;
119c2d
 
119c2d
-    if (virJSONValueObjectAppend(mapping,
119c2d
+        if (virJSONValueObjectAppend(mapping,
119c2d
                                  "nvram-template",
119c2d
-                                 &nvram_template) < 0)
119c2d
-        return -1;
119c2d
+                                     &nvram_template) < 0)
119c2d
+            return -1;
119c2d
+    }
119c2d
 
119c2d
     return 0;
119c2d
 }
119c2d
@@ -1053,6 +1100,12 @@ qemuFirmwareMatchDomain(const virDomainDef *def,
119c2d
         return false;
119c2d
     }
119c2d
 
119c2d
+    if (fw->mapping.device == QEMU_FIRMWARE_DEVICE_FLASH &&
119c2d
+        fw->mapping.data.flash.mode != QEMU_FIRMWARE_FLASH_MODE_SPLIT) {
119c2d
+        VIR_DEBUG("Discarding loader without split flash");
119c2d
+        return false;
119c2d
+    }
119c2d
+
119c2d
     if (def->sec) {
119c2d
         switch ((virDomainLaunchSecurity) def->sec->sectype) {
119c2d
         case VIR_DOMAIN_LAUNCH_SECURITY_SEV:
119c2d
diff --git a/tests/qemufirmwaredata/out/usr/share/qemu/firmware/50-ovmf-sb-keys.json b/tests/qemufirmwaredata/out/usr/share/qemu/firmware/50-ovmf-sb-keys.json
119c2d
new file mode 100644
119c2d
index 0000000000..c251682cd9
119c2d
--- /dev/null
119c2d
+++ b/tests/qemufirmwaredata/out/usr/share/qemu/firmware/50-ovmf-sb-keys.json
119c2d
@@ -0,0 +1,33 @@
119c2d
+{
119c2d
+    "interface-types": [
119c2d
+        "uefi"
119c2d
+    ],
119c2d
+    "mapping": {
119c2d
+        "device": "flash",
119c2d
+        "mode": "split",
119c2d
+        "executable": {
119c2d
+            "filename": "/usr/share/OVMF/OVMF_CODE.secboot.fd",
119c2d
+            "format": "raw"
119c2d
+        },
119c2d
+        "nvram-template": {
119c2d
+            "filename": "/usr/share/OVMF/OVMF_VARS.secboot.fd",
119c2d
+            "format": "raw"
119c2d
+        }
119c2d
+    },
119c2d
+    "targets": [
119c2d
+        {
119c2d
+            "architecture": "x86_64",
119c2d
+            "machines": [
119c2d
+                "pc-q35-*"
119c2d
+            ]
119c2d
+        }
119c2d
+    ],
119c2d
+    "features": [
119c2d
+        "acpi-s3",
119c2d
+        "amd-sev",
119c2d
+        "enrolled-keys",
119c2d
+        "requires-smm",
119c2d
+        "secure-boot",
119c2d
+        "verbose-dynamic"
119c2d
+    ]
119c2d
+}
119c2d
diff --git a/tests/qemufirmwaredata/out/usr/share/qemu/firmware/61-ovmf.json b/tests/qemufirmwaredata/out/usr/share/qemu/firmware/61-ovmf.json
119c2d
new file mode 100644
119c2d
index 0000000000..2a9aa23efb
119c2d
--- /dev/null
119c2d
+++ b/tests/qemufirmwaredata/out/usr/share/qemu/firmware/61-ovmf.json
119c2d
@@ -0,0 +1,31 @@
119c2d
+{
119c2d
+    "interface-types": [
119c2d
+        "uefi"
119c2d
+    ],
119c2d
+    "mapping": {
119c2d
+        "device": "flash",
119c2d
+        "mode": "split",
119c2d
+        "executable": {
119c2d
+            "filename": "/usr/share/OVMF/OVMF_CODE.fd",
119c2d
+            "format": "raw"
119c2d
+        },
119c2d
+        "nvram-template": {
119c2d
+            "filename": "/usr/share/OVMF/OVMF_VARS.fd",
119c2d
+            "format": "raw"
119c2d
+        }
119c2d
+    },
119c2d
+    "targets": [
119c2d
+        {
119c2d
+            "architecture": "x86_64",
119c2d
+            "machines": [
119c2d
+                "pc-i440fx-*",
119c2d
+                "pc-q35-*"
119c2d
+            ]
119c2d
+        }
119c2d
+    ],
119c2d
+    "features": [
119c2d
+        "acpi-s3",
119c2d
+        "amd-sev",
119c2d
+        "verbose-dynamic"
119c2d
+    ]
119c2d
+}
119c2d
diff --git a/tests/qemufirmwaredata/out/usr/share/qemu/firmware/70-aavmf.json b/tests/qemufirmwaredata/out/usr/share/qemu/firmware/70-aavmf.json
119c2d
new file mode 100644
119c2d
index 0000000000..9bd5ac2868
119c2d
--- /dev/null
119c2d
+++ b/tests/qemufirmwaredata/out/usr/share/qemu/firmware/70-aavmf.json
119c2d
@@ -0,0 +1,28 @@
119c2d
+{
119c2d
+    "interface-types": [
119c2d
+        "uefi"
119c2d
+    ],
119c2d
+    "mapping": {
119c2d
+        "device": "flash",
119c2d
+        "mode": "split",
119c2d
+        "executable": {
119c2d
+            "filename": "/usr/share/AAVMF/AAVMF_CODE.fd",
119c2d
+            "format": "raw"
119c2d
+        },
119c2d
+        "nvram-template": {
119c2d
+            "filename": "/usr/share/AAVMF/AAVMF_VARS.fd",
119c2d
+            "format": "raw"
119c2d
+        }
119c2d
+    },
119c2d
+    "targets": [
119c2d
+        {
119c2d
+            "architecture": "aarch64",
119c2d
+            "machines": [
119c2d
+                "virt-*"
119c2d
+            ]
119c2d
+        }
119c2d
+    ],
119c2d
+    "features": [
119c2d
+
119c2d
+    ]
119c2d
+}
119c2d
diff --git a/tests/qemufirmwaredata/usr/share/qemu/firmware/45-ovmf-sev-stateless.json b/tests/qemufirmwaredata/usr/share/qemu/firmware/45-ovmf-sev-stateless.json
119c2d
new file mode 100644
119c2d
index 0000000000..5a619f3ab0
119c2d
--- /dev/null
119c2d
+++ b/tests/qemufirmwaredata/usr/share/qemu/firmware/45-ovmf-sev-stateless.json
119c2d
@@ -0,0 +1,31 @@
119c2d
+{
119c2d
+    "description": "OVMF for x86_64, with SEV, without SB, without SMM, with NO varstore",
119c2d
+    "interface-types": [
119c2d
+        "uefi"
119c2d
+    ],
119c2d
+    "mapping": {
119c2d
+        "device": "flash",
119c2d
+        "mode": "stateless",
119c2d
+        "executable": {
119c2d
+            "filename": "/usr/share/OVMF/OVMF.sev.fd",
119c2d
+            "format": "raw"
119c2d
+        }
119c2d
+    },
119c2d
+    "targets": [
119c2d
+        {
119c2d
+            "architecture": "x86_64",
119c2d
+            "machines": [
119c2d
+                "pc-q35-*"
119c2d
+            ]
119c2d
+        }
119c2d
+    ],
119c2d
+    "features": [
119c2d
+        "acpi-s3",
119c2d
+        "amd-sev",
119c2d
+        "amd-sev-es",
119c2d
+        "verbose-dynamic"
119c2d
+    ],
119c2d
+    "tags": [
119c2d
+
119c2d
+    ]
119c2d
+}
119c2d
diff --git a/tests/qemufirmwaredata/usr/share/qemu/firmware/55-ovmf-sb-combined.json b/tests/qemufirmwaredata/usr/share/qemu/firmware/55-ovmf-sb-combined.json
119c2d
new file mode 100644
119c2d
index 0000000000..eb3332e4ab
119c2d
--- /dev/null
119c2d
+++ b/tests/qemufirmwaredata/usr/share/qemu/firmware/55-ovmf-sb-combined.json
119c2d
@@ -0,0 +1,33 @@
119c2d
+{
119c2d
+    "description": "OVMF with SB+SMM, SB enabled, MS certs enrolled",
119c2d
+    "interface-types": [
119c2d
+        "uefi"
119c2d
+    ],
119c2d
+    "mapping": {
119c2d
+        "device": "flash",
119c2d
+	"mode": "combined",
119c2d
+        "executable": {
119c2d
+            "filename": "/usr/share/OVMF/OVMF.secboot.fd",
119c2d
+            "format": "raw"
119c2d
+        }
119c2d
+    },
119c2d
+    "targets": [
119c2d
+        {
119c2d
+            "architecture": "x86_64",
119c2d
+            "machines": [
119c2d
+                "pc-q35-*"
119c2d
+            ]
119c2d
+        }
119c2d
+    ],
119c2d
+    "features": [
119c2d
+        "acpi-s3",
119c2d
+        "amd-sev",
119c2d
+        "enrolled-keys",
119c2d
+        "requires-smm",
119c2d
+        "secure-boot",
119c2d
+        "verbose-dynamic"
119c2d
+    ],
119c2d
+    "tags": [
119c2d
+
119c2d
+    ]
119c2d
+}
119c2d
diff --git a/tests/qemufirmwaredata/usr/share/qemu/firmware/60-ovmf-sb.json b/tests/qemufirmwaredata/usr/share/qemu/firmware/60-ovmf-sb.json
119c2d
index 5e8a94ae78..a5273a5e8b 100644
119c2d
--- a/tests/qemufirmwaredata/usr/share/qemu/firmware/60-ovmf-sb.json
119c2d
+++ b/tests/qemufirmwaredata/usr/share/qemu/firmware/60-ovmf-sb.json
119c2d
@@ -5,6 +5,7 @@
119c2d
     ],
119c2d
     "mapping": {
119c2d
         "device": "flash",
119c2d
+        "mode": "split",
119c2d
         "executable": {
119c2d
             "filename": "/usr/share/OVMF/OVMF_CODE.secboot.fd",
119c2d
             "format": "raw"
119c2d
diff --git a/tests/qemufirmwaretest.c b/tests/qemufirmwaretest.c
119c2d
index cad4b6d383..fc3416b2ae 100644
119c2d
--- a/tests/qemufirmwaretest.c
119c2d
+++ b/tests/qemufirmwaretest.c
119c2d
@@ -17,22 +17,31 @@ static int
119c2d
 testParseFormatFW(const void *opaque)
119c2d
 {
119c2d
     const char *filename = opaque;
119c2d
-    g_autofree char *path = NULL;
119c2d
+    g_autofree char *inpath = NULL;
119c2d
+    g_autofree char *outpath = NULL;
119c2d
     g_autoptr(qemuFirmware) fw = NULL;
119c2d
-    g_autofree char *buf = NULL;
119c2d
     g_autoptr(virJSONValue) json = NULL;
119c2d
     g_autofree char *expected = NULL;
119c2d
     g_autofree char *actual = NULL;
119c2d
+    g_autofree char *buf = NULL;
119c2d
 
119c2d
-    path = g_strdup_printf("%s/qemufirmwaredata/%s", abs_srcdir, filename);
119c2d
+    inpath = g_strdup_printf("%s/qemufirmwaredata/%s", abs_srcdir, filename);
119c2d
+    outpath = g_strdup_printf("%s/qemufirmwaredata/out/%s", abs_srcdir, filename);
119c2d
 
119c2d
-    if (!(fw = qemuFirmwareParse(path)))
119c2d
+    if (!(fw = qemuFirmwareParse(inpath)))
119c2d
         return -1;
119c2d
 
119c2d
-    if (virFileReadAll(path,
119c2d
-                       1024 * 1024, /* 1MiB */
119c2d
-                       &buf) < 0)
119c2d
-        return -1;
119c2d
+    if (virFileExists(outpath)) {
119c2d
+        if (virFileReadAll(outpath,
119c2d
+                           1024 * 1024, /* 1MiB */
119c2d
+                           &buf) < 0)
119c2d
+            return -1;
119c2d
+    } else {
119c2d
+        if (virFileReadAll(inpath,
119c2d
+                           1024 * 1024, /* 1MiB */
119c2d
+                           &buf) < 0)
119c2d
+            return -1;
119c2d
+    }
119c2d
 
119c2d
     if (!(json = virJSONValueFromString(buf)))
119c2d
         return -1;
119c2d
@@ -60,7 +69,9 @@ testFWPrecedence(const void *opaque G_GNUC_UNUSED)
119c2d
     const char *expected[] = {
119c2d
         PREFIX "/share/qemu/firmware/40-bios.json",
119c2d
         SYSCONFDIR "/qemu/firmware/40-ovmf-sb-keys.json",
119c2d
+        PREFIX "/share/qemu/firmware/45-ovmf-sev-stateless.json",
119c2d
         PREFIX "/share/qemu/firmware/50-ovmf-sb-keys.json",
119c2d
+        PREFIX "/share/qemu/firmware/55-ovmf-sb-combined.json",
119c2d
         PREFIX "/share/qemu/firmware/61-ovmf.json",
119c2d
         PREFIX "/share/qemu/firmware/70-aavmf.json",
119c2d
         NULL
119c2d
@@ -218,7 +229,9 @@ mymain(void)
119c2d
     } while (0)
119c2d
 
119c2d
     DO_PARSE_TEST("usr/share/qemu/firmware/40-bios.json");
119c2d
+    DO_PARSE_TEST("usr/share/qemu/firmware/45-ovmf-sev-stateless.json");
119c2d
     DO_PARSE_TEST("usr/share/qemu/firmware/50-ovmf-sb-keys.json");
119c2d
+    DO_PARSE_TEST("usr/share/qemu/firmware/55-ovmf-sb-combined.json");
119c2d
     DO_PARSE_TEST("usr/share/qemu/firmware/60-ovmf-sb.json");
119c2d
     DO_PARSE_TEST("usr/share/qemu/firmware/61-ovmf.json");
119c2d
     DO_PARSE_TEST("usr/share/qemu/firmware/70-aavmf.json");
119c2d
@@ -250,6 +263,8 @@ mymain(void)
119c2d
     DO_SUPPORTED_TEST("pc-q35-3.1", VIR_ARCH_X86_64, true,
119c2d
                       "/usr/share/seabios/bios-256k.bin:NULL:"
119c2d
                       "/usr/share/OVMF/OVMF_CODE.secboot.fd:/usr/share/OVMF/OVMF_VARS.secboot.fd:"
119c2d
+                      "/usr/share/OVMF/OVMF.sev.fd:NULL:"
119c2d
+                      "/usr/share/OVMF/OVMF.secboot.fd:NULL:"
119c2d
                       "/usr/share/OVMF/OVMF_CODE.fd:/usr/share/OVMF/OVMF_VARS.fd",
119c2d
                       VIR_DOMAIN_OS_DEF_FIRMWARE_BIOS,
119c2d
                       VIR_DOMAIN_OS_DEF_FIRMWARE_EFI);
119c2d
-- 
119c2d
2.35.1
119c2d