]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg/PiSmmCore: AllocatePool should use MemoryType.
authorJiewen Yao <jiewen.yao@intel.com>
Wed, 30 Nov 2016 15:08:51 +0000 (23:08 +0800)
committerJiewen Yao <jiewen.yao@intel.com>
Wed, 7 Dec 2016 05:13:50 +0000 (13:13 +0800)
PiSmmCore supports page level protection based upon the Memory Type
(EfiRuntimeServicesCode/EfiRuntimeServicesData) and PE image.

However, the Memory Type information is ignored in AllocatePool().
If a caller calls AllocatePool with EfiRuntimeServicesCode,
the final memory is still allocated as EfiRuntimeServicesData.

This patch supports AllocatePool with EfiRuntimeServicesCode.

Cc: Jeff Fan <jeff.fan@intel.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jiewen Yao <jiewen.yao@intel.com>
Reviewed-by: Jeff Fan <jeff.fan@intel.com>
Regression-tested-by: Laszlo Ersek <lersek@redhat.com>
MdeModulePkg/Core/PiSmmCore/PiSmmCore.h
MdeModulePkg/Core/PiSmmCore/Pool.c
MdeModulePkg/Core/PiSmmCore/SmramProfileRecord.c

index e2fee549f8d82742c196fbf15aec7781d296e86f..8df1e500f0229604253ea61ea1946b3788447387 100644 (file)
@@ -1109,8 +1109,9 @@ extern LIST_ENTRY  mSmmMemoryMap;
 #define MAX_POOL_INDEX  (MAX_POOL_SHIFT - MIN_POOL_SHIFT + 1)\r
 \r
 typedef struct {\r
-  UINTN        Size;\r
-  BOOLEAN      Available;\r
+  UINTN           Size;\r
+  BOOLEAN         Available;\r
+  EFI_MEMORY_TYPE Type;\r
 } POOL_HEADER;\r
 \r
 typedef struct {\r
@@ -1118,6 +1119,12 @@ typedef struct {
   LIST_ENTRY   Link;\r
 } FREE_POOL_HEADER;\r
 \r
-extern LIST_ENTRY  mSmmPoolLists[MAX_POOL_INDEX];\r
+typedef enum {\r
+  SmmPoolTypeCode,\r
+  SmmPoolTypeData,\r
+  SmmPoolTypeMax,\r
+} SMM_POOL_TYPE;\r
+\r
+extern LIST_ENTRY  mSmmPoolLists[SmmPoolTypeMax][MAX_POOL_INDEX];\r
 \r
 #endif\r
index aae6a6e2173088a7c055f485a7ae598d7b8024f2..173650ae1dc820d5b2a839cc9547725f6133d4bc 100644 (file)
 \r
 #include "PiSmmCore.h"\r
 \r
-LIST_ENTRY  mSmmPoolLists[MAX_POOL_INDEX];\r
+LIST_ENTRY  mSmmPoolLists[SmmPoolTypeMax][MAX_POOL_INDEX];\r
 //\r
 // To cache the SMRAM base since when Loading modules At fixed address feature is enabled, \r
 // all module is assigned an offset relative the SMRAM base in build time.\r
 //\r
 GLOBAL_REMOVE_IF_UNREFERENCED  EFI_PHYSICAL_ADDRESS       gLoadModuleAtFixAddressSmramBase = 0;\r
 \r
+/**\r
+  Convert a UEFI memory type to SMM pool type.\r
+\r
+  @param[in]  MemoryType              Type of pool to allocate.\r
+\r
+  @return SMM pool type\r
+**/\r
+SMM_POOL_TYPE\r
+UefiMemoryTypeToSmmPoolType (\r
+  IN  EFI_MEMORY_TYPE   MemoryType\r
+  )\r
+{\r
+  ASSERT ((MemoryType == EfiRuntimeServicesCode) || (MemoryType == EfiRuntimeServicesData));\r
+  switch (MemoryType) {\r
+  case EfiRuntimeServicesCode:\r
+    return SmmPoolTypeCode;\r
+  case EfiRuntimeServicesData:\r
+    return SmmPoolTypeData;\r
+  default:\r
+    return SmmPoolTypeMax;\r
+  }\r
+}\r
+\r
+\r
 /**\r
   Called to initialize the memory service.\r
 \r
@@ -35,15 +59,18 @@ SmmInitializeMemoryServices (
   )\r
 {\r
   UINTN                  Index;\r
-       UINT64                 SmmCodeSize;\r
-       UINTN                  CurrentSmramRangesIndex;\r
-       UINT64                 MaxSize;\r
+  UINT64                 SmmCodeSize;\r
+  UINTN                  CurrentSmramRangesIndex;\r
+  UINT64                 MaxSize;\r
+  UINTN                  SmmPoolTypeIndex;\r
 \r
   //\r
   // Initialize Pool list\r
   //\r
-  for (Index = ARRAY_SIZE (mSmmPoolLists); Index > 0;) {\r
-    InitializeListHead (&mSmmPoolLists[--Index]);\r
+  for (SmmPoolTypeIndex = 0; SmmPoolTypeIndex < SmmPoolTypeMax; SmmPoolTypeIndex++) {\r
+    for (Index = 0; Index < ARRAY_SIZE (mSmmPoolLists[SmmPoolTypeIndex]); Index++) {\r
+      InitializeListHead (&mSmmPoolLists[SmmPoolTypeIndex][Index]);\r
+    }\r
   }\r
   CurrentSmramRangesIndex = 0;\r
   //\r
@@ -120,6 +147,7 @@ SmmInitializeMemoryServices (
 /**\r
   Internal Function. Allocate a pool by specified PoolIndex.\r
 \r
+  @param  PoolType              Type of pool to allocate.\r
   @param  PoolIndex             Index which indicate the Pool size.\r
   @param  FreePoolHdr           The returned Free pool.\r
 \r
@@ -129,6 +157,7 @@ SmmInitializeMemoryServices (
 **/\r
 EFI_STATUS\r
 InternalAllocPoolByIndex (\r
+  IN  EFI_MEMORY_TYPE   PoolType,\r
   IN  UINTN             PoolIndex,\r
   OUT FREE_POOL_HEADER  **FreePoolHdr\r
   )\r
@@ -136,25 +165,29 @@ InternalAllocPoolByIndex (
   EFI_STATUS            Status;\r
   FREE_POOL_HEADER      *Hdr;\r
   EFI_PHYSICAL_ADDRESS  Address;\r
+  SMM_POOL_TYPE         SmmPoolType;\r
+\r
+  SmmPoolType = UefiMemoryTypeToSmmPoolType(PoolType);\r
 \r
   ASSERT (PoolIndex <= MAX_POOL_INDEX);\r
   Status = EFI_SUCCESS;\r
   Hdr = NULL;\r
   if (PoolIndex == MAX_POOL_INDEX) {\r
-    Status = SmmInternalAllocatePages (AllocateAnyPages, EfiRuntimeServicesData, EFI_SIZE_TO_PAGES (MAX_POOL_SIZE << 1), &Address);\r
+    Status = SmmInternalAllocatePages (AllocateAnyPages, PoolType, EFI_SIZE_TO_PAGES (MAX_POOL_SIZE << 1), &Address);\r
     if (EFI_ERROR (Status)) {\r
       return EFI_OUT_OF_RESOURCES;\r
     }\r
     Hdr = (FREE_POOL_HEADER *) (UINTN) Address;\r
-  } else if (!IsListEmpty (&mSmmPoolLists[PoolIndex])) {\r
-    Hdr = BASE_CR (GetFirstNode (&mSmmPoolLists[PoolIndex]), FREE_POOL_HEADER, Link);\r
+  } else if (!IsListEmpty (&mSmmPoolLists[SmmPoolType][PoolIndex])) {\r
+    Hdr = BASE_CR (GetFirstNode (&mSmmPoolLists[SmmPoolType][PoolIndex]), FREE_POOL_HEADER, Link);\r
     RemoveEntryList (&Hdr->Link);\r
   } else {\r
-    Status = InternalAllocPoolByIndex (PoolIndex + 1, &Hdr);\r
+    Status = InternalAllocPoolByIndex (PoolType, PoolIndex + 1, &Hdr);\r
     if (!EFI_ERROR (Status)) {\r
       Hdr->Header.Size >>= 1;\r
       Hdr->Header.Available = TRUE;\r
-      InsertHeadList (&mSmmPoolLists[PoolIndex], &Hdr->Link);\r
+      Hdr->Header.Type = PoolType;\r
+      InsertHeadList (&mSmmPoolLists[SmmPoolType][PoolIndex], &Hdr->Link);\r
       Hdr = (FREE_POOL_HEADER*)((UINT8*)Hdr + Hdr->Header.Size);\r
     }\r
   }\r
@@ -162,6 +195,7 @@ InternalAllocPoolByIndex (
   if (!EFI_ERROR (Status)) {\r
     Hdr->Header.Size = MIN_POOL_SIZE << PoolIndex;\r
     Hdr->Header.Available = FALSE;\r
+    Hdr->Header.Type = PoolType;\r
   }\r
 \r
   *FreePoolHdr = Hdr;\r
@@ -181,16 +215,19 @@ InternalFreePoolByIndex (
   IN FREE_POOL_HEADER  *FreePoolHdr\r
   )\r
 {\r
-  UINTN  PoolIndex;\r
+  UINTN                 PoolIndex;\r
+  SMM_POOL_TYPE         SmmPoolType;\r
 \r
   ASSERT ((FreePoolHdr->Header.Size & (FreePoolHdr->Header.Size - 1)) == 0);\r
   ASSERT (((UINTN)FreePoolHdr & (FreePoolHdr->Header.Size - 1)) == 0);\r
   ASSERT (FreePoolHdr->Header.Size >= MIN_POOL_SIZE);\r
 \r
+  SmmPoolType = UefiMemoryTypeToSmmPoolType(FreePoolHdr->Header.Type);\r
+\r
   PoolIndex = (UINTN) (HighBitSet32 ((UINT32)FreePoolHdr->Header.Size) - MIN_POOL_SHIFT);\r
   FreePoolHdr->Header.Available = TRUE;\r
   ASSERT (PoolIndex < MAX_POOL_INDEX);\r
-  InsertHeadList (&mSmmPoolLists[PoolIndex], &FreePoolHdr->Link);\r
+  InsertHeadList (&mSmmPoolLists[SmmPoolType][PoolIndex], &FreePoolHdr->Link);\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -237,6 +274,7 @@ SmmInternalAllocatePool (
     PoolHdr = (POOL_HEADER*)(UINTN)Address;\r
     PoolHdr->Size = EFI_PAGES_TO_SIZE (Size);\r
     PoolHdr->Available = FALSE;\r
+    PoolHdr->Type = PoolType;\r
     *Buffer = PoolHdr + 1;\r
     return Status;\r
   }\r
@@ -247,7 +285,7 @@ SmmInternalAllocatePool (
     PoolIndex++;\r
   }\r
 \r
-  Status = InternalAllocPoolByIndex (PoolIndex, &FreePoolHdr);\r
+  Status = InternalAllocPoolByIndex (PoolType, PoolIndex, &FreePoolHdr);\r
   if (!EFI_ERROR(Status)) {\r
     *Buffer = &FreePoolHdr->Header + 1;\r
   }\r
index d983cefbb3dc18b97db0084a3c8981717efa41f3..dda9f12a7dcd612644f5ee3ab5338114b6fcbfb3 100644 (file)
@@ -1596,6 +1596,7 @@ SmramProfileGetDataSize (
   FREE_POOL_HEADER                  *Pool;\r
   UINTN                             PoolListIndex;\r
   UINTN                             Index;\r
+  UINTN                             SmmPoolTypeIndex;\r
 \r
   ContextData = GetSmramProfileContext ();\r
   if (ContextData == NULL) {\r
@@ -1638,19 +1639,20 @@ SmramProfileGetDataSize (
        Node = Node->BackLink) {\r
     Index++;\r
   }\r
-  for (PoolListIndex = 0; PoolListIndex < MAX_POOL_INDEX; PoolListIndex++) {\r
-    FreePoolList = &mSmmPoolLists[PoolListIndex];\r
-    for (Node = FreePoolList->BackLink;\r
-         Node != FreePoolList;\r
-         Node = Node->BackLink) {\r
-      Pool = BASE_CR (Node, FREE_POOL_HEADER, Link);\r
-      if (Pool->Header.Available) {\r
-        Index++;\r
+  for (SmmPoolTypeIndex = 0; SmmPoolTypeIndex < SmmPoolTypeMax; SmmPoolTypeIndex++) {\r
+    for (PoolListIndex = 0; PoolListIndex < MAX_POOL_INDEX; PoolListIndex++) {\r
+      FreePoolList = &mSmmPoolLists[SmmPoolTypeIndex][PoolListIndex];\r
+      for (Node = FreePoolList->BackLink;\r
+           Node != FreePoolList;\r
+           Node = Node->BackLink) {\r
+        Pool = BASE_CR (Node, FREE_POOL_HEADER, Link);\r
+        if (Pool->Header.Available) {\r
+          Index++;\r
+        }\r
       }\r
     }\r
   }\r
 \r
-\r
   TotalSize += (sizeof (MEMORY_PROFILE_FREE_MEMORY) + Index * sizeof (MEMORY_PROFILE_DESCRIPTOR));\r
   TotalSize += (sizeof (MEMORY_PROFILE_MEMORY_RANGE) + mFullSmramRangeCount * sizeof (MEMORY_PROFILE_DESCRIPTOR));\r
 \r
@@ -1698,6 +1700,7 @@ SmramProfileCopyData (
   UINT64                          RemainingSize;\r
   UINTN                           PdbSize;\r
   UINTN                           ActionStringSize;\r
+  UINTN                           SmmPoolTypeIndex;\r
 \r
   ContextData = GetSmramProfileContext ();\r
   if (ContextData == NULL) {\r
@@ -1785,14 +1788,16 @@ SmramProfileCopyData (
            Node = Node->BackLink) {\r
         Index++;\r
       }\r
-      for (PoolListIndex = 0; PoolListIndex < MAX_POOL_INDEX; PoolListIndex++) {\r
-        FreePoolList = &mSmmPoolLists[MAX_POOL_INDEX - PoolListIndex - 1];\r
-        for (Node = FreePoolList->BackLink;\r
-             Node != FreePoolList;\r
-             Node = Node->BackLink) {\r
-          Pool = BASE_CR (Node, FREE_POOL_HEADER, Link);\r
-          if (Pool->Header.Available) {\r
-            Index++;\r
+      for (SmmPoolTypeIndex = 0; SmmPoolTypeIndex < SmmPoolTypeMax; SmmPoolTypeIndex++) {\r
+        for (PoolListIndex = 0; PoolListIndex < MAX_POOL_INDEX; PoolListIndex++) {\r
+          FreePoolList = &mSmmPoolLists[SmmPoolTypeIndex][MAX_POOL_INDEX - PoolListIndex - 1];\r
+          for (Node = FreePoolList->BackLink;\r
+               Node != FreePoolList;\r
+               Node = Node->BackLink) {\r
+            Pool = BASE_CR (Node, FREE_POOL_HEADER, Link);\r
+            if (Pool->Header.Available) {\r
+              Index++;\r
+            }\r
           }\r
         }\r
       }\r
@@ -1827,29 +1832,31 @@ SmramProfileCopyData (
     }\r
     Offset += sizeof (MEMORY_PROFILE_DESCRIPTOR);\r
   }\r
-  for (PoolListIndex = 0; PoolListIndex < MAX_POOL_INDEX; PoolListIndex++) {\r
-    FreePoolList = &mSmmPoolLists[MAX_POOL_INDEX - PoolListIndex - 1];\r
-    for (Node = FreePoolList->BackLink;\r
-         Node != FreePoolList;\r
-         Node = Node->BackLink) {\r
-      Pool = BASE_CR (Node, FREE_POOL_HEADER, Link);\r
-      if (Pool->Header.Available) {\r
-        if (*ProfileOffset < (Offset + sizeof (MEMORY_PROFILE_DESCRIPTOR))) {\r
-          if (RemainingSize >= sizeof (MEMORY_PROFILE_DESCRIPTOR)) {\r
-            MemoryProfileDescriptor = ProfileBuffer;\r
-            MemoryProfileDescriptor->Header.Signature = MEMORY_PROFILE_DESCRIPTOR_SIGNATURE;\r
-            MemoryProfileDescriptor->Header.Length = sizeof (MEMORY_PROFILE_DESCRIPTOR);\r
-            MemoryProfileDescriptor->Header.Revision = MEMORY_PROFILE_DESCRIPTOR_REVISION;\r
-            MemoryProfileDescriptor->Address = (PHYSICAL_ADDRESS) (UINTN) Pool;\r
-            MemoryProfileDescriptor->Size = Pool->Header.Size;\r
-\r
-            RemainingSize -= sizeof (MEMORY_PROFILE_DESCRIPTOR);\r
-            ProfileBuffer = (UINT8 *) ProfileBuffer + sizeof (MEMORY_PROFILE_DESCRIPTOR);\r
-          } else {\r
-            goto Done;\r
+  for (SmmPoolTypeIndex = 0; SmmPoolTypeIndex < SmmPoolTypeMax; SmmPoolTypeIndex++) {\r
+    for (PoolListIndex = 0; PoolListIndex < MAX_POOL_INDEX; PoolListIndex++) {\r
+      FreePoolList = &mSmmPoolLists[SmmPoolTypeIndex][MAX_POOL_INDEX - PoolListIndex - 1];\r
+      for (Node = FreePoolList->BackLink;\r
+           Node != FreePoolList;\r
+           Node = Node->BackLink) {\r
+        Pool = BASE_CR (Node, FREE_POOL_HEADER, Link);\r
+        if (Pool->Header.Available) {\r
+          if (*ProfileOffset < (Offset + sizeof (MEMORY_PROFILE_DESCRIPTOR))) {\r
+            if (RemainingSize >= sizeof (MEMORY_PROFILE_DESCRIPTOR)) {\r
+              MemoryProfileDescriptor = ProfileBuffer;\r
+              MemoryProfileDescriptor->Header.Signature = MEMORY_PROFILE_DESCRIPTOR_SIGNATURE;\r
+              MemoryProfileDescriptor->Header.Length = sizeof (MEMORY_PROFILE_DESCRIPTOR);\r
+              MemoryProfileDescriptor->Header.Revision = MEMORY_PROFILE_DESCRIPTOR_REVISION;\r
+              MemoryProfileDescriptor->Address = (PHYSICAL_ADDRESS) (UINTN) Pool;\r
+              MemoryProfileDescriptor->Size = Pool->Header.Size;\r
+\r
+              RemainingSize -= sizeof (MEMORY_PROFILE_DESCRIPTOR);\r
+              ProfileBuffer = (UINT8 *) ProfileBuffer + sizeof (MEMORY_PROFILE_DESCRIPTOR);\r
+            } else {\r
+              goto Done;\r
+            }\r
           }\r
+          Offset += sizeof (MEMORY_PROFILE_DESCRIPTOR);\r
         }\r
-        Offset += sizeof (MEMORY_PROFILE_DESCRIPTOR);\r
       }\r
     }\r
   }\r
@@ -2577,6 +2584,7 @@ DumpFreePoolList (
   UINTN                         PoolListIndex;\r
   MEMORY_PROFILE_CONTEXT_DATA   *ContextData;\r
   BOOLEAN                       SmramProfileGettingStatus;\r
+  UINTN                         SmmPoolTypeIndex;\r
 \r
   ContextData = GetSmramProfileContext ();\r
   if (ContextData == NULL) {\r
@@ -2586,23 +2594,25 @@ DumpFreePoolList (
   SmramProfileGettingStatus = mSmramProfileGettingStatus;\r
   mSmramProfileGettingStatus = TRUE;\r
 \r
-  DEBUG ((EFI_D_INFO, "======= SmramProfile begin =======\n"));\r
-\r
-  for (PoolListIndex = 0; PoolListIndex < MAX_POOL_INDEX; PoolListIndex++) {\r
-    DEBUG ((EFI_D_INFO, "FreePoolList (%d):\n", PoolListIndex));\r
-    FreePoolList = &mSmmPoolLists[PoolListIndex];\r
-    for (Node = FreePoolList->BackLink, Index = 0;\r
-         Node != FreePoolList;\r
-         Node = Node->BackLink, Index++) {\r
-      Pool = BASE_CR (Node, FREE_POOL_HEADER, Link);\r
-      DEBUG ((EFI_D_INFO, "  Index - 0x%x\n", Index));\r
-      DEBUG ((EFI_D_INFO, "    PhysicalStart - 0x%016lx\n", (PHYSICAL_ADDRESS) (UINTN) Pool));\r
-      DEBUG ((EFI_D_INFO, "    Size          - 0x%08x\n", Pool->Header.Size));\r
-      DEBUG ((EFI_D_INFO, "    Available     - 0x%02x\n", Pool->Header.Available));\r
+  DEBUG ((DEBUG_INFO, "======= SmramProfile begin =======\n"));\r
+\r
+  for (SmmPoolTypeIndex = 0; SmmPoolTypeIndex < SmmPoolTypeMax; SmmPoolTypeIndex++) {\r
+    for (PoolListIndex = 0; PoolListIndex < MAX_POOL_INDEX; PoolListIndex++) {\r
+      DEBUG ((DEBUG_INFO, "FreePoolList(%d)(%d):\n", SmmPoolTypeIndex, PoolListIndex));\r
+      FreePoolList = &mSmmPoolLists[SmmPoolTypeIndex][PoolListIndex];\r
+      for (Node = FreePoolList->BackLink, Index = 0;\r
+           Node != FreePoolList;\r
+           Node = Node->BackLink, Index++) {\r
+        Pool = BASE_CR (Node, FREE_POOL_HEADER, Link);\r
+        DEBUG ((DEBUG_INFO, "  Index - 0x%x\n", Index));\r
+        DEBUG ((DEBUG_INFO, "    PhysicalStart - 0x%016lx\n", (PHYSICAL_ADDRESS) (UINTN) Pool));\r
+        DEBUG ((DEBUG_INFO, "    Size          - 0x%08x\n", Pool->Header.Size));\r
+        DEBUG ((DEBUG_INFO, "    Available     - 0x%02x\n", Pool->Header.Available));\r
+      }\r
     }\r
   }\r
 \r
-  DEBUG ((EFI_D_INFO, "======= SmramProfile end =======\n"));\r
+  DEBUG ((DEBUG_INFO, "======= SmramProfile end =======\n"));\r
 \r
   mSmramProfileGettingStatus = SmramProfileGettingStatus;\r
 }\r