\r
Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>\r
\r
- This program and the accompanying materials\r
- are licensed and made available under the terms and conditions of the BSD\r
- License which accompanies this distribution. The full text of the license may\r
- be found at http://opensource.org/licenses/bsd-license.php\r
+ This program and the accompanying materials are licensed and made available\r
+ under the terms and conditions of the BSD License which accompanies this\r
+ distribution. The full text of the license may be found at\r
+ http://opensource.org/licenses/bsd-license.php\r
\r
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
\r
#include <Library/BaseLib.h>\r
#include <Library/DebugLib.h>\r
-#include <Register/Cpuid.h>\r
+#include <Library/MemEncryptSevLib.h>\r
+#include <Library/PcdLib.h>\r
#include <Register/Amd/Cpuid.h>\r
#include <Register/Amd/Msr.h>\r
-#include <Library/MemEncryptSevLib.h>\r
+#include <Register/Cpuid.h>\r
+#include <Register/QemuSmramSaveStateMap.h>\r
+#include <Register/SmramSaveStateMap.h>\r
+#include <Uefi/UefiBaseType.h>\r
\r
STATIC BOOLEAN mSevStatus = FALSE;\r
STATIC BOOLEAN mSevStatusChecked = FALSE;\r
}\r
\r
/**\r
-\r
Returns a boolean to indicate whether SEV is enabled\r
\r
@retval TRUE SEV is enabled\r
@retval FALSE SEV is not enabled\r
- **/\r
+**/\r
BOOLEAN\r
EFIAPI\r
MemEncryptSevIsEnabled (\r
\r
return mSevStatus;\r
}\r
+\r
+\r
+/**\r
+ Locate the page range that covers the initial (pre-SMBASE-relocation) SMRAM\r
+ Save State Map.\r
+\r
+ @param[out] BaseAddress The base address of the lowest-address page that\r
+ covers the initial SMRAM Save State Map.\r
+\r
+ @param[out] NumberOfPages The number of pages in the page range that covers\r
+ the initial SMRAM Save State Map.\r
+\r
+ @retval RETURN_SUCCESS BaseAddress and NumberOfPages have been set on\r
+ output.\r
+\r
+ @retval RETURN_UNSUPPORTED SMM is unavailable.\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+MemEncryptSevLocateInitialSmramSaveStateMapPages (\r
+ OUT UINTN *BaseAddress,\r
+ OUT UINTN *NumberOfPages\r
+ )\r
+{\r
+ UINTN MapStart;\r
+ UINTN MapEnd;\r
+ UINTN MapPagesStart; // MapStart rounded down to page boundary\r
+ UINTN MapPagesEnd; // MapEnd rounded up to page boundary\r
+ UINTN MapPagesSize; // difference between MapPagesStart and MapPagesEnd\r
+\r
+ if (!FeaturePcdGet (PcdSmmSmramRequire)) {\r
+ return RETURN_UNSUPPORTED;\r
+ }\r
+\r
+ MapStart = SMM_DEFAULT_SMBASE + SMRAM_SAVE_STATE_MAP_OFFSET;\r
+ MapEnd = MapStart + sizeof (QEMU_SMRAM_SAVE_STATE_MAP);\r
+ MapPagesStart = MapStart & ~(UINTN)EFI_PAGE_MASK;\r
+ MapPagesEnd = ALIGN_VALUE (MapEnd, EFI_PAGE_SIZE);\r
+ MapPagesSize = MapPagesEnd - MapPagesStart;\r
+\r
+ ASSERT ((MapPagesSize & EFI_PAGE_MASK) == 0);\r
+\r
+ *BaseAddress = MapPagesStart;\r
+ *NumberOfPages = MapPagesSize >> EFI_PAGE_SHIFT;\r
+\r
+ return RETURN_SUCCESS;\r
+}\r