Re: [PATCH v6 19/60] i386/tdx: Parse TDVF metadata for TDX VM

Ira Weiny
2024-12-12T17:55:17Z

On Tue, Nov 05, 2024 at 01:23:27AM -0500, Xiaoyao Li wrote:
> After TDVF is loaded to bios MemoryRegion, it needs parse TDVF metadata.

This commit message is pretty thin. I think this could be squashed back into
patch 18 and use the better justfication for the changes there.

Ira

>
> Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
> Acked-by: Gerd Hoffmann <kraxel@redhat.com>
> ---
> hw/i386/pc_sysfw.c | 7 +++++++
> target/i386/kvm/tdx-stub.c | 5 +++++
> target/i386/kvm/tdx.c | 5 +++++
> target/i386/kvm/tdx.h | 3 +++
> 4 files changed, 20 insertions(+)
>
> diff --git a/hw/i386/pc_sysfw.c b/hw/i386/pc_sysfw.c
> index ef80281d28bb..5a373bf129a1 100644
> --- a/hw/i386/pc_sysfw.c
> +++ b/hw/i386/pc_sysfw.c
> @@ -37,6 +37,7 @@
> #include "hw/block/flash.h"
> #include "sysemu/kvm.h"
> #include "sev.h"
> +#include "kvm/tdx.h"
>
> #define FLASH_SECTOR_SIZE 4096
>
> @@ -280,5 +281,11 @@ void x86_firmware_configure(hwaddr gpa, void *ptr, int size)
> }
>
> sev_encrypt_flash(gpa, ptr, size, &error_fatal);
> + } else if (is_tdx_vm()) {
> + ret = tdx_parse_tdvf(ptr, size);
> + if (ret) {
> + error_report("failed to parse TDVF for TDX VM");
> + exit(1);
> + }
> }
> }
> diff --git a/target/i386/kvm/tdx-stub.c b/target/i386/kvm/tdx-stub.c
> index b614b46d3f4a..a064d583d393 100644
> --- a/target/i386/kvm/tdx-stub.c
> +++ b/target/i386/kvm/tdx-stub.c
> @@ -6,3 +6,8 @@ int tdx_pre_create_vcpu(CPUState *cpu, Error **errp)
> {
> return -EINVAL;
> }
> +
> +int tdx_parse_tdvf(void *flash_ptr, int size)
> +{
> + return -EINVAL;
> +}
> diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c
> index d5ebc2430fd1..334dbe95cc77 100644
> --- a/target/i386/kvm/tdx.c
> +++ b/target/i386/kvm/tdx.c
> @@ -338,6 +338,11 @@ int tdx_pre_create_vcpu(CPUState *cpu, Error **errp)
> return 0;
> }
>
> +int tdx_parse_tdvf(void *flash_ptr, int size)
> +{
> + return tdvf_parse_metadata(&tdx_guest->tdvf, flash_ptr, size);
> +}
> +
> static bool tdx_guest_get_sept_ve_disable(Object *obj, Error **errp)
> {
> TdxGuest *tdx = TDX_GUEST(obj);
> diff --git a/target/i386/kvm/tdx.h b/target/i386/kvm/tdx.h
> index e5d836805385..6b7926be3efe 100644
> --- a/target/i386/kvm/tdx.h
> +++ b/target/i386/kvm/tdx.h
> @@ -6,6 +6,7 @@
> #endif
>
> #include "confidential-guest.h"
> +#include "hw/i386/tdvf.h"
>
> #define TYPE_TDX_GUEST "tdx-guest"
> #define TDX_GUEST(obj) OBJECT_CHECK(TdxGuest, (obj), TYPE_TDX_GUEST)
> @@ -30,6 +31,7 @@ typedef struct TdxGuest {
> char *mrownerconfig; /* base64 encoded sha348 digest */
>
> MemoryRegion *tdvf_mr;
> + TdxFirmware tdvf;
> } TdxGuest;
>
> #ifdef CONFIG_TDX
> @@ -40,5 +42,6 @@ bool is_tdx_vm(void);
>
> int tdx_pre_create_vcpu(CPUState *cpu, Error **errp);
> void tdx_set_tdvf_region(MemoryRegion *tdvf_mr);
> +int tdx_parse_tdvf(void *flash_ptr, int size);
>
> #endif /* QEMU_I386_TDX_H */
> --
> 2.34.1
>