]> 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 bd2146892495656a8b179d1969e4522644852c26..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
@@ -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