mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-18 16:44:27 +08:00
x86/tdx: Expand __tdx_hypercall() to handle more arguments
So far __tdx_hypercall() only handles six arguments for VMCALL. Expanding it to six more register would allow to cover more use-cases like ReportFatalError() and Hyper-V hypercalls. With all preparations in place, the expansion is pretty straight forward. Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> Link: https://lore.kernel.org/all/20230126221159.8635-5-kirill.shutemov%40linux.intel.com
This commit is contained in:
parent
c30c4b2555
commit
752d13305c
@ -13,6 +13,12 @@
|
||||
/*
|
||||
* Bitmasks of exposed registers (with VMM).
|
||||
*/
|
||||
#define TDX_RDX BIT(2)
|
||||
#define TDX_RBX BIT(3)
|
||||
#define TDX_RSI BIT(6)
|
||||
#define TDX_RDI BIT(7)
|
||||
#define TDX_R8 BIT(8)
|
||||
#define TDX_R9 BIT(9)
|
||||
#define TDX_R10 BIT(10)
|
||||
#define TDX_R11 BIT(11)
|
||||
#define TDX_R12 BIT(12)
|
||||
@ -27,9 +33,9 @@
|
||||
* details can be found in TDX GHCI specification, section
|
||||
* titled "TDCALL [TDG.VP.VMCALL] leaf".
|
||||
*/
|
||||
#define TDVMCALL_EXPOSE_REGS_MASK ( TDX_R10 | TDX_R11 | \
|
||||
TDX_R12 | TDX_R13 | \
|
||||
TDX_R14 | TDX_R15 )
|
||||
#define TDVMCALL_EXPOSE_REGS_MASK \
|
||||
( TDX_RDX | TDX_RBX | TDX_RSI | TDX_RDI | TDX_R8 | TDX_R9 | \
|
||||
TDX_R10 | TDX_R11 | TDX_R12 | TDX_R13 | TDX_R14 | TDX_R15 )
|
||||
|
||||
/*
|
||||
* __tdx_module_call() - Used by TDX guests to request services from
|
||||
@ -124,6 +130,7 @@ SYM_FUNC_START(__tdx_hypercall)
|
||||
push %r14
|
||||
push %r13
|
||||
push %r12
|
||||
push %rbx
|
||||
push %rbp
|
||||
|
||||
/* Free RDI and RSI to be used as TDVMCALL arguments */
|
||||
@ -131,12 +138,18 @@ SYM_FUNC_START(__tdx_hypercall)
|
||||
movq %rsi, %rbp
|
||||
|
||||
/* Copy hypercall registers from arg struct: */
|
||||
movq TDX_HYPERCALL_r8(%rax), %r8
|
||||
movq TDX_HYPERCALL_r9(%rax), %r9
|
||||
movq TDX_HYPERCALL_r10(%rax), %r10
|
||||
movq TDX_HYPERCALL_r11(%rax), %r11
|
||||
movq TDX_HYPERCALL_r12(%rax), %r12
|
||||
movq TDX_HYPERCALL_r13(%rax), %r13
|
||||
movq TDX_HYPERCALL_r14(%rax), %r14
|
||||
movq TDX_HYPERCALL_r15(%rax), %r15
|
||||
movq TDX_HYPERCALL_rdi(%rax), %rdi
|
||||
movq TDX_HYPERCALL_rsi(%rax), %rsi
|
||||
movq TDX_HYPERCALL_rbx(%rax), %rbx
|
||||
movq TDX_HYPERCALL_rdx(%rax), %rdx
|
||||
|
||||
push %rax
|
||||
|
||||
@ -178,12 +191,18 @@ SYM_FUNC_START(__tdx_hypercall)
|
||||
testq $TDX_HCALL_HAS_OUTPUT, %rbp
|
||||
jz .Lout
|
||||
|
||||
movq %r8, TDX_HYPERCALL_r8(%rax)
|
||||
movq %r9, TDX_HYPERCALL_r9(%rax)
|
||||
movq %r10, TDX_HYPERCALL_r10(%rax)
|
||||
movq %r11, TDX_HYPERCALL_r11(%rax)
|
||||
movq %r12, TDX_HYPERCALL_r12(%rax)
|
||||
movq %r13, TDX_HYPERCALL_r13(%rax)
|
||||
movq %r14, TDX_HYPERCALL_r14(%rax)
|
||||
movq %r15, TDX_HYPERCALL_r15(%rax)
|
||||
movq %rdi, TDX_HYPERCALL_rdi(%rax)
|
||||
movq %rsi, TDX_HYPERCALL_rsi(%rax)
|
||||
movq %rbx, TDX_HYPERCALL_rbx(%rax)
|
||||
movq %rdx, TDX_HYPERCALL_rdx(%rax)
|
||||
.Lout:
|
||||
/* TDVMCALL leaf return code is in R10 */
|
||||
movq %r10, %rax
|
||||
@ -191,14 +210,20 @@ SYM_FUNC_START(__tdx_hypercall)
|
||||
/*
|
||||
* Zero out registers exposed to the VMM to avoid speculative execution
|
||||
* with VMM-controlled values. This needs to include all registers
|
||||
* present in TDVMCALL_EXPOSE_REGS_MASK (except R12-R15). R12-R15
|
||||
* context will be restored.
|
||||
* present in TDVMCALL_EXPOSE_REGS_MASK, except RBX, and R12-R15 which
|
||||
* will be restored.
|
||||
*/
|
||||
xor %r8d, %r8d
|
||||
xor %r9d, %r9d
|
||||
xor %r10d, %r10d
|
||||
xor %r11d, %r11d
|
||||
xor %rdi, %rdi
|
||||
xor %rsi, %rsi
|
||||
xor %rdx, %rdx
|
||||
|
||||
/* Restore callee-saved GPRs as mandated by the x86_64 ABI */
|
||||
pop %rbp
|
||||
pop %rbx
|
||||
pop %r12
|
||||
pop %r13
|
||||
pop %r14
|
||||
|
Loading…
Reference in New Issue
Block a user