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