]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/PiSmmCore/Pool.c
MdeModulePkg/PiSmmCore: AllocatePool should use MemoryType.
[mirror_edk2.git] / MdeModulePkg / Core / PiSmmCore / Pool.c
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