diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2022-04-25 15:50:51 +0200 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2022-04-27 07:51:01 +0200 |
commit | a8152c4e4613c70c2f0573a82babbc8acc00cf90 (patch) | |
tree | 9fbdb1f112ae1d0147d47b314d3b73b7c5a72334 /hw/i386/x86.c | |
parent | 966f1ca56ffe6e2c4d1333df59bcec233587aabc (diff) | |
download | qemu-a8152c4e4613c70c2f0573a82babbc8acc00cf90.zip qemu-a8152c4e4613c70c2f0573a82babbc8acc00cf90.tar.gz qemu-a8152c4e4613c70c2f0573a82babbc8acc00cf90.tar.bz2 |
i386: firmware parsing and sev setup for -bios loaded firmware
Don't register firmware as rom, not needed (see comment).
Add x86_firmware_configure() call for proper sev initialization.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: Xiaoyao Li <xiaoyao.li@intel.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Tested-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Message-Id: <20220425135051.551037-4-kraxel@redhat.com>
Diffstat (limited to 'hw/i386/x86.c')
-rw-r--r-- | hw/i386/x86.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/hw/i386/x86.c b/hw/i386/x86.c index ced31f6..79ebdfa 100644 --- a/hw/i386/x86.c +++ b/hw/i386/x86.c @@ -1115,12 +1115,25 @@ void x86_bios_rom_init(MachineState *ms, const char *default_firmware, } bios = g_malloc(sizeof(*bios)); memory_region_init_ram(bios, NULL, "pc.bios", bios_size, &error_fatal); - if (!isapc_ram_fw) { - memory_region_set_readonly(bios, true); - } - ret = rom_add_file_fixed(bios_name, (uint32_t)(-bios_size), -1); - if (ret != 0) { - goto bios_error; + if (sev_enabled()) { + /* + * The concept of a "reset" simply doesn't exist for + * confidential computing guests, we have to destroy and + * re-launch them instead. So there is no need to register + * the firmware as rom to properly re-initialize on reset. + * Just go for a straight file load instead. + */ + void *ptr = memory_region_get_ram_ptr(bios); + load_image_size(filename, ptr, bios_size); + x86_firmware_configure(ptr, bios_size); + } else { + if (!isapc_ram_fw) { + memory_region_set_readonly(bios, true); + } + ret = rom_add_file_fixed(bios_name, (uint32_t)(-bios_size), -1); + if (ret != 0) { + goto bios_error; + } } g_free(filename); |