1 // SPDX-License-Identifier: GPL-2.0
3 * AMD Encrypted Register State Support
5 * Author: Joerg Roedel <jroedel@suse.de>
7 * This file is not compiled stand-alone. It contains code shared
8 * between the pre-decompression boot code and the running Linux kernel
9 * and is included directly into both code-bases.
12 #ifndef __BOOT_COMPRESSED
13 #define error(v) pr_err(v)
14 #define has_cpuflag(f) boot_cpu_has(f)
17 static bool __init
sev_es_check_cpu_features(void)
19 if (!has_cpuflag(X86_FEATURE_RDRAND
)) {
20 error("RDRAND instruction not supported - no trusted source of randomness available\n");
27 static void sev_es_terminate(unsigned int reason
)
29 u64 val
= GHCB_SEV_TERMINATE
;
32 * Tell the hypervisor what went wrong - only reason-set 0 is
33 * currently supported.
35 val
|= GHCB_SEV_TERMINATE_REASON(0, reason
);
37 /* Request Guest Termination from Hypvervisor */
38 sev_es_wr_ghcb_msr(val
);
42 asm volatile("hlt\n" : : : "memory");
45 static bool sev_es_negotiate_protocol(void)
49 /* Do the GHCB protocol version negotiation */
50 sev_es_wr_ghcb_msr(GHCB_SEV_INFO_REQ
);
52 val
= sev_es_rd_ghcb_msr();
54 if (GHCB_INFO(val
) != GHCB_SEV_INFO
)
57 if (GHCB_PROTO_MAX(val
) < GHCB_PROTO_OUR
||
58 GHCB_PROTO_MIN(val
) > GHCB_PROTO_OUR
)
64 static __always_inline
void vc_ghcb_invalidate(struct ghcb
*ghcb
)
66 memset(ghcb
->save
.valid_bitmap
, 0, sizeof(ghcb
->save
.valid_bitmap
));
69 static bool vc_decoding_needed(unsigned long exit_code
)
71 /* Exceptions don't require to decode the instruction */
72 return !(exit_code
>= SVM_EXIT_EXCP_BASE
&&
73 exit_code
<= SVM_EXIT_LAST_EXCP
);
76 static enum es_result
vc_init_em_ctxt(struct es_em_ctxt
*ctxt
,
78 unsigned long exit_code
)
80 enum es_result ret
= ES_OK
;
82 memset(ctxt
, 0, sizeof(*ctxt
));
85 if (vc_decoding_needed(exit_code
))
86 ret
= vc_decode_insn(ctxt
);
91 static void vc_finish_insn(struct es_em_ctxt
*ctxt
)
93 ctxt
->regs
->ip
+= ctxt
->insn
.length
;
96 static enum es_result
sev_es_ghcb_hv_call(struct ghcb
*ghcb
,
97 struct es_em_ctxt
*ctxt
,
98 u64 exit_code
, u64 exit_info_1
,
103 /* Fill in protocol and format specifiers */
104 ghcb
->protocol_version
= GHCB_PROTOCOL_MAX
;
105 ghcb
->ghcb_usage
= GHCB_DEFAULT_USAGE
;
107 ghcb_set_sw_exit_code(ghcb
, exit_code
);
108 ghcb_set_sw_exit_info_1(ghcb
, exit_info_1
);
109 ghcb_set_sw_exit_info_2(ghcb
, exit_info_2
);
111 sev_es_wr_ghcb_msr(__pa(ghcb
));
114 if ((ghcb
->save
.sw_exit_info_1
& 0xffffffff) == 1) {
115 u64 info
= ghcb
->save
.sw_exit_info_2
;
118 info
= ghcb
->save
.sw_exit_info_2
;
119 v
= info
& SVM_EVTINJ_VEC_MASK
;
121 /* Check if exception information from hypervisor is sane. */
122 if ((info
& SVM_EVTINJ_VALID
) &&
123 ((v
== X86_TRAP_GP
) || (v
== X86_TRAP_UD
)) &&
124 ((info
& SVM_EVTINJ_TYPE_MASK
) == SVM_EVTINJ_TYPE_EXEPT
)) {
126 if (info
& SVM_EVTINJ_VALID_ERR
)
127 ctxt
->fi
.error_code
= info
>> 32;
140 * Boot VC Handler - This is the first VC handler during boot, there is no GHCB
141 * page yet, so it only supports the MSR based communication with the
142 * hypervisor and only the CPUID exit-code.
144 void __init
do_vc_no_ghcb(struct pt_regs
*regs
, unsigned long exit_code
)
146 unsigned int fn
= lower_bits(regs
->ax
, 32);
149 /* Only CPUID is supported via MSR protocol */
150 if (exit_code
!= SVM_EXIT_CPUID
)
153 sev_es_wr_ghcb_msr(GHCB_CPUID_REQ(fn
, GHCB_CPUID_REQ_EAX
));
155 val
= sev_es_rd_ghcb_msr();
156 if (GHCB_SEV_GHCB_RESP_CODE(val
) != GHCB_SEV_CPUID_RESP
)
158 regs
->ax
= val
>> 32;
160 sev_es_wr_ghcb_msr(GHCB_CPUID_REQ(fn
, GHCB_CPUID_REQ_EBX
));
162 val
= sev_es_rd_ghcb_msr();
163 if (GHCB_SEV_GHCB_RESP_CODE(val
) != GHCB_SEV_CPUID_RESP
)
165 regs
->bx
= val
>> 32;
167 sev_es_wr_ghcb_msr(GHCB_CPUID_REQ(fn
, GHCB_CPUID_REQ_ECX
));
169 val
= sev_es_rd_ghcb_msr();
170 if (GHCB_SEV_GHCB_RESP_CODE(val
) != GHCB_SEV_CPUID_RESP
)
172 regs
->cx
= val
>> 32;
174 sev_es_wr_ghcb_msr(GHCB_CPUID_REQ(fn
, GHCB_CPUID_REQ_EDX
));
176 val
= sev_es_rd_ghcb_msr();
177 if (GHCB_SEV_GHCB_RESP_CODE(val
) != GHCB_SEV_CPUID_RESP
)
179 regs
->dx
= val
>> 32;
182 * This is a VC handler and the #VC is only raised when SEV-ES is
183 * active, which means SEV must be active too. Do sanity checks on the
184 * CPUID results to make sure the hypervisor does not trick the kernel
185 * into the no-sev path. This could map sensitive data unencrypted and
186 * make it accessible to the hypervisor.
188 * In particular, check for:
189 * - Hypervisor CPUID bit
190 * - Availability of CPUID leaf 0x8000001f
193 * The hypervisor might still report the wrong C-bit position, but this
194 * can't be checked here.
197 if ((fn
== 1 && !(regs
->cx
& BIT(31))))
200 else if (fn
== 0x80000000 && (regs
->ax
< 0x8000001f))
203 else if ((fn
== 0x8000001f && !(regs
->ax
& BIT(1))))
207 /* Skip over the CPUID two-byte opcode */
213 sev_es_wr_ghcb_msr(GHCB_SEV_TERMINATE
);
216 /* Shouldn't get here - if we do halt the machine */
218 asm volatile("hlt\n");
221 static enum es_result
vc_insn_string_read(struct es_em_ctxt
*ctxt
,
222 void *src
, char *buf
,
223 unsigned int data_size
,
227 int i
, b
= backwards
? -1 : 1;
228 enum es_result ret
= ES_OK
;
230 for (i
= 0; i
< count
; i
++) {
231 void *s
= src
+ (i
* data_size
* b
);
232 char *d
= buf
+ (i
* data_size
);
234 ret
= vc_read_mem(ctxt
, s
, d
, data_size
);
242 static enum es_result
vc_insn_string_write(struct es_em_ctxt
*ctxt
,
243 void *dst
, char *buf
,
244 unsigned int data_size
,
248 int i
, s
= backwards
? -1 : 1;
249 enum es_result ret
= ES_OK
;
251 for (i
= 0; i
< count
; i
++) {
252 void *d
= dst
+ (i
* data_size
* s
);
253 char *b
= buf
+ (i
* data_size
);
255 ret
= vc_write_mem(ctxt
, d
, b
, data_size
);
263 #define IOIO_TYPE_STR BIT(2)
264 #define IOIO_TYPE_IN 1
265 #define IOIO_TYPE_INS (IOIO_TYPE_IN | IOIO_TYPE_STR)
266 #define IOIO_TYPE_OUT 0
267 #define IOIO_TYPE_OUTS (IOIO_TYPE_OUT | IOIO_TYPE_STR)
269 #define IOIO_REP BIT(3)
271 #define IOIO_ADDR_64 BIT(9)
272 #define IOIO_ADDR_32 BIT(8)
273 #define IOIO_ADDR_16 BIT(7)
275 #define IOIO_DATA_32 BIT(6)
276 #define IOIO_DATA_16 BIT(5)
277 #define IOIO_DATA_8 BIT(4)
279 #define IOIO_SEG_ES (0 << 10)
280 #define IOIO_SEG_DS (3 << 10)
282 static enum es_result
vc_ioio_exitinfo(struct es_em_ctxt
*ctxt
, u64
*exitinfo
)
284 struct insn
*insn
= &ctxt
->insn
;
287 switch (insn
->opcode
.bytes
[0]) {
291 *exitinfo
|= IOIO_TYPE_INS
;
292 *exitinfo
|= IOIO_SEG_ES
;
293 *exitinfo
|= (ctxt
->regs
->dx
& 0xffff) << 16;
299 *exitinfo
|= IOIO_TYPE_OUTS
;
300 *exitinfo
|= IOIO_SEG_DS
;
301 *exitinfo
|= (ctxt
->regs
->dx
& 0xffff) << 16;
304 /* IN immediate opcodes */
307 *exitinfo
|= IOIO_TYPE_IN
;
308 *exitinfo
|= (u8
)insn
->immediate
.value
<< 16;
311 /* OUT immediate opcodes */
314 *exitinfo
|= IOIO_TYPE_OUT
;
315 *exitinfo
|= (u8
)insn
->immediate
.value
<< 16;
318 /* IN register opcodes */
321 *exitinfo
|= IOIO_TYPE_IN
;
322 *exitinfo
|= (ctxt
->regs
->dx
& 0xffff) << 16;
325 /* OUT register opcodes */
328 *exitinfo
|= IOIO_TYPE_OUT
;
329 *exitinfo
|= (ctxt
->regs
->dx
& 0xffff) << 16;
333 return ES_DECODE_FAILED
;
336 switch (insn
->opcode
.bytes
[0]) {
343 /* Single byte opcodes */
344 *exitinfo
|= IOIO_DATA_8
;
347 /* Length determined by instruction parsing */
348 *exitinfo
|= (insn
->opnd_bytes
== 2) ? IOIO_DATA_16
351 switch (insn
->addr_bytes
) {
353 *exitinfo
|= IOIO_ADDR_16
;
356 *exitinfo
|= IOIO_ADDR_32
;
359 *exitinfo
|= IOIO_ADDR_64
;
363 if (insn_has_rep_prefix(insn
))
364 *exitinfo
|= IOIO_REP
;
369 static enum es_result
vc_handle_ioio(struct ghcb
*ghcb
, struct es_em_ctxt
*ctxt
)
371 struct pt_regs
*regs
= ctxt
->regs
;
372 u64 exit_info_1
, exit_info_2
;
375 ret
= vc_ioio_exitinfo(ctxt
, &exit_info_1
);
379 if (exit_info_1
& IOIO_TYPE_STR
) {
383 bool df
= ((regs
->flags
& X86_EFLAGS_DF
) == X86_EFLAGS_DF
);
384 unsigned int io_bytes
, exit_bytes
;
385 unsigned int ghcb_count
, op_count
;
386 unsigned long es_base
;
390 * For the string variants with rep prefix the amount of in/out
391 * operations per #VC exception is limited so that the kernel
392 * has a chance to take interrupts and re-schedule while the
393 * instruction is emulated.
395 io_bytes
= (exit_info_1
>> 4) & 0x7;
396 ghcb_count
= sizeof(ghcb
->shared_buffer
) / io_bytes
;
398 op_count
= (exit_info_1
& IOIO_REP
) ? regs
->cx
: 1;
399 exit_info_2
= min(op_count
, ghcb_count
);
400 exit_bytes
= exit_info_2
* io_bytes
;
402 es_base
= insn_get_seg_base(ctxt
->regs
, INAT_SEG_REG_ES
);
404 /* Read bytes of OUTS into the shared buffer */
405 if (!(exit_info_1
& IOIO_TYPE_IN
)) {
406 ret
= vc_insn_string_read(ctxt
,
407 (void *)(es_base
+ regs
->si
),
408 ghcb
->shared_buffer
, io_bytes
,
415 * Issue an VMGEXIT to the HV to consume the bytes from the
416 * shared buffer or to have it write them into the shared buffer
417 * depending on the instruction: OUTS or INS.
419 sw_scratch
= __pa(ghcb
) + offsetof(struct ghcb
, shared_buffer
);
420 ghcb_set_sw_scratch(ghcb
, sw_scratch
);
421 ret
= sev_es_ghcb_hv_call(ghcb
, ctxt
, SVM_EXIT_IOIO
,
422 exit_info_1
, exit_info_2
);
426 /* Read bytes from shared buffer into the guest's destination. */
427 if (exit_info_1
& IOIO_TYPE_IN
) {
428 ret
= vc_insn_string_write(ctxt
,
429 (void *)(es_base
+ regs
->di
),
430 ghcb
->shared_buffer
, io_bytes
,
436 regs
->di
-= exit_bytes
;
438 regs
->di
+= exit_bytes
;
441 regs
->si
-= exit_bytes
;
443 regs
->si
+= exit_bytes
;
446 if (exit_info_1
& IOIO_REP
)
447 regs
->cx
-= exit_info_2
;
449 ret
= regs
->cx
? ES_RETRY
: ES_OK
;
453 /* IN/OUT into/from rAX */
455 int bits
= (exit_info_1
& 0x70) >> 1;
458 if (!(exit_info_1
& IOIO_TYPE_IN
))
459 rax
= lower_bits(regs
->ax
, bits
);
461 ghcb_set_rax(ghcb
, rax
);
463 ret
= sev_es_ghcb_hv_call(ghcb
, ctxt
, SVM_EXIT_IOIO
, exit_info_1
, 0);
467 if (exit_info_1
& IOIO_TYPE_IN
) {
468 if (!ghcb_rax_is_valid(ghcb
))
470 regs
->ax
= lower_bits(ghcb
->save
.rax
, bits
);
477 static enum es_result
vc_handle_cpuid(struct ghcb
*ghcb
,
478 struct es_em_ctxt
*ctxt
)
480 struct pt_regs
*regs
= ctxt
->regs
;
481 u32 cr4
= native_read_cr4();
484 ghcb_set_rax(ghcb
, regs
->ax
);
485 ghcb_set_rcx(ghcb
, regs
->cx
);
487 if (cr4
& X86_CR4_OSXSAVE
)
488 /* Safe to read xcr0 */
489 ghcb_set_xcr0(ghcb
, xgetbv(XCR_XFEATURE_ENABLED_MASK
));
491 /* xgetbv will cause #GP - use reset value for xcr0 */
492 ghcb_set_xcr0(ghcb
, 1);
494 ret
= sev_es_ghcb_hv_call(ghcb
, ctxt
, SVM_EXIT_CPUID
, 0, 0);
498 if (!(ghcb_rax_is_valid(ghcb
) &&
499 ghcb_rbx_is_valid(ghcb
) &&
500 ghcb_rcx_is_valid(ghcb
) &&
501 ghcb_rdx_is_valid(ghcb
)))
504 regs
->ax
= ghcb
->save
.rax
;
505 regs
->bx
= ghcb
->save
.rbx
;
506 regs
->cx
= ghcb
->save
.rcx
;
507 regs
->dx
= ghcb
->save
.rdx
;
512 static enum es_result
vc_handle_rdtsc(struct ghcb
*ghcb
,
513 struct es_em_ctxt
*ctxt
,
514 unsigned long exit_code
)
516 bool rdtscp
= (exit_code
== SVM_EXIT_RDTSCP
);
519 ret
= sev_es_ghcb_hv_call(ghcb
, ctxt
, exit_code
, 0, 0);
523 if (!(ghcb_rax_is_valid(ghcb
) && ghcb_rdx_is_valid(ghcb
) &&
524 (!rdtscp
|| ghcb_rcx_is_valid(ghcb
))))
527 ctxt
->regs
->ax
= ghcb
->save
.rax
;
528 ctxt
->regs
->dx
= ghcb
->save
.rdx
;
530 ctxt
->regs
->cx
= ghcb
->save
.rcx
;