]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/PiSmmCoreMemoryAllocationLib/MemoryAllocationLib.c
MdeModulePkg: Add ResetSystemLib instances that call core services
[mirror_edk2.git] / MdeModulePkg / Library / PiSmmCoreMemoryAllocationLib / MemoryAllocationLib.c
index 08dd17ba693fde27eef7d230ed42ce5918f2754b..4216a12d18f557bcb2edb3169b88f1520d63ac53 100644 (file)
@@ -11,7 +11,7 @@
   In addition, allocation for the Reserved memory types are not supported and will \r
   always return NULL.\r
 \r
-  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>\r
   This program and the accompanying materials                          \r
   are licensed and made available under the terms and conditions of the BSD License         \r
   which accompanies this distribution.  The full text of the license may be found at        \r
@@ -40,7 +40,7 @@ UINTN                 mSmmCoreMemoryAllocLibSmramRangeCount = 0;
 \r
   @param[in]  Buffer   The pointer to the buffer to be checked.\r
 \r
-  @retval     TURE     The buffer is in SMRAM ranges.\r
+  @retval     TRUE     The buffer is in SMRAM ranges.\r
   @retval     FALSE    The buffer is out of SMRAM ranges.\r
 **/\r
 BOOLEAN\r
@@ -293,7 +293,7 @@ InternalAllocateAlignedPages (
       Status = SmmFreePages (Memory, UnalignedPages);\r
       ASSERT_EFI_ERROR (Status);\r
     }\r
-    Memory         = (EFI_PHYSICAL_ADDRESS) (AlignedMemory + EFI_PAGES_TO_SIZE (Pages));\r
+    Memory         = AlignedMemory + EFI_PAGES_TO_SIZE (Pages);\r
     UnalignedPages = RealPages - Pages - UnalignedPages;\r
     if (UnalignedPages > 0) {\r
       //\r
@@ -1068,20 +1068,44 @@ PiSmmCoreMemoryAllocationLibConstructor (
   IN EFI_SYSTEM_TABLE  *SystemTable\r
   )\r
 {\r
+  EFI_STATUS             Status;\r
   SMM_CORE_PRIVATE_DATA  *SmmCorePrivate;\r
   UINTN                  Size;\r
+  VOID                   *BootServicesData;\r
 \r
   SmmCorePrivate = (SMM_CORE_PRIVATE_DATA *)ImageHandle;\r
+\r
   //\r
-  // Initialize memory service using free SMRAM\r
+  // The FreePool()/FreePages() will need use SmramRanges data to know whether\r
+  // the buffer to free is in SMRAM range or not. And there may be FreePool()/\r
+  // FreePages() indrectly during calling SmmInitializeMemoryServices(), but\r
+  // no SMRAM could be allocated before calling SmmInitializeMemoryServices(),\r
+  // so temporarily use BootServicesData to hold the SmramRanges data.\r
   //\r
-  SmmInitializeMemoryServices (SmmCorePrivate->SmramRangeCount, SmmCorePrivate->SmramRanges);\r
-\r
   mSmmCoreMemoryAllocLibSmramRangeCount = SmmCorePrivate->SmramRangeCount;\r
   Size = mSmmCoreMemoryAllocLibSmramRangeCount * sizeof (EFI_SMRAM_DESCRIPTOR);\r
-  mSmmCoreMemoryAllocLibSmramRanges = (EFI_SMRAM_DESCRIPTOR *) AllocatePool (Size);\r
+  Status = gBS->AllocatePool (EfiBootServicesData, Size, (VOID **) &mSmmCoreMemoryAllocLibSmramRanges);\r
+  ASSERT_EFI_ERROR (Status);\r
   ASSERT (mSmmCoreMemoryAllocLibSmramRanges != NULL);\r
   CopyMem (mSmmCoreMemoryAllocLibSmramRanges, SmmCorePrivate->SmramRanges, Size);\r
 \r
+  //\r
+  // Initialize memory service using free SMRAM\r
+  //\r
+  SmmInitializeMemoryServices (SmmCorePrivate->SmramRangeCount, SmmCorePrivate->SmramRanges);\r
+\r
+  //\r
+  // Move the SmramRanges data from BootServicesData to SMRAM.\r
+  //\r
+  BootServicesData = mSmmCoreMemoryAllocLibSmramRanges;\r
+  mSmmCoreMemoryAllocLibSmramRanges = (EFI_SMRAM_DESCRIPTOR *) AllocateCopyPool (Size, (VOID *) BootServicesData);\r
+  ASSERT (mSmmCoreMemoryAllocLibSmramRanges != NULL);\r
+\r
+  //\r
+  // Free the temporarily used BootServicesData.\r
+  //\r
+  Status = gBS->FreePool (BootServicesData);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
   return EFI_SUCCESS;\r
 }\r