Following the shutdown of the existing TDX module, the update process continues with installing the new module. P-SEAMLDR provides the SEAMLDR.INSTALL SEAMCALL to perform this installation, which must be executed on all CPUs. Implement SEAMLDR.INSTALL and execute it on every CPU. Signed-off-by: Chao Gao Reviewed-by: Tony Lindgren Reviewed-by: Kai Huang Reviewed-by: Xu Yilun --- v5: - drop "serially" from the changelog as it doesn't matter to this patch --- arch/x86/virt/vmx/tdx/seamldr.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/arch/x86/virt/vmx/tdx/seamldr.c b/arch/x86/virt/vmx/tdx/seamldr.c index bb4aa6327eee..a64271f94aed 100644 --- a/arch/x86/virt/vmx/tdx/seamldr.c +++ b/arch/x86/virt/vmx/tdx/seamldr.c @@ -19,6 +19,7 @@ /* P-SEAMLDR SEAMCALL leaf function */ #define P_SEAMLDR_INFO 0x8000000000000000 +#define P_SEAMLDR_INSTALL 0x8000000000000001 #define SEAMLDR_MAX_NR_MODULE_4KB_PAGES 496 #define SEAMLDR_MAX_NR_SIG_4KB_PAGES 4 @@ -186,6 +187,7 @@ static struct seamldr_params *init_seamldr_params(const u8 *data, u32 size) enum module_update_state { MODULE_UPDATE_START, MODULE_UPDATE_SHUTDOWN, + MODULE_UPDATE_CPU_INSTALL, MODULE_UPDATE_DONE, }; @@ -225,6 +227,7 @@ static void ack_state(void) static int do_seamldr_install_module(void *seamldr_params) { enum module_update_state newstate, curstate = MODULE_UPDATE_START; + struct tdx_module_args args = {}; int cpu = smp_processor_id(); bool primary; int ret = 0; @@ -243,6 +246,10 @@ static int do_seamldr_install_module(void *seamldr_params) if (primary) ret = tdx_module_shutdown(); break; + case MODULE_UPDATE_CPU_INSTALL: + args.rcx = __pa(seamldr_params); + ret = seamldr_call(P_SEAMLDR_INSTALL, &args); + break; default: break; } -- 2.47.3