Signed-off-by: Andrea Bolognani <abologna@redhat.com> --- src/qemu/qemu_firmware.c | 30 +++++++++++++++++-- ...ware-auto-bios-stateless.x86_64-latest.xml | 2 +- .../firmware-auto-bios.x86_64-latest.xml | 2 +- ...-manual-efi-tdx.x86_64-latest+inteltdx.xml | 2 +- 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/qemu/qemu_firmware.c b/src/qemu/qemu_firmware.c index 770c886136..fc78433100 100644 --- a/src/qemu/qemu_firmware.c +++ b/src/qemu/qemu_firmware.c @@ -1588,18 +1588,42 @@ qemuFirmwareEnableFeaturesModern(virDomainDef *def, break; case QEMU_FIRMWARE_DEVICE_MEMORY: + if ((format = virStorageFileFormatTypeFromString(memory->executable.format)) < 0) + return -1; + if (!def->os.loader) def->os.loader = virDomainLoaderDefNew(); loader = def->os.loader; loader->type = VIR_DOMAIN_LOADER_TYPE_ROM; - loader->format = VIR_STORAGE_FILE_RAW; + loader->format = format; + + loader->readonly = VIR_TRISTATE_BOOL_YES; + + if (memory->mode == QEMU_FIRMWARE_MEMORY_MODE_STATELESS) + loader->stateless = VIR_TRISTATE_BOOL_YES; VIR_FREE(loader->path); loader->path = g_strdup(memory->executable.filename); - VIR_DEBUG("decided on loader '%s'", - loader->path); + if (memory->mode == QEMU_FIRMWARE_MEMORY_MODE_SPLIT) { + /* Only fill in nvramTemplate if the NVRAM location is already + * known to be a local path or hasn't been provided, in which + * case a local path will be generated by libvirt later. + * + * We can't create or reset non-local NVRAM files, so filling + * in nvramTemplate for those would be misleading */ + VIR_FREE(loader->nvramTemplate); + loader->nvramTemplateFormat = VIR_STORAGE_FILE_NONE; + + if (!loader->nvram || virStorageSourceIsLocalStorage(loader->nvram)) { + loader->nvramTemplate = g_strdup(memory->nvram_template.filename); + loader->nvramTemplateFormat = virStorageFileFormatTypeFromString(memory->nvram_template.format); + } + } + + VIR_DEBUG("decided on firmware '%s' template '%s'", + loader->path, NULLSTR(loader->nvramTemplate)); break; case QEMU_FIRMWARE_DEVICE_NONE: diff --git a/tests/qemuxmlconfdata/firmware-auto-bios-stateless.x86_64-latest.xml b/tests/qemuxmlconfdata/firmware-auto-bios-stateless.x86_64-latest.xml index 547dff5ed3..ca4ffb0e6c 100644 --- a/tests/qemuxmlconfdata/firmware-auto-bios-stateless.x86_64-latest.xml +++ b/tests/qemuxmlconfdata/firmware-auto-bios-stateless.x86_64-latest.xml @@ -10,7 +10,7 @@ <feature enabled='no' name='enrolled-keys'/> <feature enabled='no' name='secure-boot'/> </firmware> - <loader type='rom' stateless='yes' format='raw'>/usr/share/seabios/bios-256k.bin</loader> + <loader readonly='yes' type='rom' stateless='yes' format='raw'>/usr/share/seabios/bios-256k.bin</loader> <boot dev='hd'/> </os> <features> diff --git a/tests/qemuxmlconfdata/firmware-auto-bios.x86_64-latest.xml b/tests/qemuxmlconfdata/firmware-auto-bios.x86_64-latest.xml index ae9c9f56d9..ca4ffb0e6c 100644 --- a/tests/qemuxmlconfdata/firmware-auto-bios.x86_64-latest.xml +++ b/tests/qemuxmlconfdata/firmware-auto-bios.x86_64-latest.xml @@ -10,7 +10,7 @@ <feature enabled='no' name='enrolled-keys'/> <feature enabled='no' name='secure-boot'/> </firmware> - <loader type='rom' format='raw'>/usr/share/seabios/bios-256k.bin</loader> + <loader readonly='yes' type='rom' stateless='yes' format='raw'>/usr/share/seabios/bios-256k.bin</loader> <boot dev='hd'/> </os> <features> diff --git a/tests/qemuxmlconfdata/firmware-manual-efi-tdx.x86_64-latest+inteltdx.xml b/tests/qemuxmlconfdata/firmware-manual-efi-tdx.x86_64-latest+inteltdx.xml index 5b87857425..6dc8496d3d 100644 --- a/tests/qemuxmlconfdata/firmware-manual-efi-tdx.x86_64-latest+inteltdx.xml +++ b/tests/qemuxmlconfdata/firmware-manual-efi-tdx.x86_64-latest+inteltdx.xml @@ -10,7 +10,7 @@ <feature enabled='yes' name='enrolled-keys'/> <feature enabled='yes' name='secure-boot'/> </firmware> - <loader readonly='yes' type='rom' format='raw'>/usr/share/edk2/ovmf/OVMF.inteltdx.secboot.fd</loader> + <loader readonly='yes' type='rom' stateless='yes' format='raw'>/usr/share/edk2/ovmf/OVMF.inteltdx.secboot.fd</loader> <boot dev='hd'/> </os> <features> -- 2.52.0