Add a helper function to retrieve P-SEAMLDR information, including its version and features, using the dedicated P_SEAMLDR_INFO API. This is in preparation for exposing this information to userspace. Userspace will utilize the version number to verify the compatibility of TDX modules with the P-SEAMLDR Signed-off-by: Chao Gao <chao.gao@xxxxxxxxx> Tested-by: Farrah Chen <farrah.chen@xxxxxxxxx> --- arch/x86/virt/vmx/tdx/seamldr.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/arch/x86/virt/vmx/tdx/seamldr.c b/arch/x86/virt/vmx/tdx/seamldr.c index a252f1ae3483..c2771323729c 100644 --- a/arch/x86/virt/vmx/tdx/seamldr.c +++ b/arch/x86/virt/vmx/tdx/seamldr.c @@ -11,7 +11,26 @@ #include "tdx.h" #include "../vmx.h" -static __maybe_unused int seamldr_call(u64 fn, struct tdx_module_args *args) + /* P-SEAMLDR SEAMCALL leaf function */ +#define P_SEAMLDR_INFO 0x8000000000000000 + +struct seamldr_info { + u32 version; + u32 attributes; + u32 vendor_id; + u32 build_date; + u16 build_num; + u16 minor_version; + u16 major_version; + u16 update_version; + u8 reserved0[4]; + u32 num_remaining_updates; + u8 reserved1[224]; +} __packed; + +static struct seamldr_info seamldr_info __aligned(256); + +static inline int seamldr_call(u64 fn, struct tdx_module_args *args) { u64 vmcs; int ret; @@ -42,3 +61,10 @@ static __maybe_unused int seamldr_call(u64 fn, struct tdx_module_args *args) return ret; } + +static __maybe_unused int get_seamldr_info(void) +{ + struct tdx_module_args args = { .rcx = __pa(&seamldr_info) }; + + return seamldr_call(P_SEAMLDR_INFO, &args); +} -- 2.47.1