Am 27. Januar 2026 05:15:39 UTC schrieb Ani Sinha <[email protected]>:
>For confidential guests, bios image must be reinitialized upon reset. This
>is because bios memory is encrypted and hence once the old confidential
>kvm context is destroyed, it cannot be decrypted. It needs to be reinitilized.
>In order to do that, this change refactors x86_bios_rom_init() code so that
>parts of it can be called during confidential guest reset.
>
>Signed-off-by: Ani Sinha <[email protected]>
>---
> hw/i386/x86-common.c  | 51 ++++++++++++++++++++++++++++++++-----------
> include/hw/i386/x86.h |  1 -
> 2 files changed, 38 insertions(+), 14 deletions(-)
>
>diff --git a/hw/i386/x86-common.c b/hw/i386/x86-common.c
>index c1c9224039..4469b4e152 100644
>--- a/hw/i386/x86-common.c
>+++ b/hw/i386/x86-common.c
>@@ -1024,17 +1024,11 @@ void x86_isa_bios_init(MemoryRegion *isa_bios, 
>MemoryRegion *isa_memory,
>     memory_region_set_readonly(isa_bios, read_only);
> }
> 
>-void x86_bios_rom_init(X86MachineState *x86ms, const char *default_firmware,
>-                       MemoryRegion *rom_memory, bool isapc_ram_fw)
>+static int get_bios_size(X86MachineState *x86ms,
>+                         const char *bios_name, char *filename)
> {
>-    const char *bios_name;
>-    char *filename;
>     int bios_size;
>-    ssize_t ret;
> 
>-    /* BIOS load */
>-    bios_name = MACHINE(x86ms)->firmware ?: default_firmware;
>-    filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
>     if (filename) {
>         bios_size = get_image_size(filename, NULL);
>     } else {
>@@ -1044,6 +1038,21 @@ void x86_bios_rom_init(X86MachineState *x86ms, const 
>char *default_firmware,
>         (bios_size % 65536) != 0) {
>         goto bios_error;
>     }
>+
>+    return bios_size;
>+
>+ bios_error:
>+    fprintf(stderr, "qemu: could not load PC BIOS '%s'\n", bios_name);
>+    exit(1);
>+}
>+
>+static void load_bios_from_file(X86MachineState *x86ms, const char *bios_name,
>+                                char *filename, int bios_size,
>+                                bool isapc_ram_fw)
>+{
>+    ssize_t ret;
>+
>+    /* BIOS load */
>     if (machine_require_guest_memfd(MACHINE(x86ms))) {
>         memory_region_init_ram_guest_memfd(&x86ms->bios, NULL, "pc.bios",
>                                            bios_size, &error_fatal);
>@@ -1072,7 +1081,26 @@ void x86_bios_rom_init(X86MachineState *x86ms, const 
>char *default_firmware,
>             goto bios_error;
>         }
>     }
>-    g_free(filename);
>+
>+    return;
>+
>+ bios_error:
>+    fprintf(stderr, "qemu: could not load PC BIOS '%s'\n", bios_name);
>+    exit(1);
>+}
>+
>+void x86_bios_rom_init(X86MachineState *x86ms, const char *default_firmware,
>+                       MemoryRegion *rom_memory, bool isapc_ram_fw)
>+{
>+    int bios_size;
>+    const char *bios_name;
>+    char *filename;
>+
>+    bios_name = MACHINE(x86ms)->firmware ?: default_firmware;
>+    filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
>+
>+    bios_size = get_bios_size(x86ms, bios_name, filename);
>+    load_bios_from_file(x86ms, bios_name, filename, bios_size, isapc_ram_fw);
> 
>     if (!machine_require_guest_memfd(MACHINE(x86ms))) {
>         /* map the last 128KB of the BIOS in ISA space */
>@@ -1084,9 +1112,6 @@ void x86_bios_rom_init(X86MachineState *x86ms, const 
>char *default_firmware,
>     memory_region_add_subregion(rom_memory,
>                                 (uint32_t)(-bios_size),
>                                 &x86ms->bios);
>+    g_free(filename);

Doesn't the error path leak filename? Using g_autofree would prevent that. Even 
if the error path exits immediately today it may represent a latent bug for 
tomorrow (e.g. when porting to error API).

>     return;
>-
>-bios_error:
>-    fprintf(stderr, "qemu: could not load PC BIOS '%s'\n", bios_name);
>-    exit(1);
> }
>diff --git a/include/hw/i386/x86.h b/include/hw/i386/x86.h
>index 0dffba95f9..bfdf97640d 100644
>--- a/include/hw/i386/x86.h
>+++ b/include/hw/i386/x86.h
>@@ -122,7 +122,6 @@ void x86_cpu_unplug_request_cb(HotplugHandler *hotplug_dev,
>                                DeviceState *dev, Error **errp);
> void x86_cpu_unplug_cb(HotplugHandler *hotplug_dev,
>                        DeviceState *dev, Error **errp);
>-

This file contains whitespace changes only and breaks logic grouping of 
functions. I'd drop this change.

Best regards,
Bernhard

> void x86_isa_bios_init(MemoryRegion *isa_bios, MemoryRegion *isa_memory,
>                        MemoryRegion *bios, bool read_only);
> void x86_bios_rom_init(X86MachineState *x86ms, const char *default_firmware,

Reply via email to