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