]> git.proxmox.com Git - mirror_edk2.git/commitdiff
StandaloneMmPkg: StandaloneMmMemLib: Extends support for X64 architecture
authorKun Qin <kun.q@outlook.com>
Fri, 18 Dec 2020 11:09:24 +0000 (03:09 -0800)
committerKun Qin <kun.q@outlook.com>
Mon, 1 Feb 2021 18:01:02 +0000 (10:01 -0800)
This change extends StandaloneMmMemLib library to support X64
architecture. The implementation is ported from MdePkg/Library/SmmMemLib.

Cc: Ard Biesheuvel <ard.biesheuvel@arm.com>
Cc: Sami Mujawar <sami.mujawar@arm.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Supreeth Venkatesh <supreeth.venkatesh@arm.com>
Signed-off-by: Kun Qin <kun.q@outlook.com>
Reviewed-by: Jiewen Yao <Jiewen.yao@intel.com>
StandaloneMmPkg/Library/StandaloneMmMemLib/AArch64/StandaloneMmMemLibInternal.c
StandaloneMmPkg/Library/StandaloneMmMemLib/StandaloneMmMemLib.c
StandaloneMmPkg/Library/StandaloneMmMemLib/StandaloneMmMemLib.inf
StandaloneMmPkg/Library/StandaloneMmMemLib/X86StandaloneMmMemLibInternal.c [new file with mode: 0644]

index cb7c5e677a6b56fd92d8499b1ba45eaacf023ef4..4124959e04357b4c86c861e31b52dfaf3e74b66d 100644 (file)
@@ -40,4 +40,31 @@ MmMemLibInternalCalculateMaximumSupportAddress (
   DEBUG ((DEBUG_INFO, "mMmMemLibInternalMaximumSupportAddress = 0x%lx\n", mMmMemLibInternalMaximumSupportAddress));\r
 }\r
 \r
+/**\r
+  Initialize cached Mmram Ranges from HOB.\r
+\r
+  @retval EFI_UNSUPPORTED   The routine is unable to extract MMRAM information.\r
+  @retval EFI_SUCCESS       MmRanges are populated successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+MmMemLibInternalPopulateMmramRanges (\r
+  VOID\r
+  )\r
+{\r
+  // Not implemented for AARCH64.\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Deinitialize cached Mmram Ranges.\r
+\r
+**/\r
+VOID\r
+MmMemLibInternalFreeMmramRanges (\r
+  VOID\r
+  )\r
+{\r
+  // Not implemented for AARCH64.\r
+}\r
 \r
index b533bd8390cd1efe90bd447a8987c5eee491f6c0..2737f95315eb6f39e9fc06668812f1e7be406a23 100644 (file)
@@ -37,6 +37,27 @@ MmMemLibInternalCalculateMaximumSupportAddress (
   VOID\r
   );\r
 \r
