|
13 | 13 | /*
|
14 | 14 | * Bitmasks of exposed registers (with VMM).
|
15 | 15 | */
|
| 16 | +#define TDX_RDX BIT(2) |
| 17 | +#define TDX_RBX BIT(3) |
| 18 | +#define TDX_RSI BIT(6) |
| 19 | +#define TDX_RDI BIT(7) |
| 20 | +#define TDX_R8 BIT(8) |
| 21 | +#define TDX_R9 BIT(9) |
16 | 22 | #define TDX_R10 BIT(10)
|
17 | 23 | #define TDX_R11 BIT(11)
|
18 | 24 | #define TDX_R12 BIT(12)
|
|
27 | 33 | * details can be found in TDX GHCI specification, section
|
28 | 34 | * titled "TDCALL [TDG.VP.VMCALL] leaf".
|
29 | 35 | */
|
30 |
| -#define TDVMCALL_EXPOSE_REGS_MASK ( TDX_R10 | TDX_R11 | \ |
31 |
| - TDX_R12 | TDX_R13 | \ |
32 |
| - TDX_R14 | TDX_R15 ) |
| 36 | +#define TDVMCALL_EXPOSE_REGS_MASK \ |
| 37 | + ( TDX_RDX | TDX_RBX | TDX_RSI | TDX_RDI | TDX_R8 | TDX_R9 | \ |
| 38 | + TDX_R10 | TDX_R11 | TDX_R12 | TDX_R13 | TDX_R14 | TDX_R15 ) |
33 | 39 |
|
34 | 40 | /*
|
35 | 41 | * __tdx_module_call() - Used by TDX guests to request services from
|
@@ -124,19 +130,26 @@ SYM_FUNC_START(__tdx_hypercall)
|
124 | 130 | push %r14
|
125 | 131 | push %r13
|
126 | 132 | push %r12
|
| 133 | + push %rbx |
127 | 134 | push %rbp
|
128 | 135 |
|
129 | 136 | /* Free RDI and RSI to be used as TDVMCALL arguments */
|
130 | 137 | movq %rdi, %rax
|
131 | 138 | movq %rsi, %rbp
|
132 | 139 |
|
133 | 140 | /* Copy hypercall registers from arg struct: */
|
| 141 | + movq TDX_HYPERCALL_r8(%rax), %r8 |
| 142 | + movq TDX_HYPERCALL_r9(%rax), %r9 |
134 | 143 | movq TDX_HYPERCALL_r10(%rax), %r10
|
135 | 144 | movq TDX_HYPERCALL_r11(%rax), %r11
|
136 | 145 | movq TDX_HYPERCALL_r12(%rax), %r12
|
137 | 146 | movq TDX_HYPERCALL_r13(%rax), %r13
|
138 | 147 | movq TDX_HYPERCALL_r14(%rax), %r14
|
139 | 148 | movq TDX_HYPERCALL_r15(%rax), %r15
|
| 149 | + movq TDX_HYPERCALL_rdi(%rax), %rdi |
| 150 | + movq TDX_HYPERCALL_rsi(%rax), %rsi |
| 151 | + movq TDX_HYPERCALL_rbx(%rax), %rbx |
| 152 | + movq TDX_HYPERCALL_rdx(%rax), %rdx |
140 | 153 |
|
141 | 154 | push %rax
|
142 | 155 |
|
@@ -178,27 +191,39 @@ SYM_FUNC_START(__tdx_hypercall)
|
178 | 191 | testq $TDX_HCALL_HAS_OUTPUT, %rbp
|
179 | 192 | jz .Lout
|
180 | 193 |
|
| 194 | + movq %r8, TDX_HYPERCALL_r8(%rax) |
| 195 | + movq %r9, TDX_HYPERCALL_r9(%rax) |
181 | 196 | movq %r10, TDX_HYPERCALL_r10(%rax)
|
182 | 197 | movq %r11, TDX_HYPERCALL_r11(%rax)
|
183 | 198 | movq %r12, TDX_HYPERCALL_r12(%rax)
|
184 | 199 | movq %r13, TDX_HYPERCALL_r13(%rax)
|
185 | 200 | movq %r14, TDX_HYPERCALL_r14(%rax)
|
186 | 201 | movq %r15, TDX_HYPERCALL_r15(%rax)
|
| 202 | + movq %rdi, TDX_HYPERCALL_rdi(%rax) |
| 203 | + movq %rsi, TDX_HYPERCALL_rsi(%rax) |
| 204 | + movq %rbx, TDX_HYPERCALL_rbx(%rax) |
| 205 | + movq %rdx, TDX_HYPERCALL_rdx(%rax) |
187 | 206 | .Lout:
|
188 | 207 | /* TDVMCALL leaf return code is in R10 */
|
189 | 208 | movq %r10, %rax
|
190 | 209 |
|
191 | 210 | /*
|
192 | 211 | * Zero out registers exposed to the VMM to avoid speculative execution
|
193 | 212 | * with VMM-controlled values. This needs to include all registers
|
194 |
| - * present in TDVMCALL_EXPOSE_REGS_MASK (except R12-R15). R12-R15 |
195 |
| - * context will be restored. |
| 213 | + * present in TDVMCALL_EXPOSE_REGS_MASK, except RBX, and R12-R15 which |
| 214 | + * will be restored. |
196 | 215 | */
|
| 216 | + xor %r8d, %r8d |
| 217 | + xor %r9d, %r9d |
197 | 218 | xor %r10d, %r10d
|
198 | 219 | xor %r11d, %r11d
|
| 220 | + xor %rdi, %rdi |
| 221 | + xor %rsi, %rsi |
| 222 | + xor %rdx, %rdx |
199 | 223 |
|
200 | 224 | /* Restore callee-saved GPRs as mandated by the x86_64 ABI */
|
201 | 225 | pop %rbp
|
| 226 | + pop %rbx |
202 | 227 | pop %r12
|
203 | 228 | pop %r13
|
204 | 229 | pop %r14
|
|
0 commit comments