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