mirror of
https://github.com/torvalds/linux.git
synced 2026-04-19 15:24:02 -04:00
Intel Trust Domain Extensions (TDX) protects guest VMs from malicious host and certain physical attacks. A CPU-attested software module called 'the TDX module' runs inside a new isolated memory range as a trusted hypervisor to manage and run protected VMs. TDX introduces a new CPU mode: Secure Arbitration Mode (SEAM). This mode runs only the TDX module itself or other code to load the TDX module. The host kernel communicates with SEAM software via a new SEAMCALL instruction. This is conceptually similar to a guest->host hypercall, except it is made from the host to SEAM software instead. The TDX module establishes a new SEAMCALL ABI which allows the host to initialize the module and to manage VMs. The SEAMCALL ABI is very similar to the TDCALL ABI and leverages much TDCALL infrastructure. Wire up basic functions to make SEAMCALLs for the basic support of running TDX guests: __seamcall(), __seamcall_ret(), and __seamcall_saved_ret() for TDH.VP.ENTER. All SEAMCALLs involved in the basic TDX support don't use "callee-saved" registers as input and output, except the TDH.VP.ENTER. To start to support TDX, create a new arch/x86/virt/vmx/tdx/tdx.c for TDX host kernel support. Add a new Kconfig option CONFIG_INTEL_TDX_HOST to opt-in TDX host kernel support (to distinguish with TDX guest kernel support). So far only KVM uses TDX. Make the new config option depend on KVM_INTEL. Signed-off-by: Kai Huang <kai.huang@intel.com> Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> Reviewed-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Tested-by: Isaku Yamahata <isaku.yamahata@intel.com> Link: https://lore.kernel.org/all/4db7c3fc085e6af12acc2932294254ddb3d320b3.1692096753.git.kai.huang%40intel.com
62 lines
1.9 KiB
ArmAsm
62 lines
1.9 KiB
ArmAsm
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#include <linux/linkage.h>
|
|
#include <asm/frame.h>
|
|
|
|
#include "tdxcall.S"
|
|
|
|
/*
|
|
* __seamcall() - Host-side interface functions to SEAM software
|
|
* (the P-SEAMLDR or the TDX module).
|
|
*
|
|
* __seamcall() function ABI:
|
|
*
|
|
* @fn (RDI) - SEAMCALL Leaf number, moved to RAX
|
|
* @args (RSI) - struct tdx_module_args for input
|
|
*
|
|
* Only RCX/RDX/R8-R11 are used as input registers.
|
|
*
|
|
* Return (via RAX) TDX_SEAMCALL_VMFAILINVALID if the SEAMCALL itself
|
|
* fails, or the completion status of the SEAMCALL leaf function.
|
|
*/
|
|
SYM_FUNC_START(__seamcall)
|
|
TDX_MODULE_CALL host=1
|
|
SYM_FUNC_END(__seamcall)
|
|
|
|
/*
|
|
* __seamcall_ret() - Host-side interface functions to SEAM software
|
|
* (the P-SEAMLDR or the TDX module), with saving output registers to
|
|
* the 'struct tdx_module_args' used as input.
|
|
*
|
|
* __seamcall_ret() function ABI:
|
|
*
|
|
* @fn (RDI) - SEAMCALL Leaf number, moved to RAX
|
|
* @args (RSI) - struct tdx_module_args for input and output
|
|
*
|
|
* Only RCX/RDX/R8-R11 are used as input/output registers.
|
|
*
|
|
* Return (via RAX) TDX_SEAMCALL_VMFAILINVALID if the SEAMCALL itself
|
|
* fails, or the completion status of the SEAMCALL leaf function.
|
|
*/
|
|
SYM_FUNC_START(__seamcall_ret)
|
|
TDX_MODULE_CALL host=1 ret=1
|
|
SYM_FUNC_END(__seamcall_ret)
|
|
|
|
/*
|
|
* __seamcall_saved_ret() - Host-side interface functions to SEAM software
|
|
* (the P-SEAMLDR or the TDX module), with saving output registers to the
|
|
* 'struct tdx_module_args' used as input.
|
|
*
|
|
* __seamcall_saved_ret() function ABI:
|
|
*
|
|
* @fn (RDI) - SEAMCALL Leaf number, moved to RAX
|
|
* @args (RSI) - struct tdx_module_args for input and output
|
|
*
|
|
* All registers in @args are used as input/output registers.
|
|
*
|
|
* Return (via RAX) TDX_SEAMCALL_VMFAILINVALID if the SEAMCALL itself
|
|
* fails, or the completion status of the SEAMCALL leaf function.
|
|
*/
|
|
SYM_FUNC_START(__seamcall_saved_ret)
|
|
TDX_MODULE_CALL host=1 ret=1 saved=1
|
|
SYM_FUNC_END(__seamcall_saved_ret)
|