xref: /kvm-unit-tests/x86/amd_sev.c (revision 350bf64a67f6b00edf466363c47c7d0ef1c3c52b)
1*350bf64aSZixuan Wang /*
2*350bf64aSZixuan Wang  * AMD SEV test cases
3*350bf64aSZixuan Wang  *
4*350bf64aSZixuan Wang  * Copyright (c) 2021, Google Inc
5*350bf64aSZixuan Wang  *
6*350bf64aSZixuan Wang  * Authors:
7*350bf64aSZixuan Wang  *   Hyunwook (Wooky) Baek <baekhw@google.com>
8*350bf64aSZixuan Wang  *   Zixuan Wang <zixuanwang@google.com>
9*350bf64aSZixuan Wang  *
10*350bf64aSZixuan Wang  * SPDX-License-Identifier: LGPL-2.0-or-later
11*350bf64aSZixuan Wang  */
12*350bf64aSZixuan Wang 
13*350bf64aSZixuan Wang #include "libcflat.h"
14*350bf64aSZixuan Wang #include "x86/processor.h"
15*350bf64aSZixuan Wang #include "x86/amd_sev.h"
16*350bf64aSZixuan Wang 
17*350bf64aSZixuan Wang #define EXIT_SUCCESS 0
18*350bf64aSZixuan Wang #define EXIT_FAILURE 1
19*350bf64aSZixuan Wang 
20*350bf64aSZixuan Wang static int test_sev_activation(void)
21*350bf64aSZixuan Wang {
22*350bf64aSZixuan Wang 	struct cpuid cpuid_out;
23*350bf64aSZixuan Wang 	u64 msr_out;
24*350bf64aSZixuan Wang 
25*350bf64aSZixuan Wang 	printf("SEV activation test is loaded.\n");
26*350bf64aSZixuan Wang 
27*350bf64aSZixuan Wang 	/* Tests if CPUID function to check SEV is implemented */
28*350bf64aSZixuan Wang 	cpuid_out = cpuid(CPUID_FN_LARGEST_EXT_FUNC_NUM);
29*350bf64aSZixuan Wang 	printf("CPUID Fn8000_0000[EAX]: 0x%08x\n", cpuid_out.a);
30*350bf64aSZixuan Wang 	if (cpuid_out.a < CPUID_FN_ENCRYPT_MEM_CAPAB) {
31*350bf64aSZixuan Wang 		printf("CPUID does not support FN%08x\n",
32*350bf64aSZixuan Wang 		       CPUID_FN_ENCRYPT_MEM_CAPAB);
33*350bf64aSZixuan Wang 		return EXIT_FAILURE;
34*350bf64aSZixuan Wang 	}
35*350bf64aSZixuan Wang 
36*350bf64aSZixuan Wang 	/* Tests if SEV is supported */
37*350bf64aSZixuan Wang 	cpuid_out = cpuid(CPUID_FN_ENCRYPT_MEM_CAPAB);
38*350bf64aSZixuan Wang 	printf("CPUID Fn8000_001F[EAX]: 0x%08x\n", cpuid_out.a);
39*350bf64aSZixuan Wang 	printf("CPUID Fn8000_001F[EBX]: 0x%08x\n", cpuid_out.b);
40*350bf64aSZixuan Wang 	if (!(cpuid_out.a & SEV_SUPPORT_MASK)) {
41*350bf64aSZixuan Wang 		printf("SEV is not supported.\n");
42*350bf64aSZixuan Wang 		return EXIT_FAILURE;
43*350bf64aSZixuan Wang 	}
44*350bf64aSZixuan Wang 	printf("SEV is supported\n");
45*350bf64aSZixuan Wang 
46*350bf64aSZixuan Wang 	/* Tests if SEV is enabled */
47*350bf64aSZixuan Wang 	msr_out = rdmsr(MSR_SEV_STATUS);
48*350bf64aSZixuan Wang 	printf("MSR C001_0131[EAX]: 0x%08lx\n", msr_out & 0xffffffff);
49*350bf64aSZixuan Wang 	if (!(msr_out & SEV_ENABLED_MASK)) {
50*350bf64aSZixuan Wang 		printf("SEV is not enabled.\n");
51*350bf64aSZixuan Wang 		return EXIT_FAILURE;
52*350bf64aSZixuan Wang 	}
53*350bf64aSZixuan Wang 	printf("SEV is enabled\n");
54*350bf64aSZixuan Wang 
55*350bf64aSZixuan Wang 	return EXIT_SUCCESS;
56*350bf64aSZixuan Wang }
57*350bf64aSZixuan Wang 
58*350bf64aSZixuan Wang int main(void)
59*350bf64aSZixuan Wang {
60*350bf64aSZixuan Wang 	int rtn;
61*350bf64aSZixuan Wang 	rtn = test_sev_activation();
62*350bf64aSZixuan Wang 	report(rtn == EXIT_SUCCESS, "SEV activation test.");
63*350bf64aSZixuan Wang 	return report_summary();
64*350bf64aSZixuan Wang }
65