]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
x86/virt/tdx: Reset software states during TDX module shutdown
authorChao Gao <chao.gao@intel.com>
Wed, 20 May 2026 22:29:06 +0000 (15:29 -0700)
committerDave Hansen <dave.hansen@linux.intel.com>
Wed, 3 Jun 2026 15:59:43 +0000 (08:59 -0700)
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
arch/x86/virt/vmx/tdx/tdx.c

index 3fe01b546fb8a54ec671ba68a8502a4386414ac4..37e52cd4a389f5edacb171ebfd0c7781c2c2fc78 100644 (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)