+/**\r
+  Initialize cached Mmram Ranges from HOB.\r
+\r
+  @retval EFI_UNSUPPORTED   The routine is unable to extract MMRAM information.\r
+  @retval EFI_SUCCESS       MmRanges are populated successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+MmMemLibInternalPopulateMmramRanges (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  Deinitialize cached Mmram Ranges.\r
+\r
+**/\r
+VOID\r
+MmMemLibInternalFreeMmramRanges (\r
+  VOID\r
+  );\r
+\r
 /**\r
   This function check if the buffer is valid per processor architecture and not overlap with MMRAM.\r
 \r
@@ -253,11 +274,42 @@ MemLibConstructor (
   IN EFI_MM_SYSTEM_TABLE    *MmSystemTable\r
   )\r
 {\r
+  EFI_STATUS Status;\r
 \r
   //\r
   // Calculate and save maximum support address\r
   //\r
   MmMemLibInternalCalculateMaximumSupportAddress ();\r
 \r
+  //\r
+  // Initialize cached Mmram Ranges from HOB.\r
+  //\r
+  Status = MmMemLibInternalPopulateMmramRanges ();\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+  Destructor for Mm Mem library.\r
+\r
+  @param ImageHandle    The image handle of the process.\r
+  @param MmSystemTable  The EFI System Table pointer.\r
+\r
+  @retval EFI_SUCCESS   The constructor always returns EFI_SUCCESS.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+MemLibDestructor (\r
+  IN EFI_HANDLE             ImageHandle,\r
+  IN EFI_MM_SYSTEM_TABLE    *MmSystemTable\r
+  )\r
+{\r
+\r
+  //\r
+  // Deinitialize cached Mmram Ranges.\r
+  //\r
+  MmMemLibInternalFreeMmramRanges ();\r
+\r
   return EFI_SUCCESS;\r
 }\r
index 49da02e54e6dc77ee8154f05c0abb61955a5e7a4..062b0d7a1161c0b62f18b4dc1512a25efcbe7f52 100644 (file)
@@ -8,6 +8,7 @@
 #\r
 #  Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
 #  Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.<BR>\r
+#  Copyright (c) Microsoft Corporation.\r
 #\r
 #  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 #\r
   PI_SPECIFICATION_VERSION       = 0x00010032\r
   LIBRARY_CLASS                  = MemLib|MM_STANDALONE MM_CORE_STANDALONE\r
   CONSTRUCTOR                    = MemLibConstructor\r
+  DESTRUCTOR                     = MemLibDestructor\r
 \r
 #\r
 # The following information is for reference only and not required by the build tools.\r
 #\r
-#  VALID_ARCHITECTURES           = AARCH64\r
+#  VALID_ARCHITECTURES           = IA32 X64 AARCH64\r
 #\r
 \r
 [Sources.Common]\r
   StandaloneMmMemLib.c\r
 \r
+[Sources.IA32, Sources.X64]\r
+  X86StandaloneMmMemLibInternal.c\r
+\r
 [Sources.AARCH64]\r
   AArch64/StandaloneMmMemLibInternal.c\r
 \r
@@ -42,3 +47,9 @@
 [LibraryClasses]\r
   BaseMemoryLib\r
   DebugLib\r
+  HobLib\r
+  MemoryAllocationLib\r
+\r
+[Guids]\r
+  gMmCoreDataHobGuid                  ## SOMETIMES_CONSUMES ## HOB\r
+  gEfiMmPeiMmramMemoryReserveGuid     ## SOMETIMES_CONSUMES ## HOB\r
diff --git a/StandaloneMmPkg/Library/StandaloneMmMemLib/X86StandaloneMmMemLibInternal.c b/StandaloneMmPkg/Library/StandaloneMmMemLib/X86StandaloneMmMemLibInternal.c
new file mode 100644 (file)
index 0000000..1a97854
--- /dev/null
@@ -0,0 +1,155 @@
+/** @file\r
+  Internal ARCH Specific file of MM memory check library.\r
+\r
+  MM memory check library implementation. This library consumes MM_ACCESS_PROTOCOL\r
+  to get MMRAM information. In order to use this library instance, the platform should produce\r
+  all MMRAM range via MM_ACCESS_PROTOCOL, including the range for firmware (like MM Core\r
+  and MM driver) and/or specific dedicated hardware.\r
+\r
+  Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.<BR>\r
+  Copyright (c) Microsoft Corporation.\r
+\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+#include <PiMm.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/HobLib.h>\r
+\r
+#include <Guid/MmCoreData.h>\r
+#include <Guid/MmramMemoryReserve.h>\r
+\r
+//\r
+// Maximum support address used to check input buffer\r
+//\r
+extern EFI_PHYSICAL_ADDRESS  mMmMemLibInternalMaximumSupportAddress;\r
+extern EFI_MMRAM_DESCRIPTOR *mMmMemLibInternalMmramRanges;\r
+extern UINTN                 mMmMemLibInternalMmramCount;\r
+\r
+/**\r
+  Calculate and save the maximum support address.\r
+\r
+**/\r
+VOID\r
+MmMemLibInternalCalculateMaximumSupportAddress (\r
+  VOID\r
+  )\r
+{\r
+  VOID         *Hob;\r
+  UINT32       RegEax;\r
+  UINT8        PhysicalAddressBits;\r
+\r
+  //\r
+  // Get physical address bits supported.\r
+  //\r
+  Hob = GetFirstHob (EFI_HOB_TYPE_CPU);\r
+  if (Hob != NULL) {\r
+    PhysicalAddressBits = ((EFI_HOB_CPU *) Hob)->SizeOfMemorySpace;\r
+  } else {\r
+    AsmCpuid (0x80000000, &RegEax, NULL, NULL, NULL);\r
+    if (RegEax >= 0x80000008) {\r
+      AsmCpuid (0x80000008, &RegEax, NULL, NULL, NULL);\r
+      PhysicalAddressBits = (UINT8) RegEax;\r
+    } else {\r
+      PhysicalAddressBits = 36;\r
+    }\r
+  }\r
+  //\r
+  // IA-32e paging translates 48-bit linear addresses to 52-bit physical addresses.\r
+  //\r
+  ASSERT (PhysicalAddressBits <= 52);\r
+  if (PhysicalAddressBits > 48) {\r
+    PhysicalAddressBits = 48;\r
+  }\r
+\r
+  //\r
+  // Save the maximum support address in one global variable\r
+  //\r
+  mMmMemLibInternalMaximumSupportAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)(LShiftU64 (1, PhysicalAddressBits) - 1);\r
+  DEBUG ((DEBUG_INFO, "mMmMemLibInternalMaximumSupportAddress = 0x%lx\n", mMmMemLibInternalMaximumSupportAddress));\r
+}\r
+\r
+/**\r
+  Initialize cached Mmram Ranges from HOB.\r
+\r
+  @retval EFI_UNSUPPORTED   The routine is unable to extract MMRAM information.\r
+  @retval EFI_SUCCESS       MmRanges are populated successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+MmMemLibInternalPopulateMmramRanges (\r
+  VOID\r
+  )\r
+{\r
+  VOID                            *HobStart;\r
+  EFI_HOB_GUID_TYPE               *GuidHob;\r
+  MM_CORE_DATA_HOB_DATA           *DataInHob;\r
+  MM_CORE_PRIVATE_DATA            *MmCorePrivateData;\r
+  EFI_HOB_GUID_TYPE               *MmramRangesHob;\r
+  EFI_MMRAM_HOB_DESCRIPTOR_BLOCK  *MmramRangesHobData;\r
+  EFI_MMRAM_DESCRIPTOR            *MmramDescriptors;\r
+\r
+  HobStart = GetHobList ();\r
+  DEBUG ((DEBUG_INFO, "%a - 0x%x\n", __FUNCTION__, HobStart));\r
+\r
+  //\r
+  // Extract MM Core Private context from the Hob. If absent search for\r
+  // a Hob containing the MMRAM ranges\r
+  //\r
+  GuidHob = GetNextGuidHob (&gMmCoreDataHobGuid, HobStart);\r
+  if (GuidHob == NULL) {\r
+    MmramRangesHob = GetFirstGuidHob (&gEfiMmPeiMmramMemoryReserveGuid);\r
+    if (MmramRangesHob == NULL) {\r
+      return EFI_UNSUPPORTED;\r
+    }\r
+\r
+    MmramRangesHobData = GET_GUID_HOB_DATA (MmramRangesHob);\r
+    if (MmramRangesHobData == NULL || MmramRangesHobData->Descriptor == NULL) {\r
+      return EFI_UNSUPPORTED;\r
+    }\r
+\r
+    mMmMemLibInternalMmramCount = MmramRangesHobData->NumberOfMmReservedRegions;\r
+    MmramDescriptors = MmramRangesHobData->Descriptor;\r
+  } else {\r
+    DataInHob = GET_GUID_HOB_DATA (GuidHob);\r
+    if (DataInHob == NULL) {\r
+      return EFI_UNSUPPORTED;\r
+    }\r
+\r
+    MmCorePrivateData = (MM_CORE_PRIVATE_DATA *) (UINTN) DataInHob->Address;\r
+    if (MmCorePrivateData == NULL || MmCorePrivateData->MmramRanges == 0) {\r
+      return EFI_UNSUPPORTED;\r
+    }\r
+\r
+    mMmMemLibInternalMmramCount = (UINTN) MmCorePrivateData->MmramRangeCount;\r
+    MmramDescriptors = (EFI_MMRAM_DESCRIPTOR *) (UINTN) MmCorePrivateData->MmramRanges;\r
+  }\r
+\r
+  mMmMemLibInternalMmramRanges = AllocatePool (mMmMemLibInternalMmramCount * sizeof (EFI_MMRAM_DESCRIPTOR));\r
+  if (mMmMemLibInternalMmramRanges) {\r
+    CopyMem (mMmMemLibInternalMmramRanges,\r
+             MmramDescriptors,\r
+             mMmMemLibInternalMmramCount * sizeof (EFI_MMRAM_DESCRIPTOR));\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Deinitialize cached Mmram Ranges.\r
+\r
+**/\r
+VOID\r
+MmMemLibInternalFreeMmramRanges (\r
+  VOID\r
+  )\r
+{\r
+  if (mMmMemLibInternalMmramRanges != NULL) {\r
+    FreePool (mMmMemLibInternalMmramRanges);\r
+  }\r
+}\r
+\r