[PATCH 01/36] qemu_firmware: Drop support for kernel descriptors

Andrea Bolognani via Devel posted 36 patches 1 week, 3 days ago
[PATCH 01/36] qemu_firmware: Drop support for kernel descriptors
Posted by Andrea Bolognani via Devel 1 week, 3 days ago
I have been able to find exactly zero evidence of this type of
firmware descriptor actually existing in the wild, so this is
essentialy dead code. Dropping it simplifies the task of further
tweaking the firmware selection code.

Signed-off-by: Andrea Bolognani <abologna@redhat.com>
---
 src/qemu/qemu_firmware.c | 83 ++--------------------------------------
 1 file changed, 3 insertions(+), 80 deletions(-)

diff --git a/src/qemu/qemu_firmware.c b/src/qemu/qemu_firmware.c
index 5bd34ea87f..b168ec7cf7 100644
--- a/src/qemu/qemu_firmware.c
+++ b/src/qemu/qemu_firmware.c
@@ -92,12 +92,6 @@ struct _qemuFirmwareMappingFlash {
 };
 
 
-typedef struct _qemuFirmwareMappingKernel qemuFirmwareMappingKernel;
-struct _qemuFirmwareMappingKernel {
-    char *filename;
-};
-
-
 typedef struct _qemuFirmwareMappingMemory qemuFirmwareMappingMemory;
 struct _qemuFirmwareMappingMemory {
     char *filename;
@@ -107,7 +101,6 @@ struct _qemuFirmwareMappingMemory {
 typedef enum {
     QEMU_FIRMWARE_DEVICE_NONE = 0,
     QEMU_FIRMWARE_DEVICE_FLASH,
-    QEMU_FIRMWARE_DEVICE_KERNEL,
     QEMU_FIRMWARE_DEVICE_MEMORY,
 
     QEMU_FIRMWARE_DEVICE_LAST
@@ -118,7 +111,6 @@ VIR_ENUM_IMPL(qemuFirmwareDevice,
               QEMU_FIRMWARE_DEVICE_LAST,
               "",
               "flash",
-              "kernel",
               "memory",
 );
 
@@ -129,7 +121,6 @@ struct _qemuFirmwareMapping {
 
     union {
         qemuFirmwareMappingFlash flash;
-        qemuFirmwareMappingKernel kernel;
         qemuFirmwareMappingMemory memory;
     } data;
 };
@@ -222,13 +213,6 @@ qemuFirmwareMappingFlashFreeContent(qemuFirmwareMappingFlash *flash)
 }
 
 
-static void
-qemuFirmwareMappingKernelFreeContent(qemuFirmwareMappingKernel *kernel)
-{
-    g_free(kernel->filename);
-}
-
-
 static void
 qemuFirmwareMappingMemoryFreeContent(qemuFirmwareMappingMemory *memory)
 {
@@ -243,9 +227,6 @@ qemuFirmwareMappingFreeContent(qemuFirmwareMapping *mapping)
     case QEMU_FIRMWARE_DEVICE_FLASH:
         qemuFirmwareMappingFlashFreeContent(&mapping->data.flash);
         break;
-    case QEMU_FIRMWARE_DEVICE_KERNEL:
-        qemuFirmwareMappingKernelFreeContent(&mapping->data.kernel);
-        break;
     case QEMU_FIRMWARE_DEVICE_MEMORY:
         qemuFirmwareMappingMemoryFreeContent(&mapping->data.memory);
         break;
@@ -418,24 +399,6 @@ qemuFirmwareMappingFlashParse(const char *path,
 }
 
 
-static int
-qemuFirmwareMappingKernelParse(const char *path,
-                               virJSONValue *doc,
-                               qemuFirmwareMappingKernel *kernel)
-{
-    const char *filename;
-
-    if (!(filename = virJSONValueObjectGetString(doc, "filename"))) {
-        VIR_DEBUG("missing 'filename' in '%s'", path);
-        return -1;
-    }
-
-    kernel->filename = g_strdup(filename);
-
-    return 0;
-}
-
-
 static int
 qemuFirmwareMappingMemoryParse(const char *path,
                                virJSONValue *doc,
@@ -485,10 +448,6 @@ qemuFirmwareMappingParse(const char *path,
         if (qemuFirmwareMappingFlashParse(path, mapping, &fw->mapping.data.flash) < 0)
             return -1;
         break;
-    case QEMU_FIRMWARE_DEVICE_KERNEL:
-        if (qemuFirmwareMappingKernelParse(path, mapping, &fw->mapping.data.kernel) < 0)
-            return -1;
-        break;
     case QEMU_FIRMWARE_DEVICE_MEMORY:
         if (qemuFirmwareMappingMemoryParse(path, mapping, &fw->mapping.data.memory) < 0)
             return -1;
@@ -732,19 +691,6 @@ qemuFirmwareMappingFlashFormat(virJSONValue *mapping,
 }
 
 
-static int
-qemuFirmwareMappingKernelFormat(virJSONValue *mapping,
-                                qemuFirmwareMappingKernel *kernel)
-{
-    if (virJSONValueObjectAppendString(mapping,
-                                       "filename",
-                                       kernel->filename) < 0)
-        return -1;
-
-    return 0;
-}
-
-
 static int
 qemuFirmwareMappingMemoryFormat(virJSONValue *mapping,
                                 qemuFirmwareMappingMemory *memory)
@@ -774,10 +720,6 @@ qemuFirmwareMappingFormat(virJSONValue *doc,
         if (qemuFirmwareMappingFlashFormat(mapping, &fw->mapping.data.flash) < 0)
             return -1;
         break;
-    case QEMU_FIRMWARE_DEVICE_KERNEL:
-        if (qemuFirmwareMappingKernelFormat(mapping, &fw->mapping.data.kernel) < 0)
-            return -1;
-        break;
     case QEMU_FIRMWARE_DEVICE_MEMORY:
         if (qemuFirmwareMappingMemoryFormat(mapping, &fw->mapping.data.memory) < 0)
             return -1;
@@ -920,21 +862,17 @@ qemuFirmwareMatchesMachineArch(const qemuFirmware *fw,
  * qemuFirmwareMatchesPaths:
  * @fw: firmware definition
  * @loader: loader definition
- * @kernelPath: path to kernel image
  *
  * Checks whether @fw is compatible with the information provided as
  * part of the domain definition.
  *
- * Returns: true if @fw is compatible with @loader and @kernelPath,
- *          false otherwise
+ * Returns: true if @fw is compatible with @loader, false otherwise
  */
 static bool
 qemuFirmwareMatchesPaths(const qemuFirmware *fw,
-                         const virDomainLoaderDef *loader,
-                         const char *kernelPath)
+                         const virDomainLoaderDef *loader)
 {
     const qemuFirmwareMappingFlash *flash = &fw->mapping.data.flash;
-    const qemuFirmwareMappingKernel *kernel = &fw->mapping.data.kernel;
     const qemuFirmwareMappingMemory *memory = &fw->mapping.data.memory;
 
     switch (fw->mapping.device) {
@@ -954,11 +892,6 @@ qemuFirmwareMatchesPaths(const qemuFirmware *fw,
             !virFileComparePaths(loader->path, memory->filename))
             return false;
         break;
-    case QEMU_FIRMWARE_DEVICE_KERNEL:
-        if (kernelPath &&
-            !virFileComparePaths(kernelPath, kernel->filename))
-            return false;
-        break;
     case QEMU_FIRMWARE_DEVICE_NONE:
     case QEMU_FIRMWARE_DEVICE_LAST:
         return false;
@@ -1183,7 +1116,7 @@ qemuFirmwareMatchDomain(const virDomainDef *def,
         return false;
     }
 
-    if (!qemuFirmwareMatchesPaths(fw, def->os.loader, def->os.kernel)) {
+    if (!qemuFirmwareMatchesPaths(fw, def->os.loader)) {
         VIR_DEBUG("No matching path in '%s'", path);
         return false;
     }
@@ -1424,7 +1357,6 @@ qemuFirmwareEnableFeaturesModern(virDomainDef *def,
                                  const qemuFirmware *fw)
 {
     const qemuFirmwareMappingFlash *flash = &fw->mapping.data.flash;
-    const qemuFirmwareMappingKernel *kernel = &fw->mapping.data.kernel;
     const qemuFirmwareMappingMemory *memory = &fw->mapping.data.memory;
     virDomainLoaderDef *loader = NULL;
     virStorageFileFormat format;
@@ -1482,14 +1414,6 @@ qemuFirmwareEnableFeaturesModern(virDomainDef *def,
                   loader->path, NULLSTR(loader->nvramTemplate));
         break;
 
-    case QEMU_FIRMWARE_DEVICE_KERNEL:
-        VIR_FREE(def->os.kernel);
-        def->os.kernel = g_strdup(kernel->filename);
-
-        VIR_DEBUG("decided on kernel '%s'",
-                  def->os.kernel);
-        break;
-
     case QEMU_FIRMWARE_DEVICE_MEMORY:
         if (!def->os.loader)
             def->os.loader = virDomainLoaderDefNew();
@@ -2056,7 +1980,6 @@ qemuFirmwareGetSupported(const char *machine,
             fwpath = memory->filename;
             break;
 
-        case QEMU_FIRMWARE_DEVICE_KERNEL:
         case QEMU_FIRMWARE_DEVICE_NONE:
         case QEMU_FIRMWARE_DEVICE_LAST:
             break;
-- 
2.52.0
Re: [PATCH 01/36] qemu_firmware: Drop support for kernel descriptors
Posted by Gerd Hoffmann via Devel 2 days, 2 hours ago
On Mon, Dec 29, 2025 at 12:33:37AM +0100, Andrea Bolognani via Devel wrote:
> I have been able to find exactly zero evidence of this type of
> firmware descriptor actually existing in the wild, so this is
> essentialy dead code.

Upstream edk2 actually has a build configuration for aarch64 firmware
images loadable via -kernel.  Which is probably the reason this was
added in the first place.

rhel/centos/fedora do not ship such builds.  I'm not aware of any
advantages such a build has, and the obvious disadvantage is that direct
kernel boot via -kernel can not work by design.  So I do not expect this
to change.  If there is anything going to change in how firmware gets
loaded, then this will most likely be the move to use IGVM.  So no
objections to drop this from my side.

I think it makes sense to also remove this from the spec in qemu.

take care,
  Gerd