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
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
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