Skip to content

Commit 3a0cc5d

Browse files
kaihuangrpedgeco
authored andcommitted
x86/virt/tdx: Add SEAMCALL wrapper to enter/exit TDX guest
Intel TDX protects guest VM's from malicious host and certain physical attacks. TDX introduces a new operation mode, Secure Arbitration Mode (SEAM) to isolate and protect guest VM's. A TDX guest VM runs in SEAM and, unlike VMX, direct control and interaction with the guest by the host VMM is not possible. Instead, Intel TDX Module, which also runs in SEAM, provides a SEAMCALL API. The SEAMCALL that provides the ability to enter a guest is TDH.VP.ENTER. The TDX Module processes TDH.VP.ENTER, and enters the guest via VMX VMLAUNCH/VMRESUME instructions. When a guest VM-exit requires host VMM interaction, the TDH.VP.ENTER SEAMCALL returns to the host VMM (KVM). Add tdh_vp_enter() to wrap the SEAMCALL invocation of TDH.VP.ENTER. TDH.VP.ENTER is different from other SEAMCALLS in several ways: - it may take some time to return as the guest executes - it uses more arguments - after it returns some host state may need to be restored TDH.VP.ENTER arguments are passed through General Purpose Registers (GPRs). For the special case of the TD guest invoking TDG.VP.VMCALL, nearly any GPR can be used, as well as XMM0 to XMM15. Notably, RBP is not used, and Linux mandates the TDX Module feature NO_RBP_MOD, which is enforced elsewhere. Additionally, XMM registers are not required for the existing Guest Hypervisor Communication Interface and are handled by existing KVM code should they be modified by the guest. There are 2 input formats and 5 output formats for TDH.VP.ENTER arguments. Input #1 : Initial entry or following a previous async. TD Exit Input #2 : Following a previous TDCALL(TDG.VP.VMCALL) Output #1 : On Error (No TD Entry) Output #2 : Async. Exits with a VMX Architectural Exit Reason Output #3 : Async. Exits with a non-VMX TD Exit Status Output #4 : Async. Exits with Cross-TD Exit Details Output #5 : On TDCALL(TDG.VP.VMCALL) Currently, to keep things simple, the wrapper function does not attempt to support different formats, and just passes all the GPRs that could be used. The GPR values are held by KVM in the area set aside for guest GPRs. KVM code uses the guest GPR area (vcpu->arch.regs[]) to set up for or process results of tdh_vp_enter(). Therefore changing tdh_vp_enter() to use more complex argument formats would also alter the way KVM code interacts with tdh_vp_enter(). Signed-off-by: Kai Huang <[email protected]> --- -Kai: - This is not nice, but for now have no clue on improvement.
1 parent 62aa330 commit 3a0cc5d

File tree

3 files changed

+10
-0
lines changed

3 files changed

+10
-0
lines changed

arch/x86/include/asm/tdx.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ int tdx_guest_keyid_alloc(void);
123123
void tdx_guest_keyid_free(unsigned int keyid);
124124

125125
/* SEAMCALL wrappers for creating/destroying/running TDX guests */
126+
u64 tdh_vp_enter(u64 tdvpr, struct tdx_module_args *args);
126127
u64 tdh_mng_addcx(u64 tdr, u64 tdcs);
127128
u64 tdh_mem_page_add(u64 tdr, u64 gpa, u64 hpa, u64 source, u64 *rcx, u64 *rdx);
128129
u64 tdh_mem_sept_add(u64 tdr, u64 gpa, u64 level, u64 hpa, u64 *rcx, u64 *rdx);

arch/x86/virt/vmx/tdx/tdx.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1600,6 +1600,14 @@ static inline u64 tdx_seamcall_sept(u64 op, struct tdx_module_args *in)
16001600
return ret;
16011601
}
16021602

1603+
u64 tdh_vp_enter(u64 tdvpr, struct tdx_module_args *args)
1604+
{
1605+
args->rcx = tdvpr;
1606+
1607+
return __seamcall_saved_ret(TDH_VP_ENTER, args);
1608+
}
1609+
EXPORT_SYMBOL_GPL(tdh_vp_enter);
1610+
16031611
u64 tdh_mng_addcx(u64 tdr, u64 tdcs)
16041612
{
16051613
struct tdx_module_args args = {

arch/x86/virt/vmx/tdx/tdx.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
/*
1818
* TDX module SEAMCALL leaf functions
1919
*/
20+
#define TDH_VP_ENTER 0
2021
#define TDH_MNG_ADDCX 1
2122
#define TDH_MEM_PAGE_ADD 2
2223
#define TDH_MEM_SEPT_ADD 3

0 commit comments

Comments
 (0)