Add the global metadata for TDX core to enable extensions. They are: - "memory_pool_required_pages" Specify the required number of memory pool pages for the present extensions. - "ext_required" Specify if TDX.EXT.INIT is required. Note for these 2 fields, a value of 0 doesn't mean extensions are not supported. It means no need to call TDX.EXT.MEM.ADD or TDX.EXT.INIT. Signed-off-by: Xu Yilun Signed-off-by: Dan Williams --- arch/x86/include/asm/tdx_global_metadata.h | 6 ++++++ arch/x86/virt/vmx/tdx/tdx_global_metadata.c | 14 ++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/arch/x86/include/asm/tdx_global_metadata.h b/arch/x86/include/asm/tdx_global_metadata.h index 060a2ad744bf..2aa741190b93 100644 --- a/arch/x86/include/asm/tdx_global_metadata.h +++ b/arch/x86/include/asm/tdx_global_metadata.h @@ -34,11 +34,17 @@ struct tdx_sys_info_td_conf { u64 cpuid_config_values[128][2]; }; +struct tdx_sys_info_ext { + u16 memory_pool_required_pages; + u8 ext_required; +}; + struct tdx_sys_info { struct tdx_sys_info_features features; struct tdx_sys_info_tdmr tdmr; struct tdx_sys_info_td_ctrl td_ctrl; struct tdx_sys_info_td_conf td_conf; + struct tdx_sys_info_ext ext; }; #endif diff --git a/arch/x86/virt/vmx/tdx/tdx_global_metadata.c b/arch/x86/virt/vmx/tdx/tdx_global_metadata.c index 360963bc9328..c3b2e2748b3e 100644 --- a/arch/x86/virt/vmx/tdx/tdx_global_metadata.c +++ b/arch/x86/virt/vmx/tdx/tdx_global_metadata.c @@ -85,6 +85,19 @@ static __init int get_tdx_sys_info_td_conf(struct tdx_sys_info_td_conf *sysinfo_ return ret; } +static __init int get_tdx_sys_info_ext(struct tdx_sys_info_ext *sysinfo_ext) +{ + int ret = 0; + u64 val; + + if (!ret && !(ret = read_sys_metadata_field(0x3100000100000000, &val))) + sysinfo_ext->memory_pool_required_pages = val; + if (!ret && !(ret = read_sys_metadata_field(0x3100000100000001, &val))) + sysinfo_ext->ext_required = val; + + return ret; +} + static __init int get_tdx_sys_info(struct tdx_sys_info *sysinfo) { int ret = 0; @@ -93,6 +106,7 @@ static __init int get_tdx_sys_info(struct tdx_sys_info *sysinfo) ret = ret ?: get_tdx_sys_info_tdmr(&sysinfo->tdmr); ret = ret ?: get_tdx_sys_info_td_ctrl(&sysinfo->td_ctrl); ret = ret ?: get_tdx_sys_info_td_conf(&sysinfo->td_conf); + ret = ret ?: get_tdx_sys_info_ext(&sysinfo->ext); return ret; } -- 2.25.1