x86/tdx: Expand __tdx_hypercall() to handle more arguments
authorKirill A. Shutemov <kirill.shutemov@linux.intel.com>
Thu, 26 Jan 2023 22:11:56 +0000 (01:11 +0300)
committerDave Hansen <dave.hansen@linux.intel.com>
Fri, 27 Jan 2023 17:42:09 +0000 (09:42 -0800)
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
arch/x86/coco/tdx/tdcall.S

index a9bb4cb..5da06d1 100644 (file)
 /*
  * 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