]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/Library/BaseMemEncryptSevLib/MemEncryptSevLibInternal.c
OvmfPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / OvmfPkg / Library / BaseMemEncryptSevLib / MemEncryptSevLibInternal.c
CommitLineData
a1f22614
BS
1/** @file\r
2\r
3 Secure Encrypted Virtualization (SEV) library helper function\r
4\r
5 Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>\r
6\r
b26f0cf9 7 SPDX-License-Identifier: BSD-2-Clause-Patent\r
a1f22614
BS
8\r
9**/\r
10\r
11#include <Library/BaseLib.h>\r
12#include <Library/DebugLib.h>\r
bd13ecf3 13#include <Library/MemEncryptSevLib.h>\r
61a044c6 14#include <Library/PcdLib.h>\r
a1f22614
BS
15#include <Register/Amd/Cpuid.h>\r
16#include <Register/Amd/Msr.h>\r
bd13ecf3 17#include <Register/Cpuid.h>\r
61a044c6
LE
18#include <Register/QemuSmramSaveStateMap.h>\r
19#include <Register/SmramSaveStateMap.h>\r
20#include <Uefi/UefiBaseType.h>\r
a1f22614
BS
21\r
22STATIC BOOLEAN mSevStatus = FALSE;\r
23STATIC BOOLEAN mSevStatusChecked = FALSE;\r
24\r
25/**\r
26\r
27 Returns a boolean to indicate whether SEV is enabled\r
28\r
29 @retval TRUE SEV is enabled\r
30 @retval FALSE SEV is not enabled\r
31 **/\r
32STATIC\r
33BOOLEAN\r
34EFIAPI\r
35InternalMemEncryptSevIsEnabled (\r
36 VOID\r
37 )\r
38{\r
39 UINT32 RegEax;\r
40 MSR_SEV_STATUS_REGISTER Msr;\r
41 CPUID_MEMORY_ENCRYPTION_INFO_EAX Eax;\r
42\r
43 //\r
44 // Check if memory encryption leaf exist\r
45 //\r
46 AsmCpuid (CPUID_EXTENDED_FUNCTION, &RegEax, NULL, NULL, NULL);\r
47 if (RegEax >= CPUID_MEMORY_ENCRYPTION_INFO) {\r
48 //\r
49 // CPUID Fn8000_001F[EAX] Bit 1 (Sev supported)\r
50 //\r
51 AsmCpuid (CPUID_MEMORY_ENCRYPTION_INFO, &Eax.Uint32, NULL, NULL, NULL);\r
52\r
53 if (Eax.Bits.SevBit) {\r
54 //\r
55 // Check MSR_0xC0010131 Bit 0 (Sev Enabled)\r
56 //\r
57 Msr.Uint32 = AsmReadMsr32 (MSR_SEV_STATUS);\r
58 if (Msr.Bits.SevBit) {\r
59 return TRUE;\r
60 }\r
61 }\r
62 }\r
63\r
64 return FALSE;\r
65}\r
66\r
67/**\r
a1f22614
BS
68 Returns a boolean to indicate whether SEV is enabled\r
69\r
70 @retval TRUE SEV is enabled\r
71 @retval FALSE SEV is not enabled\r
d4dd22c7 72**/\r
a1f22614
BS
73BOOLEAN\r
74EFIAPI\r
75MemEncryptSevIsEnabled (\r
76 VOID\r
77 )\r
78{\r
79 if (mSevStatusChecked) {\r
80 return mSevStatus;\r
81 }\r
82\r
83 mSevStatus = InternalMemEncryptSevIsEnabled();\r
84 mSevStatusChecked = TRUE;\r
85\r
86 return mSevStatus;\r
87}\r
61a044c6
LE
88\r
89\r
90/**\r
91 Locate the page range that covers the initial (pre-SMBASE-relocation) SMRAM\r
92 Save State Map.\r
93\r
94 @param[out] BaseAddress The base address of the lowest-address page that\r
95 covers the initial SMRAM Save State Map.\r
96\r
97 @param[out] NumberOfPages The number of pages in the page range that covers\r
98 the initial SMRAM Save State Map.\r
99\r
100 @retval RETURN_SUCCESS BaseAddress and NumberOfPages have been set on\r
101 output.\r
102\r
103 @retval RETURN_UNSUPPORTED SMM is unavailable.\r
104**/\r
105RETURN_STATUS\r
106EFIAPI\r
107MemEncryptSevLocateInitialSmramSaveStateMapPages (\r
108 OUT UINTN *BaseAddress,\r
109 OUT UINTN *NumberOfPages\r
110 )\r
111{\r
112 UINTN MapStart;\r
113 UINTN MapEnd;\r
114 UINTN MapPagesStart; // MapStart rounded down to page boundary\r
115 UINTN MapPagesEnd; // MapEnd rounded up to page boundary\r
116 UINTN MapPagesSize; // difference between MapPagesStart and MapPagesEnd\r
117\r
118 if (!FeaturePcdGet (PcdSmmSmramRequire)) {\r
119 return RETURN_UNSUPPORTED;\r
120 }\r
121\r
122 MapStart = SMM_DEFAULT_SMBASE + SMRAM_SAVE_STATE_MAP_OFFSET;\r
123 MapEnd = MapStart + sizeof (QEMU_SMRAM_SAVE_STATE_MAP);\r
124 MapPagesStart = MapStart & ~(UINTN)EFI_PAGE_MASK;\r
125 MapPagesEnd = ALIGN_VALUE (MapEnd, EFI_PAGE_SIZE);\r
126 MapPagesSize = MapPagesEnd - MapPagesStart;\r
127\r
128 ASSERT ((MapPagesSize & EFI_PAGE_MASK) == 0);\r
129\r
130 *BaseAddress = MapPagesStart;\r
131 *NumberOfPages = MapPagesSize >> EFI_PAGE_SHIFT;\r
132\r
133 return RETURN_SUCCESS;\r
134}\r