|
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