Message ID | 20250124132048.3229049-20-xiaoyao.li@intel.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | QEMU TDX support | expand |
On Fri, 2025-01-24 at 08:20 -0500, Xiaoyao Li wrote: > +static void tdx_finalize_vm(Notifier *notifier, void *unused) > +{ > + TdxFirmware *tdvf = &tdx_guest->tdvf; > + TdxFirmwareEntry *entry; > + > + for_each_tdx_fw_entry(tdvf, entry) { > + switch (entry->type) { > + case TDVF_SECTION_TYPE_BFV: > + case TDVF_SECTION_TYPE_CFV: > + entry->mem_ptr = tdvf->mem_ptr + entry->data_offset; > + break; > + case TDVF_SECTION_TYPE_TD_HOB: > + case TDVF_SECTION_TYPE_TEMP_MEM: > + entry->mem_ptr = qemu_ram_mmap(-1, entry->size, > + > qemu_real_host_page_size(), 0, 0); > + break; Should check for MAP_FAILED return value. > + default: > + error_report("Unsupported TDVF section %d", entry- > >type); > + exit(1); Section entry types have already been checked against valid types in tdvf_parse_and_check_section_entry(), no need to check them again here.
On Fri, 2025-01-24 at 08:20 -0500, Xiaoyao Li wrote: > diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c > index 73f90b0a2217..8564b3ae905d 100644 > --- a/target/i386/kvm/tdx.c > +++ b/target/i386/kvm/tdx.c > @@ -12,10 +12,14 @@ > #include "qemu/osdep.h" > #include "qemu/error-report.h" > #include "qemu/base64.h" > +#include "qemu/mmap-alloc.h" > #include "qapi/error.h" > #include "qom/object_interfaces.h" > #include "crypto/hash.h" > +#include "system/system.h" > > +#include "hw/i386/x86.h" > +#include "hw/i386/tdvf.h" > #include "hw/i386/x86.h" Duplicated include
diff --git a/hw/i386/tdvf.c b/hw/i386/tdvf.c index 887af41ff486..b693b3e6f8e2 100644 --- a/hw/i386/tdvf.c +++ b/hw/i386/tdvf.c @@ -177,6 +177,7 @@ int tdvf_parse_metadata(TdxFirmware *fw, void *flash_ptr, int size) } } + fw->mem_ptr = flash_ptr; return 0; err: diff --git a/include/hw/i386/tdvf.h b/include/hw/i386/tdvf.h index 7ebcac42a36c..e75c8d1acc68 100644 --- a/include/hw/i386/tdvf.h +++ b/include/hw/i386/tdvf.h @@ -26,13 +26,20 @@ typedef struct TdxFirmwareEntry { uint64_t size; uint32_t type; uint32_t attributes; + + void *mem_ptr; } TdxFirmwareEntry; typedef struct TdxFirmware { + void *mem_ptr; + uint32_t nr_entries; TdxFirmwareEntry *entries; } TdxFirmware; +#define for_each_tdx_fw_entry(fw, e) \ + for (e = (fw)->entries; e != (fw)->entries + (fw)->nr_entries; e++) + int tdvf_parse_metadata(TdxFirmware *fw, void *flash_ptr, int size); #endif /* HW_I386_TDVF_H */ diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c index 73f90b0a2217..8564b3ae905d 100644 --- a/target/i386/kvm/tdx.c +++ b/target/i386/kvm/tdx.c @@ -12,10 +12,14 @@ #include "qemu/osdep.h" #include "qemu/error-report.h" #include "qemu/base64.h" +#include "qemu/mmap-alloc.h" #include "qapi/error.h" #include "qom/object_interfaces.h" #include "crypto/hash.h" +#include "system/system.h" +#include "hw/i386/x86.h" +#include "hw/i386/tdvf.h" #include "hw/i386/x86.h" #include "kvm_i386.h" #include "tdx.h" @@ -143,6 +147,33 @@ void tdx_set_tdvf_region(MemoryRegion *tdvf_mr) tdx_guest->tdvf_mr = tdvf_mr; } +static void tdx_finalize_vm(Notifier *notifier, void *unused) +{ + TdxFirmware *tdvf = &tdx_guest->tdvf; + TdxFirmwareEntry *entry; + + for_each_tdx_fw_entry(tdvf, entry) { + switch (entry->type) { + case TDVF_SECTION_TYPE_BFV: + case TDVF_SECTION_TYPE_CFV: + entry->mem_ptr = tdvf->mem_ptr + entry->data_offset; + break; + case TDVF_SECTION_TYPE_TD_HOB: + case TDVF_SECTION_TYPE_TEMP_MEM: + entry->mem_ptr = qemu_ram_mmap(-1, entry->size, + qemu_real_host_page_size(), 0, 0); + break; + default: + error_report("Unsupported TDVF section %d", entry->type); + exit(1); + } + } +} + +static Notifier tdx_machine_done_notify = { + .notify = tdx_finalize_vm, +}; + static int tdx_kvm_init(ConfidentialGuestSupport *cgs, Error **errp) { TdxGuest *tdx = TDX_GUEST(cgs); @@ -157,6 +188,8 @@ static int tdx_kvm_init(ConfidentialGuestSupport *cgs, Error **errp) } } + qemu_add_machine_init_done_notifier(&tdx_machine_done_notify); + tdx_guest = tdx; return 0; }