| /** @file | |
| Copyright (c) 2025, Advanced Micro Devices, Inc. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #include <Library/BaseLib.h> | |
| #include <Register/Amd/Cpuid.h> | |
| #include <Register/Amd/SevSnpMsr.h> | |
| #include <Register/Intel/Cpuid.h> | |
| /** | |
| Probe if running as some kind of SEV guest. | |
| @return FALSE Not running as a guest under any kind of SEV | |
| @return TRUE Running as a guest under any kind of SEV | |
| **/ | |
| BOOLEAN | |
| EFIAPI | |
| SevGuestIsEnabled ( | |
| VOID | |
| ) | |
| { | |
| UINT32 MaxExtendedLeaf; | |
| MSR_SEV_STATUS_REGISTER SevStatus; | |
| CPUID_MEMORY_ENCRYPTION_INFO_EAX MemoryEncryptionInfoEax; | |
| // Check max extended CPUID leaf | |
| AsmCpuid (CPUID_EXTENDED_FUNCTION, &MaxExtendedLeaf, NULL, NULL, NULL); | |
| if (MaxExtendedLeaf < CPUID_MEMORY_ENCRYPTION_INFO) { | |
| return FALSE; | |
| } | |
| // Check SEV support | |
| AsmCpuid (CPUID_MEMORY_ENCRYPTION_INFO, &MemoryEncryptionInfoEax.Uint32, NULL, NULL, NULL); | |
| if (MemoryEncryptionInfoEax.Bits.SevBit == 0) { | |
| return FALSE; | |
| } | |
| // Read SEV_STATUS MSR | |
| SevStatus.Uint64 = AsmReadMsr64 (MSR_SEV_STATUS); | |
| return (SevStatus.Bits.SevBit | SevStatus.Bits.SevEsBit | SevStatus.Bits.SevSnpBit) ? TRUE : FALSE; | |
| } |