]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
conf: Parse firmware format
authorAndrea Bolognani <abologna@redhat.com>
Mon, 13 Feb 2023 17:13:23 +0000 (18:13 +0100)
committerAndrea Bolognani <abologna@redhat.com>
Fri, 3 Mar 2023 12:50:54 +0000 (13:50 +0100)
The default is raw, which corresponds to the historical
behavior and is also the only accepted value, at least for
now.

Signed-off-by: Andrea Bolognani <abologna@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/conf/domain_conf.c
src/conf/domain_conf.h
src/conf/schemas/domaincommon.rng

index cc27e63bd32d559abff96817005892100506b626..27c53e9b761298f99b09c423c15416b7d2643c9c 100644 (file)
@@ -3726,7 +3726,12 @@ virDomainPanicDefFree(virDomainPanicDef *panic)
 virDomainLoaderDef *
 virDomainLoaderDefNew(void)
 {
-    return g_new0(virDomainLoaderDef, 1);
+    virDomainLoaderDef *def = NULL;
+
+    def = g_new0(virDomainLoaderDef, 1);
+    def->format = VIR_STORAGE_FILE_RAW;
+
+    return def;
 }
 
 void
@@ -16760,6 +16765,7 @@ virDomainLoaderDefParseXMLNvram(virDomainLoaderDef *loader,
                                 unsigned int flags)
 {
     g_autoptr(virStorageSource) src = virStorageSourceNew();
+    unsigned int format = 0;
     int typePresent;
 
     if (!nvramNode)
@@ -16767,7 +16773,18 @@ virDomainLoaderDefParseXMLNvram(virDomainLoaderDef *loader,
 
     loader->nvramTemplate = virXMLPropString(nvramNode, "template");
 
-    src->format = VIR_STORAGE_FILE_RAW;
+    if (virXMLPropEnumDefault(nvramNode, "format",
+                              virStorageFileFormatTypeFromString, VIR_XML_PROP_NONE,
+                              &format, VIR_STORAGE_FILE_RAW) < 0) {
+        return -1;
+    }
+    if (format != VIR_STORAGE_FILE_RAW) {
+        virReportError(VIR_ERR_XML_ERROR,
+                       _("Unsupported nvram format '%s'"),
+                       virStorageFileFormatTypeToString(format));
+        return -1;
+    }
+    src->format = format;
 
     if ((typePresent = virXMLPropEnum(nvramNode, "type",
                                       virStorageTypeFromString, VIR_XML_PROP_NONE,
@@ -16801,8 +16818,26 @@ static int
 virDomainLoaderDefParseXMLLoader(virDomainLoaderDef *loader,
                                  xmlNodePtr loaderNode)
 {
-    if (!loaderNode)
+    unsigned int format = 0;
+
+    if (!loaderNode) {
+        /* If there is no <loader> element but the <nvram> element
+         * was present, copy the format from the latter to the
+         * former.
+         *
+         * This ensures that a configuration such as
+         *
+         *   <os>
+         *     <nvram format='foo'/>
+         *   </os>
+         *
+         * behaves as expected, that is, results in a firmware build
+         * with format 'foo' being selected */
+        if (loader->nvram)
+            loader->format = loader->nvram->format;
+
         return 0;
+    }
 
     if (virXMLPropTristateBool(loaderNode, "readonly", VIR_XML_PROP_NONE,
                                &loader->readonly) < 0)
@@ -16826,6 +16861,19 @@ virDomainLoaderDefParseXMLLoader(virDomainLoaderDef *loader,
                                &loader->stateless) < 0)
         return -1;
 
+    if (virXMLPropEnumDefault(loaderNode, "format",
+                              virStorageFileFormatTypeFromString, VIR_XML_PROP_NONE,
+                              &format, VIR_STORAGE_FILE_RAW) < 0) {
+        return -1;
+    }
+    if (format != VIR_STORAGE_FILE_RAW) {
+        virReportError(VIR_ERR_XML_ERROR,
+                       _("Unsupported loader format '%s'"),
+                       virStorageFileFormatTypeToString(format));
+        return -1;
+    }
+    loader->format = format;
+
     return 0;
 }
 
@@ -16848,6 +16896,14 @@ virDomainLoaderDefParseXML(virDomainLoaderDef *loader,
                                          loaderNode) < 0)
         return -1;
 
+    if (loader->nvram && loader->format != loader->nvram->format) {
+        virReportError(VIR_ERR_XML_ERROR,
+                       _("Format mismatch: loader.format='%s' nvram.format='%s'"),
+                       virStorageFileFormatTypeToString(loader->format),
+                       virStorageFileFormatTypeToString(loader->nvram->format));
+        return -1;
+    }
+
     return 0;
 }
 
@@ -26179,6 +26235,11 @@ virDomainLoaderDefFormatNvram(virBuffer *buf,
                                           false, flags, false, false, xmlopt) < 0)
                 return -1;
         }
+
+        if (src->format != VIR_STORAGE_FILE_RAW) {
+            virBufferEscapeString(&attrBuf, " format='%s'",
+                                  virStorageFileFormatTypeToString(src->format));
+        }
     }
 
     virXMLFormatElementInternal(buf, "nvram", &attrBuf, childBuf, false, childNewline);
@@ -26213,6 +26274,11 @@ virDomainLoaderDefFormat(virBuffer *buf,
                           virTristateBoolTypeToString(loader->stateless));
     }
 
+    if (loader->format != VIR_STORAGE_FILE_RAW) {
+        virBufferEscapeString(&loaderAttrBuf, " format='%s'",
+                              virStorageFileFormatTypeToString(loader->format));
+    }
+
     virBufferEscapeString(&loaderChildBuf, "%s", loader->path);
 
     virXMLFormatElementInternal(buf, "loader", &loaderAttrBuf, &loaderChildBuf, false, false);
index f1513eb222372a99325dea90f1d9331d32e7e6da..21ea4a48b3470dadcd11cd4854daf9976bbc9650 100644 (file)
@@ -2311,6 +2311,7 @@ struct _virDomainLoaderDef {
     virDomainLoader type;
     virTristateBool secure;
     virTristateBool stateless;
+    virStorageFileFormat format;
     virStorageSource *nvram;
     bool newStyleNVRAM;
     char *nvramTemplate;   /* user override of path to master nvram */
index ab4886b7833bbe6dc7755e8339191d319600e316..fca7ff99403f17560496f2dec8f3f54869378174 100644 (file)
                   <ref name="virYesNo"/>
                 </attribute>
               </optional>
+              <optional>
+                <ref name="pflashFormat"/>
+              </optional>
               <optional>
                 <ref name="absFilePath"/>
               </optional>
                   <ref name="absFilePath"/>
                 </attribute>
               </optional>
+              <optional>
+                <ref name="pflashFormat"/>
+              </optional>
               <optional>
                 <choice>
                   <group>
     </element>
   </define>
 
+  <define name="pflashFormat">
+    <attribute name="format">
+      <choice>
+        <value>raw</value>
+      </choice>
+    </attribute>
+  </define>
+
   <!-- Optional HyperV Enlightenment features -->
   <define name="hyperv">
     <element name="hyperv">