]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Match NVRAM template extension for new domains
authorAndrea Bolognani <abologna@redhat.com>
Tue, 30 May 2023 16:24:40 +0000 (18:24 +0200)
committerAndrea Bolognani <abologna@redhat.com>
Mon, 21 Aug 2023 11:51:32 +0000 (13:51 +0200)
Keep things consistent by using the same file extension for the
generated NVRAM path as the NVRAM template.

Signed-off-by: Andrea Bolognani <abologna@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_domain.c
src/qemu/qemu_firmware.c
src/qemu/qemu_firmware.h
src/qemu/qemu_process.c
tests/qemuxml2argvdata/firmware-auto-efi-format-loader-raw-abi-update.aarch64-latest.args
tests/qemuxml2xmloutdata/firmware-auto-efi-format-loader-raw-abi-update.aarch64-latest.xml

index f64836fbb175f7e8420d816ff601683246e9a874..ca8ca9fc46cc8184805e01b09020d720eb18fbae 100644 (file)
@@ -4505,7 +4505,7 @@ qemuDomainDefBootPostParse(virDomainDef *def,
      * to start the domain, qemuFirmwareFillDomain() will be run
      * again, fail in the same way, and at that point we'll have a
      * chance to inform the user of any issues */
-    if (qemuFirmwareFillDomain(driver, def) < 0) {
+    if (qemuFirmwareFillDomain(driver, def, abiUpdate) < 0) {
         if (abiUpdate) {
             return -1;
         } else {
index 353865491319327ff6affdc381c55a45da826d17..ebaf32cf71d728114c0c6ecbf693096e281640a7 100644 (file)
@@ -32,6 +32,7 @@
 #include "virlog.h"
 #include "viralloc.h"
 #include "virenum.h"
+#include "virstring.h"
 
 #define VIR_FROM_THIS VIR_FROM_QEMU
 
@@ -1054,6 +1055,7 @@ qemuFirmwareOSInterfaceTypeFromOsDefLoaderType(virDomainLoader type)
  * qemuFirmwareEnsureNVRAM:
  * @def: domain definition
  * @driver: QEMU driver
+ * @abiUpdate: whether a new domain is being defined
  *
  * Make sure that a source for the NVRAM file exists, possibly by
  * creating it. This might involve automatically generating the
@@ -1061,7 +1063,8 @@ qemuFirmwareOSInterfaceTypeFromOsDefLoaderType(virDomainLoader type)
  */
 static void
 qemuFirmwareEnsureNVRAM(virDomainDef *def,
-                        virQEMUDriver *driver)
+                        virQEMUDriver *driver,
+                        bool abiUpdate)
 {
     g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
     virDomainLoaderDef *loader = def->os.loader;
@@ -1091,8 +1094,25 @@ qemuFirmwareEnsureNVRAM(virDomainDef *def,
     loader->nvram->type = VIR_STORAGE_TYPE_FILE;
     loader->nvram->format = loader->format;
 
-    if (loader->nvram->format == VIR_STORAGE_FILE_RAW)
-        ext = ".fd";
+    if (loader->nvram->format == VIR_STORAGE_FILE_RAW) {
+        /* The extension used by raw edk2 builds has historically
+         * been .fd, but more recent aarch64 builds have started
+         * using the .raw extension instead.
+         *
+         * If we're defining a new domain, we should try to match the
+         * extension for the file backing its NVRAM store with the
+         * one used by the template to keep things nice and
+         * consistent.
+         *
+         * If we're loading an existing domain, however, we need to
+         * stick with the .fd extension to ensure compatibility */
+        if (abiUpdate &&
+            loader->nvramTemplate &&
+            virStringHasSuffix(loader->nvramTemplate, ".raw"))
+            ext = ".raw";
+        else
+            ext = ".fd";
+    }
     if (loader->nvram->format == VIR_STORAGE_FILE_QCOW2)
         ext = ".qcow2";
 
@@ -1729,6 +1749,7 @@ qemuFirmwareFillDomainModern(virQEMUDriver *driver,
  * qemuFirmwareFillDomain:
  * @driver: QEMU driver
  * @def: domain definition
+ * @abiUpdate: whether a new domain is being defined
  *
  * Perform firmware selection.
  *
@@ -1752,7 +1773,8 @@ qemuFirmwareFillDomainModern(virQEMUDriver *driver,
  */
 int
 qemuFirmwareFillDomain(virQEMUDriver *driver,
-                       virDomainDef *def)
+                       virDomainDef *def,
+                       bool abiUpdate)
 {
     virDomainLoaderDef *loader = def->os.loader;
     virStorageSource *nvram = loader ? loader->nvram : NULL;
@@ -1822,7 +1844,7 @@ qemuFirmwareFillDomain(virQEMUDriver *driver,
     /* Always ensure that the NVRAM path is present, even if we
      * haven't found a match: the configuration might simply be
      * referring to a custom firmware build */
-    qemuFirmwareEnsureNVRAM(def, driver);
+    qemuFirmwareEnsureNVRAM(def, driver, abiUpdate);
 
     return 0;
 }
index 1ce09207130775c08cf3132c84ad880c0f0a0b9a..39572d979d4bc731acef6883ec3f2d416b4f8007 100644 (file)
@@ -44,7 +44,8 @@ qemuFirmwareFetchConfigs(char ***firmwares,
 
 int
 qemuFirmwareFillDomain(virQEMUDriver *driver,
-                       virDomainDef *def);
+                       virDomainDef *def,
+                       bool abiUpdate);
 
 int
 qemuFirmwareGetSupported(const char *machine,
index 0644f80161448b95a1efafa78781278b195304d8..23ab15d8cd186f073bc48506b0079cec4da79d19 100644 (file)
@@ -6705,7 +6705,7 @@ qemuProcessPrepareDomain(virQEMUDriver *driver,
         return -1;
 
     VIR_DEBUG("Prepare bios/uefi paths");
-    if (qemuFirmwareFillDomain(driver, vm->def) < 0)
+    if (qemuFirmwareFillDomain(driver, vm->def, false) < 0)
         return -1;
     if (qemuDomainInitializePflashStorageSource(vm, cfg) < 0)
         return -1;
index eb5cd8d5fc0c94d173cc16b5d44c1e051d2f2ae7..3e319a29bf4efbea52709cd5aab8f1a166ed5dff 100644 (file)
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-guest/.config \
 -object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-guest/master-key.aes"}' \
 -blockdev '{"driver":"file","filename":"/usr/share/edk2/aarch64/QEMU_EFI-silent-pflash.raw","node-name":"libvirt-pflash0-storage","auto-read-only":true,"discard":"unmap"}' \
 -blockdev '{"node-name":"libvirt-pflash0-format","read-only":true,"driver":"raw","file":"libvirt-pflash0-storage"}' \
--blockdev '{"driver":"file","filename":"/var/lib/libvirt/qemu/nvram/guest_VARS.fd","node-name":"libvirt-pflash1-storage","auto-read-only":true,"discard":"unmap"}' \
+-blockdev '{"driver":"file","filename":"/var/lib/libvirt/qemu/nvram/guest_VARS.raw","node-name":"libvirt-pflash1-storage","auto-read-only":true,"discard":"unmap"}' \
 -blockdev '{"node-name":"libvirt-pflash1-format","read-only":false,"driver":"raw","file":"libvirt-pflash1-storage"}' \
 -machine virt-4.0,usb=off,gic-version=2,dump-guest-core=off,memory-backend=mach-virt.ram,pflash0=libvirt-pflash0-format,pflash1=libvirt-pflash1-format \
 -accel tcg \
index 38c680fabd92c97c427bd9a929f32b6edcddb985..ee22b168315c8ee724a6396ed58462e1e21745ad 100644 (file)
@@ -11,7 +11,7 @@
       <feature enabled='no' name='secure-boot'/>
     </firmware>
     <loader readonly='yes' type='pflash'>/usr/share/edk2/aarch64/QEMU_EFI-silent-pflash.raw</loader>
-    <nvram template='/usr/share/edk2/aarch64/vars-template-pflash.raw'>/var/lib/libvirt/qemu/nvram/guest_VARS.fd</nvram>
+    <nvram template='/usr/share/edk2/aarch64/vars-template-pflash.raw'>/var/lib/libvirt/qemu/nvram/guest_VARS.raw</nvram>
     <boot dev='hd'/>
   </os>
   <features>