xref: /kvm-unit-tests/x86/amd_sev.c (revision 8e38cb3299b4b8f2d9831f9c2612a9125e5800c0)
1350bf64aSZixuan Wang /*
2350bf64aSZixuan Wang  * AMD SEV test cases
3350bf64aSZixuan Wang  *
4350bf64aSZixuan Wang  * Copyright (c) 2021, Google Inc
5350bf64aSZixuan Wang  *
6350bf64aSZixuan Wang  * Authors:
7350bf64aSZixuan Wang  *   Hyunwook (Wooky) Baek <baekhw@google.com>
8350bf64aSZixuan Wang  *   Zixuan Wang <zixuanwang@google.com>
9350bf64aSZixuan Wang  *
10350bf64aSZixuan Wang  * SPDX-License-Identifier: LGPL-2.0-or-later
11350bf64aSZixuan Wang  */
12350bf64aSZixuan Wang 
13350bf64aSZixuan Wang #include "libcflat.h"
14350bf64aSZixuan Wang #include "x86/processor.h"
15350bf64aSZixuan Wang #include "x86/amd_sev.h"
16*8e38cb32SPaolo Bonzini #include "msr.h"
17350bf64aSZixuan Wang 
18350bf64aSZixuan Wang #define EXIT_SUCCESS 0
19350bf64aSZixuan Wang #define EXIT_FAILURE 1
20350bf64aSZixuan Wang 
21350bf64aSZixuan Wang static int test_sev_activation(void)
22350bf64aSZixuan Wang {
23350bf64aSZixuan Wang 	struct cpuid cpuid_out;
24350bf64aSZixuan Wang 	u64 msr_out;
25350bf64aSZixuan Wang 
26350bf64aSZixuan Wang 	printf("SEV activation test is loaded.\n");
27350bf64aSZixuan Wang 
28350bf64aSZixuan Wang 	/* Tests if CPUID function to check SEV is implemented */
29350bf64aSZixuan Wang 	cpuid_out = cpuid(CPUID_FN_LARGEST_EXT_FUNC_NUM);
30350bf64aSZixuan Wang 	printf("CPUID Fn8000_0000[EAX]: 0x%08x\n", cpuid_out.a);
31350bf64aSZixuan Wang 	if (cpuid_out.a < CPUID_FN_ENCRYPT_MEM_CAPAB) {
32350bf64aSZixuan Wang 		printf("CPUID does not support FN%08x\n",
33350bf64aSZixuan Wang 		       CPUID_FN_ENCRYPT_MEM_CAPAB);
34350bf64aSZixuan Wang 		return EXIT_FAILURE;
35350bf64aSZixuan Wang 	}
36350bf64aSZixuan Wang 
37350bf64aSZixuan Wang 	/* Tests if SEV is supported */
38350bf64aSZixuan Wang 	cpuid_out = cpuid(CPUID_FN_ENCRYPT_MEM_CAPAB);
39350bf64aSZixuan Wang 	printf("CPUID Fn8000_001F[EAX]: 0x%08x\n", cpuid_out.a);
40350bf64aSZixuan Wang 	printf("CPUID Fn8000_001F[EBX]: 0x%08x\n", cpuid_out.b);
41350bf64aSZixuan Wang 	if (!(cpuid_out.a & SEV_SUPPORT_MASK)) {
42350bf64aSZixuan Wang 		printf("SEV is not supported.\n");
43350bf64aSZixuan Wang 		return EXIT_FAILURE;
44350bf64aSZixuan Wang 	}
45350bf64aSZixuan Wang 	printf("SEV is supported\n");
46350bf64aSZixuan Wang 
47350bf64aSZixuan Wang 	/* Tests if SEV is enabled */
48350bf64aSZixuan Wang 	msr_out = rdmsr(MSR_SEV_STATUS);
49350bf64aSZixuan Wang 	printf("MSR C001_0131[EAX]: 0x%08lx\n", msr_out & 0xffffffff);
50350bf64aSZixuan Wang 	if (!(msr_out & SEV_ENABLED_MASK)) {
51350bf64aSZixuan Wang 		printf("SEV is not enabled.\n");
52350bf64aSZixuan Wang 		return EXIT_FAILURE;
53350bf64aSZixuan Wang 	}
54350bf64aSZixuan Wang 	printf("SEV is enabled\n");
55350bf64aSZixuan Wang 
56350bf64aSZixuan Wang 	return EXIT_SUCCESS;
57350bf64aSZixuan Wang }
58350bf64aSZixuan Wang 
59*8e38cb32SPaolo Bonzini static void test_sev_es_activation(void)
60*8e38cb32SPaolo Bonzini {
61*8e38cb32SPaolo Bonzini 	if (rdmsr(MSR_SEV_STATUS) & SEV_ES_ENABLED_MASK) {
62*8e38cb32SPaolo Bonzini 		printf("SEV-ES is enabled.\n");
63*8e38cb32SPaolo Bonzini 	} else {
64*8e38cb32SPaolo Bonzini 		printf("SEV-ES is not enabled.\n");
65*8e38cb32SPaolo Bonzini 	}
66*8e38cb32SPaolo Bonzini }
67*8e38cb32SPaolo Bonzini 
68350bf64aSZixuan Wang int main(void)
69350bf64aSZixuan Wang {
70350bf64aSZixuan Wang 	int rtn;
71350bf64aSZixuan Wang 	rtn = test_sev_activation();
72350bf64aSZixuan Wang 	report(rtn == EXIT_SUCCESS, "SEV activation test.");
73*8e38cb32SPaolo Bonzini 	test_sev_es_activation();
74350bf64aSZixuan Wang 	return report_summary();
75350bf64aSZixuan Wang }
76