x86/virt/tdx: Reset software states during TDX module shutdown

The TDX module requires a one-time global initialization (TDH.SYS.INIT) and
per-CPU initialization (TDH.SYS.LP.INIT) before use. These initializations
are guarded by software flags to prevent repetition.

Reset all software flags guarding the initialization flows to allow the
global and per-CPU initializations to be triggered again after updates.

[ dhansen: trim down changelog ]

Signed-off-by: Chao Gao <chao.gao@intel.com>
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Reviewed-by: Tony Lindgren <tony.lindgren@linux.intel.com>
Reviewed-by: Kai Huang <kai.huang@intel.com>
Reviewed-by: Rick Edgecombe <rick.p.edgecombe@intel.com>
Link: https://patch.msgid.link/20260520133909.409394-18-chao.gao@intel.com
This commit is contained in:
Chao Gao 2026-05-20 15:29:06 -07:00 committed by Dave Hansen
parent 9ea06080a6
commit 65a6542a81

View File

@ -1279,6 +1279,7 @@ int tdx_module_shutdown(void)
struct tdx_sys_info_handoff handoff = {};
struct tdx_module_args args = {};
int ret;
int cpu;
ret = get_tdx_sys_info_handoff(&handoff);
/*
@ -1294,7 +1295,21 @@ int tdx_module_shutdown(void)
*/
args.rcx = handoff.module_hv;
return seamcall_prerr(TDH_SYS_SHUTDOWN, &args);
ret = seamcall_prerr(TDH_SYS_SHUTDOWN, &args);
if (ret)
return ret;
/*
* Clear global and per-CPU initialization flags so the new module
* can be fully re-initialized after a successful update.
*
* No locks needed as no concurrent accesses can occur here.
*/
memset(&tdx_module_state, 0, sizeof(tdx_module_state));
for_each_possible_cpu(cpu)
per_cpu(tdx_lp_initialized, cpu) = false;
return 0;
}
static bool is_pamt_page(unsigned long phys)