/** @file\r
EFI PEI Core memory services\r
\r
-Copyright (c) 2006 - 2018, 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
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
environment, such as the size and location of temporary RAM, the stack location and\r
the BFV location.\r
@param OldCoreData Pointer to the PEI Core data.\r
- NULL if being run in non-permament memory mode.\r
+ NULL if being run in non-permanent memory mode.\r
\r
**/\r
VOID\r
IN PEI_CORE_INSTANCE *OldCoreData\r
)\r
{\r
-\r
- PrivateData->SwitchStackSignal = FALSE;\r
+ PrivateData->SwitchStackSignal = FALSE;\r
\r
//\r
// First entering PeiCore, following code will initialized some field\r
- // in PeiCore's private data according to hand off data from sec core.\r
+ // in PeiCore's private data according to hand off data from SEC core.\r
//\r
if (OldCoreData == NULL) {\r
-\r
PrivateData->PeiMemoryInstalled = FALSE;\r
PrivateData->HobList.Raw = SecCoreData->PeiTemporaryRamBase;\r
\r
PeiCoreBuildHobHandoffInfoTable (\r
BOOT_WITH_FULL_CONFIGURATION,\r
- (EFI_PHYSICAL_ADDRESS) (UINTN) SecCoreData->PeiTemporaryRamBase,\r
- (UINTN) SecCoreData->PeiTemporaryRamSize\r
+ (EFI_PHYSICAL_ADDRESS)(UINTN)SecCoreData->PeiTemporaryRamBase,\r
+ (UINTN)SecCoreData->PeiTemporaryRamSize\r
);\r
\r
//\r
The usage model is that the PEIM that discovers the permanent memory shall invoke this service.\r
This routine will hold discoveried memory information into PeiCore's private data,\r
and set SwitchStackSignal flag. After PEIM who discovery memory is dispatched,\r
- PeiDispatcher will migrate temporary memory to permenement memory.\r
+ PeiDispatcher will migrate temporary memory to permanent memory.\r
\r
@param PeiServices An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.\r
@param MemoryBegin Start of memory address.\r
IN UINT64 MemoryLength\r
)\r
{\r
- PEI_CORE_INSTANCE *PrivateData;\r
+ PEI_CORE_INSTANCE *PrivateData;\r
\r
- DEBUG ((EFI_D_INFO, "PeiInstallPeiMemory MemoryBegin 0x%LX, MemoryLength 0x%LX\n", MemoryBegin, MemoryLength));\r
+ DEBUG ((DEBUG_INFO, "PeiInstallPeiMemory MemoryBegin 0x%LX, MemoryLength 0x%LX\n", MemoryBegin, MemoryLength));\r
PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices);\r
\r
//\r
// PEI_SERVICE.InstallPeiMemory should only be called one time during whole PEI phase.\r
// If it is invoked more than one time, ASSERT information is given for developer debugging in debug tip and\r
- // simply return EFI_SUCESS in release tip to ignore it.\r
+ // simply return EFI_SUCCESS in release tip to ignore it.\r
//\r
if (PrivateData->PeiMemoryInstalled) {\r
- DEBUG ((EFI_D_ERROR, "ERROR: PeiInstallPeiMemory is called more than once!\n"));\r
+ DEBUG ((DEBUG_ERROR, "ERROR: PeiInstallPeiMemory is called more than once!\n"));\r
ASSERT (FALSE);\r
return EFI_SUCCESS;\r
}\r
PrivateData->PhysicalMemoryLength = MemoryLength;\r
PrivateData->FreePhysicalMemoryTop = MemoryBegin + MemoryLength;\r
\r
- PrivateData->SwitchStackSignal = TRUE;\r
+ PrivateData->SwitchStackSignal = TRUE;\r
\r
return EFI_SUCCESS;\r
}\r
**/\r
VOID\r
MigrateMemoryPages (\r
- IN PEI_CORE_INSTANCE *Private,\r
- IN BOOLEAN TemporaryRamMigrated\r
+ IN PEI_CORE_INSTANCE *Private,\r
+ IN BOOLEAN TemporaryRamMigrated\r
)\r
{\r
- EFI_PHYSICAL_ADDRESS NewMemPagesBase;\r
- EFI_PHYSICAL_ADDRESS MemPagesBase;\r
+ EFI_PHYSICAL_ADDRESS NewMemPagesBase;\r
+ EFI_PHYSICAL_ADDRESS MemPagesBase;\r
\r
- Private->MemoryPages.Size = (UINTN) (Private->HobList.HandoffInformationTable->EfiMemoryTop -\r
- Private->HobList.HandoffInformationTable->EfiFreeMemoryTop);\r
+ Private->MemoryPages.Size = (UINTN)(Private->HobList.HandoffInformationTable->EfiMemoryTop -\r
+ Private->HobList.HandoffInformationTable->EfiFreeMemoryTop);\r
if (Private->MemoryPages.Size == 0) {\r
//\r
// No any memory page allocated in pre-memory phase.\r
//\r
return;\r
}\r
+\r
Private->MemoryPages.Base = Private->HobList.HandoffInformationTable->EfiFreeMemoryTop;\r
\r
ASSERT (Private->MemoryPages.Size <= Private->FreePhysicalMemoryTop);\r
- NewMemPagesBase = Private->FreePhysicalMemoryTop - Private->MemoryPages.Size;\r
+ NewMemPagesBase = Private->FreePhysicalMemoryTop - Private->MemoryPages.Size;\r
NewMemPagesBase &= ~(UINT64)EFI_PAGE_MASK;\r
ASSERT (NewMemPagesBase >= Private->PhysicalMemoryBegin);\r
//\r
} else {\r
MemPagesBase -= Private->HeapOffset;\r
}\r
+\r
CopyMem ((VOID *)(UINTN)NewMemPagesBase, (VOID *)(UINTN)MemPagesBase, Private->MemoryPages.Size);\r
} else {\r
CopyMem ((VOID *)(UINTN)NewMemPagesBase, (VOID *)(UINTN)Private->MemoryPages.Base, Private->MemoryPages.Size);\r
\r
if (NewMemPagesBase >= Private->MemoryPages.Base) {\r
Private->MemoryPages.OffsetPositive = TRUE;\r
- Private->MemoryPages.Offset = (UINTN)(NewMemPagesBase - Private->MemoryPages.Base);\r
+ Private->MemoryPages.Offset = (UINTN)(NewMemPagesBase - Private->MemoryPages.Base);\r
} else {\r
Private->MemoryPages.OffsetPositive = FALSE;\r
- Private->MemoryPages.Offset = (UINTN)(Private->MemoryPages.Base - NewMemPagesBase);\r
+ Private->MemoryPages.Offset = (UINTN)(Private->MemoryPages.Base - NewMemPagesBase);\r
}\r
\r
- DEBUG ((DEBUG_INFO, "Pages Offset = 0x%lX\n", (UINT64) Private->MemoryPages.Offset));\r
+ DEBUG ((DEBUG_INFO, "Pages Offset = 0x%lX\n", (UINT64)Private->MemoryPages.Offset));\r
\r
Private->FreePhysicalMemoryTop = NewMemPagesBase;\r
}\r
\r
+/**\r
+ Removes any FV HOBs whose base address is not in PEI installed memory.\r
+\r
+ @param[in] Private Pointer to PeiCore's private data structure.\r
+\r
+**/\r
+VOID\r
+RemoveFvHobsInTemporaryMemory (\r
+ IN PEI_CORE_INSTANCE *Private\r
+ )\r
+{\r
+ EFI_PEI_HOB_POINTERS Hob;\r
+ EFI_HOB_FIRMWARE_VOLUME *FirmwareVolumeHob;\r
+\r
+ DEBUG ((DEBUG_INFO, "Removing FVs in FV HOB not already migrated to permanent memory.\n"));\r
+\r
+ for (Hob.Raw = GetHobList (); !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {\r
+ if ((GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_FV) || (GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_FV2) || (GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_FV3)) {\r
+ FirmwareVolumeHob = Hob.FirmwareVolume;\r
+ DEBUG ((DEBUG_INFO, " Found FV HOB.\n"));\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ " BA=%016lx L=%016lx\n",\r
+ FirmwareVolumeHob->BaseAddress,\r
+ FirmwareVolumeHob->Length\r
+ ));\r
+ if (\r
+ !(\r
+ ((EFI_PHYSICAL_ADDRESS)(UINTN)FirmwareVolumeHob->BaseAddress >= Private->PhysicalMemoryBegin) &&\r
+ (((EFI_PHYSICAL_ADDRESS)(UINTN)FirmwareVolumeHob->BaseAddress + (FirmwareVolumeHob->Length - 1)) < Private->FreePhysicalMemoryTop)\r
+ )\r
+ )\r
+ {\r
+ DEBUG ((DEBUG_INFO, " Removing FV HOB to an FV in T-RAM (was not migrated).\n"));\r
+ Hob.Header->HobType = EFI_HOB_TYPE_UNUSED;\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+/**\r
+ Migrate the base address in firmware volume allocation HOBs\r
+ from temporary memory to PEI installed memory.\r
+\r
+ @param[in] PrivateData Pointer to PeiCore's private data structure.\r
+ @param[in] OrgFvHandle Address of FV Handle in temporary memory.\r
+ @param[in] FvHandle Address of FV Handle in permanent memory.\r
+\r
+**/\r
+VOID\r
+ConvertFvHob (\r
+ IN PEI_CORE_INSTANCE *PrivateData,\r
+ IN UINTN OrgFvHandle,\r
+ IN UINTN FvHandle\r
+ )\r
+{\r
+ EFI_PEI_HOB_POINTERS Hob;\r
+ EFI_HOB_FIRMWARE_VOLUME *FirmwareVolumeHob;\r
+ EFI_HOB_FIRMWARE_VOLUME2 *FirmwareVolume2Hob;\r
+ EFI_HOB_FIRMWARE_VOLUME3 *FirmwareVolume3Hob;\r
+\r
+ DEBUG ((DEBUG_INFO, "Converting FVs in FV HOB.\n"));\r
+\r
+ for (Hob.Raw = GetHobList (); !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {\r
+ if (GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_FV) {\r
+ FirmwareVolumeHob = Hob.FirmwareVolume;\r
+ if (FirmwareVolumeHob->BaseAddress == OrgFvHandle) {\r
+ FirmwareVolumeHob->BaseAddress = FvHandle;\r
+ }\r
+ } else if (GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_FV2) {\r
+ FirmwareVolume2Hob = Hob.FirmwareVolume2;\r
+ if (FirmwareVolume2Hob->BaseAddress == OrgFvHandle) {\r
+ FirmwareVolume2Hob->BaseAddress = FvHandle;\r
+ }\r
+ } else if (GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_FV3) {\r
+ FirmwareVolume3Hob = Hob.FirmwareVolume3;\r
+ if (FirmwareVolume3Hob->BaseAddress == OrgFvHandle) {\r
+ FirmwareVolume3Hob->BaseAddress = FvHandle;\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
/**\r
Migrate MemoryBaseAddress in memory allocation HOBs\r
from the temporary memory to PEI installed memory.\r
**/\r
VOID\r
ConvertMemoryAllocationHobs (\r
- IN PEI_CORE_INSTANCE *PrivateData\r
+ IN PEI_CORE_INSTANCE *PrivateData\r
)\r
{\r
- EFI_PEI_HOB_POINTERS Hob;\r
- EFI_HOB_MEMORY_ALLOCATION *MemoryAllocationHob;\r
- EFI_PHYSICAL_ADDRESS OldMemPagesBase;\r
- UINTN OldMemPagesSize;\r
+ EFI_PEI_HOB_POINTERS Hob;\r
+ EFI_HOB_MEMORY_ALLOCATION *MemoryAllocationHob;\r
+ EFI_PHYSICAL_ADDRESS OldMemPagesBase;\r
+ UINTN OldMemPagesSize;\r
\r
if (PrivateData->MemoryPages.Size == 0) {\r
//\r
OldMemPagesSize = PrivateData->MemoryPages.Size;\r
\r
MemoryAllocationHob = NULL;\r
- Hob.Raw = GetFirstHob (EFI_HOB_TYPE_MEMORY_ALLOCATION);\r
+ Hob.Raw = GetFirstHob (EFI_HOB_TYPE_MEMORY_ALLOCATION);\r
while (Hob.Raw != NULL) {\r
- MemoryAllocationHob = (EFI_HOB_MEMORY_ALLOCATION *) Hob.Raw;\r
+ MemoryAllocationHob = (EFI_HOB_MEMORY_ALLOCATION *)Hob.Raw;\r
if ((MemoryAllocationHob->AllocDescriptor.MemoryBaseAddress >= OldMemPagesBase) &&\r
(MemoryAllocationHob->AllocDescriptor.MemoryBaseAddress < (OldMemPagesBase + OldMemPagesSize))\r
- ) {\r
+ )\r
+ {\r
if (PrivateData->MemoryPages.OffsetPositive) {\r
MemoryAllocationHob->AllocDescriptor.MemoryBaseAddress += PrivateData->MemoryPages.Offset;\r
} else {\r
**/\r
VOID\r
InternalBuildMemoryAllocationHob (\r
- IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
- IN UINT64 Length,\r
- IN EFI_MEMORY_TYPE MemoryType\r
+ IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
+ IN UINT64 Length,\r
+ IN EFI_MEMORY_TYPE MemoryType\r
)\r
{\r
- EFI_PEI_HOB_POINTERS Hob;\r
- EFI_HOB_MEMORY_ALLOCATION *MemoryAllocationHob;\r
+ EFI_PEI_HOB_POINTERS Hob;\r
+ EFI_HOB_MEMORY_ALLOCATION *MemoryAllocationHob;\r
\r
//\r
// Search unused(freed) memory allocation HOB.\r
//\r
MemoryAllocationHob = NULL;\r
- Hob.Raw = GetFirstHob (EFI_HOB_TYPE_UNUSED);\r
+ Hob.Raw = GetFirstHob (EFI_HOB_TYPE_UNUSED);\r
while (Hob.Raw != NULL) {\r
if (Hob.Header->HobLength == sizeof (EFI_HOB_MEMORY_ALLOCATION)) {\r
- MemoryAllocationHob = (EFI_HOB_MEMORY_ALLOCATION *) Hob.Raw;\r
+ MemoryAllocationHob = (EFI_HOB_MEMORY_ALLOCATION *)Hob.Raw;\r
break;\r
}\r
\r
**/\r
VOID\r
UpdateOrSplitMemoryAllocationHob (\r
- IN OUT EFI_HOB_MEMORY_ALLOCATION *MemoryAllocationHob,\r
- IN EFI_PHYSICAL_ADDRESS Memory,\r
- IN UINT64 Bytes,\r
- IN EFI_MEMORY_TYPE MemoryType\r
+ IN OUT EFI_HOB_MEMORY_ALLOCATION *MemoryAllocationHob,\r
+ IN EFI_PHYSICAL_ADDRESS Memory,\r
+ IN UINT64 Bytes,\r
+ IN EFI_MEMORY_TYPE MemoryType\r
)\r
{\r
if ((Memory + Bytes) <\r
- (MemoryAllocationHob->AllocDescriptor.MemoryBaseAddress + MemoryAllocationHob->AllocDescriptor.MemoryLength)) {\r
+ (MemoryAllocationHob->AllocDescriptor.MemoryBaseAddress + MemoryAllocationHob->AllocDescriptor.MemoryLength))\r
+ {\r
//\r
// Last pages need to be split out.\r
//\r
// Update the memory allocation HOB.\r
//\r
MemoryAllocationHob->AllocDescriptor.MemoryBaseAddress = Memory;\r
- MemoryAllocationHob->AllocDescriptor.MemoryLength = Bytes;\r
- MemoryAllocationHob->AllocDescriptor.MemoryType = MemoryType;\r
+ MemoryAllocationHob->AllocDescriptor.MemoryLength = Bytes;\r
+ MemoryAllocationHob->AllocDescriptor.MemoryType = MemoryType;\r
}\r
\r
/**\r
VOID\r
)\r
{\r
- EFI_PEI_HOB_POINTERS Hob;\r
- EFI_PEI_HOB_POINTERS Hob2;\r
- EFI_HOB_MEMORY_ALLOCATION *MemoryHob;\r
- EFI_HOB_MEMORY_ALLOCATION *MemoryHob2;\r
- UINT64 Start;\r
- UINT64 End;\r
- BOOLEAN Merged;\r
+ EFI_PEI_HOB_POINTERS Hob;\r
+ EFI_PEI_HOB_POINTERS Hob2;\r
+ EFI_HOB_MEMORY_ALLOCATION *MemoryHob;\r
+ EFI_HOB_MEMORY_ALLOCATION *MemoryHob2;\r
+ UINT64 Start;\r
+ UINT64 End;\r
+ BOOLEAN Merged;\r
\r
Merged = FALSE;\r
\r
Hob.Raw = GetFirstHob (EFI_HOB_TYPE_MEMORY_ALLOCATION);\r
while (Hob.Raw != NULL) {\r
if (Hob.MemoryAllocation->AllocDescriptor.MemoryType == EfiConventionalMemory) {\r
- MemoryHob = (EFI_HOB_MEMORY_ALLOCATION *) Hob.Raw;\r
- Start = MemoryHob->AllocDescriptor.MemoryBaseAddress;\r
- End = MemoryHob->AllocDescriptor.MemoryBaseAddress + MemoryHob->AllocDescriptor.MemoryLength;\r
+ MemoryHob = (EFI_HOB_MEMORY_ALLOCATION *)Hob.Raw;\r
+ Start = MemoryHob->AllocDescriptor.MemoryBaseAddress;\r
+ End = MemoryHob->AllocDescriptor.MemoryBaseAddress + MemoryHob->AllocDescriptor.MemoryLength;\r
\r
Hob2.Raw = GET_NEXT_HOB (Hob);\r
Hob2.Raw = GetNextHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, Hob.Raw);\r
while (Hob2.Raw != NULL) {\r
if (Hob2.MemoryAllocation->AllocDescriptor.MemoryType == EfiConventionalMemory) {\r
- MemoryHob2 = (EFI_HOB_MEMORY_ALLOCATION *) Hob2.Raw;\r
+ MemoryHob2 = (EFI_HOB_MEMORY_ALLOCATION *)Hob2.Raw;\r
if (Start == (MemoryHob2->AllocDescriptor.MemoryBaseAddress + MemoryHob2->AllocDescriptor.MemoryLength)) {\r
//\r
// Merge adjacent two free memory ranges.\r
//\r
MemoryHob2->AllocDescriptor.MemoryLength += MemoryHob->AllocDescriptor.MemoryLength;\r
- Merged = TRUE;\r
+ Merged = TRUE;\r
//\r
// Mark MemoryHob to be unused(freed).\r
//\r
// Merge adjacent two free memory ranges.\r
//\r
MemoryHob2->AllocDescriptor.MemoryBaseAddress = MemoryHob->AllocDescriptor.MemoryBaseAddress;\r
- MemoryHob2->AllocDescriptor.MemoryLength += MemoryHob->AllocDescriptor.MemoryLength;\r
- Merged = TRUE;\r
+ MemoryHob2->AllocDescriptor.MemoryLength += MemoryHob->AllocDescriptor.MemoryLength;\r
+ Merged = TRUE;\r
//\r
// Mark MemoryHob to be unused(freed).\r
//\r
break;\r
}\r
}\r
+\r
Hob2.Raw = GET_NEXT_HOB (Hob2);\r
Hob2.Raw = GetNextHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, Hob2.Raw);\r
}\r
}\r
+\r
Hob.Raw = GET_NEXT_HOB (Hob);\r
Hob.Raw = GetNextHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, Hob.Raw);\r
}\r
**/\r
EFI_STATUS\r
FindFreeMemoryFromMemoryAllocationHob (\r
- IN EFI_MEMORY_TYPE MemoryType,\r
- IN UINTN Pages,\r
- IN UINTN Granularity,\r
- OUT EFI_PHYSICAL_ADDRESS *Memory\r
+ IN EFI_MEMORY_TYPE MemoryType,\r
+ IN UINTN Pages,\r
+ IN UINTN Granularity,\r
+ OUT EFI_PHYSICAL_ADDRESS *Memory\r
)\r
{\r
- EFI_PEI_HOB_POINTERS Hob;\r
- EFI_HOB_MEMORY_ALLOCATION *MemoryAllocationHob;\r
- UINT64 Bytes;\r
- EFI_PHYSICAL_ADDRESS BaseAddress;\r
+ EFI_PEI_HOB_POINTERS Hob;\r
+ EFI_HOB_MEMORY_ALLOCATION *MemoryAllocationHob;\r
+ UINT64 Bytes;\r
+ EFI_PHYSICAL_ADDRESS BaseAddress;\r
\r
Bytes = LShiftU64 (Pages, EFI_PAGE_SHIFT);\r
\r
- BaseAddress = 0;\r
+ BaseAddress = 0;\r
MemoryAllocationHob = NULL;\r
- Hob.Raw = GetFirstHob (EFI_HOB_TYPE_MEMORY_ALLOCATION);\r
+ Hob.Raw = GetFirstHob (EFI_HOB_TYPE_MEMORY_ALLOCATION);\r
while (Hob.Raw != NULL) {\r
if ((Hob.MemoryAllocation->AllocDescriptor.MemoryType == EfiConventionalMemory) &&\r
- (Hob.MemoryAllocation->AllocDescriptor.MemoryLength >= Bytes)) {\r
+ (Hob.MemoryAllocation->AllocDescriptor.MemoryLength >= Bytes))\r
+ {\r
//\r
// Found one memory allocation HOB with big enough free memory.\r
//\r
- MemoryAllocationHob = (EFI_HOB_MEMORY_ALLOCATION *) Hob.Raw;\r
- BaseAddress = MemoryAllocationHob->AllocDescriptor.MemoryBaseAddress +\r
- MemoryAllocationHob->AllocDescriptor.MemoryLength - Bytes;\r
+ MemoryAllocationHob = (EFI_HOB_MEMORY_ALLOCATION *)Hob.Raw;\r
+ BaseAddress = MemoryAllocationHob->AllocDescriptor.MemoryBaseAddress +\r
+ MemoryAllocationHob->AllocDescriptor.MemoryLength - Bytes;\r
//\r
// Make sure the granularity could be satisfied.\r
//\r
- BaseAddress &= ~((EFI_PHYSICAL_ADDRESS) Granularity - 1);\r
+ BaseAddress &= ~((EFI_PHYSICAL_ADDRESS)Granularity - 1);\r
if (BaseAddress >= MemoryAllocationHob->AllocDescriptor.MemoryBaseAddress) {\r
break;\r
}\r
- BaseAddress = 0;\r
+\r
+ BaseAddress = 0;\r
MemoryAllocationHob = NULL;\r
}\r
+\r
//\r
// Continue to find.\r
//\r
//\r
return FindFreeMemoryFromMemoryAllocationHob (MemoryType, Pages, Granularity, Memory);\r
}\r
+\r
return EFI_NOT_FOUND;\r
}\r
}\r
EFI_STATUS\r
EFIAPI\r
PeiAllocatePages (\r
- IN CONST EFI_PEI_SERVICES **PeiServices,\r
- IN EFI_MEMORY_TYPE MemoryType,\r
- IN UINTN Pages,\r
- OUT EFI_PHYSICAL_ADDRESS *Memory\r
+ IN CONST EFI_PEI_SERVICES **PeiServices,\r
+ IN EFI_MEMORY_TYPE MemoryType,\r
+ IN UINTN Pages,\r
+ OUT EFI_PHYSICAL_ADDRESS *Memory\r
)\r
{\r
- EFI_STATUS Status;\r
- PEI_CORE_INSTANCE *PrivateData;\r
- EFI_PEI_HOB_POINTERS Hob;\r
- EFI_PHYSICAL_ADDRESS *FreeMemoryTop;\r
- EFI_PHYSICAL_ADDRESS *FreeMemoryBottom;\r
- UINTN RemainingPages;\r
- UINTN Granularity;\r
- UINTN Padding;\r
+ EFI_STATUS Status;\r
+ PEI_CORE_INSTANCE *PrivateData;\r
+ EFI_PEI_HOB_POINTERS Hob;\r
+ EFI_PHYSICAL_ADDRESS *FreeMemoryTop;\r
+ EFI_PHYSICAL_ADDRESS *FreeMemoryBottom;\r
+ UINTN RemainingPages;\r
+ UINTN Granularity;\r
+ UINTN Padding;\r
\r
if ((MemoryType != EfiLoaderCode) &&\r
(MemoryType != EfiLoaderData) &&\r
(MemoryType != EfiBootServicesData) &&\r
(MemoryType != EfiACPIReclaimMemory) &&\r
(MemoryType != EfiReservedMemoryType) &&\r
- (MemoryType != EfiACPIMemoryNVS)) {\r
+ (MemoryType != EfiACPIMemoryNVS))\r
+ {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
return EFI_NOT_AVAILABLE_YET;\r
}\r
\r
- if (RUNTIME_PAGE_ALLOCATION_GRANULARITY > DEFAULT_PAGE_ALLOCATION_GRANULARITY &&\r
- (MemoryType == EfiACPIReclaimMemory ||\r
- MemoryType == EfiACPIMemoryNVS ||\r
- MemoryType == EfiRuntimeServicesCode ||\r
- MemoryType == EfiRuntimeServicesData)) {\r
-\r
+ if ((RUNTIME_PAGE_ALLOCATION_GRANULARITY > DEFAULT_PAGE_ALLOCATION_GRANULARITY) &&\r
+ ((MemoryType == EfiACPIReclaimMemory) ||\r
+ (MemoryType == EfiACPIMemoryNVS) ||\r
+ (MemoryType == EfiRuntimeServicesCode) ||\r
+ (MemoryType == EfiRuntimeServicesData)))\r
+ {\r
Granularity = RUNTIME_PAGE_ALLOCATION_GRANULARITY;\r
\r
- DEBUG ((DEBUG_INFO, "AllocatePages: aligning allocation to %d KB\n",\r
- Granularity / SIZE_1KB));\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "AllocatePages: aligning allocation to %d KB\n",\r
+ Granularity / SIZE_1KB\r
+ ));\r
}\r
\r
if (!PrivateData->PeiMemoryInstalled && PrivateData->SwitchStackSignal) {\r
// When PeiInstallMemory is called but temporary memory has *not* been moved to permanent memory,\r
// the AllocatePage will depend on the field of PEI_CORE_INSTANCE structure.\r
//\r
- FreeMemoryTop = &(PrivateData->FreePhysicalMemoryTop);\r
- FreeMemoryBottom = &(PrivateData->PhysicalMemoryBegin);\r
+ FreeMemoryTop = &(PrivateData->FreePhysicalMemoryTop);\r
+ FreeMemoryBottom = &(PrivateData->PhysicalMemoryBegin);\r
} else {\r
- FreeMemoryTop = &(Hob.HandoffInformationTable->EfiFreeMemoryTop);\r
- FreeMemoryBottom = &(Hob.HandoffInformationTable->EfiFreeMemoryBottom);\r
+ FreeMemoryTop = &(Hob.HandoffInformationTable->EfiFreeMemoryTop);\r
+ FreeMemoryBottom = &(Hob.HandoffInformationTable->EfiFreeMemoryBottom);\r
}\r
\r
//\r
// If not aligned, make the allocation aligned.\r
//\r
Padding = *(FreeMemoryTop) & (Granularity - 1);\r
- if ((UINTN) (*FreeMemoryTop - *FreeMemoryBottom) < Padding) {\r
+ if ((UINTN)(*FreeMemoryTop - *FreeMemoryBottom) < Padding) {\r
DEBUG ((DEBUG_ERROR, "AllocatePages failed: Out of space after padding.\n"));\r
return EFI_OUT_OF_RESOURCES;\r
}\r
if (!EFI_ERROR (Status)) {\r
return Status;\r
}\r
- DEBUG ((EFI_D_ERROR, "AllocatePages failed: No 0x%lx Pages is available.\n", (UINT64) Pages));\r
- DEBUG ((EFI_D_ERROR, "There is only left 0x%lx pages memory resource to be allocated.\n", (UINT64) RemainingPages));\r
- return EFI_OUT_OF_RESOURCES;\r
+\r
+ DEBUG ((DEBUG_ERROR, "AllocatePages failed: No 0x%lx Pages is available.\n", (UINT64)Pages));\r
+ DEBUG ((DEBUG_ERROR, "There is only left 0x%lx pages memory resource to be allocated.\n", (UINT64)RemainingPages));\r
+ return EFI_OUT_OF_RESOURCES;\r
} else {\r
//\r
// Update the PHIT to reflect the memory usage\r
**/\r
VOID\r
FreeMemoryAllocationHob (\r
- IN PEI_CORE_INSTANCE *PrivateData,\r
- IN OUT EFI_HOB_MEMORY_ALLOCATION *MemoryAllocationHobToFree\r
+ IN PEI_CORE_INSTANCE *PrivateData,\r
+ IN OUT EFI_HOB_MEMORY_ALLOCATION *MemoryAllocationHobToFree\r
)\r
{\r
- EFI_PEI_HOB_POINTERS Hob;\r
- EFI_PHYSICAL_ADDRESS *FreeMemoryTop;\r
- EFI_HOB_MEMORY_ALLOCATION *MemoryAllocationHob;\r
+ EFI_PEI_HOB_POINTERS Hob;\r
+ EFI_PHYSICAL_ADDRESS *FreeMemoryTop;\r
+ EFI_HOB_MEMORY_ALLOCATION *MemoryAllocationHob;\r
\r
Hob.Raw = PrivateData->HobList.Raw;\r
\r
MemoryAllocationHobToFree->Header.HobType = EFI_HOB_TYPE_UNUSED;\r
\r
MemoryAllocationHob = NULL;\r
- Hob.Raw = GetFirstHob (EFI_HOB_TYPE_MEMORY_ALLOCATION);\r
+ Hob.Raw = GetFirstHob (EFI_HOB_TYPE_MEMORY_ALLOCATION);\r
while (Hob.Raw != NULL) {\r
if ((Hob.MemoryAllocation->AllocDescriptor.MemoryType == EfiConventionalMemory) &&\r
- (Hob.MemoryAllocation->AllocDescriptor.MemoryBaseAddress == *FreeMemoryTop)) {\r
+ (Hob.MemoryAllocation->AllocDescriptor.MemoryBaseAddress == *FreeMemoryTop))\r
+ {\r
//\r
// Found memory allocation HOB that has EfiConventionalMemory MemoryType and\r
// MemoryBaseAddress == new *FreeMemoryTop.\r
//\r
- MemoryAllocationHob = (EFI_HOB_MEMORY_ALLOCATION *) Hob.Raw;\r
+ MemoryAllocationHob = (EFI_HOB_MEMORY_ALLOCATION *)Hob.Raw;\r
break;\r
}\r
+\r
Hob.Raw = GET_NEXT_HOB (Hob);\r
Hob.Raw = GetNextHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, Hob.Raw);\r
}\r
+\r
//\r
// Free memory allocation HOB iteratively.\r
//\r
EFI_STATUS\r
EFIAPI\r
PeiFreePages (\r
- IN CONST EFI_PEI_SERVICES **PeiServices,\r
- IN EFI_PHYSICAL_ADDRESS Memory,\r
- IN UINTN Pages\r
+ IN CONST EFI_PEI_SERVICES **PeiServices,\r
+ IN EFI_PHYSICAL_ADDRESS Memory,\r
+ IN UINTN Pages\r
)\r
{\r
- PEI_CORE_INSTANCE *PrivateData;\r
- UINT64 Bytes;\r
- UINT64 Start;\r
- UINT64 End;\r
- EFI_PEI_HOB_POINTERS Hob;\r
- EFI_HOB_MEMORY_ALLOCATION *MemoryAllocationHob;\r
+ PEI_CORE_INSTANCE *PrivateData;\r
+ UINT64 Bytes;\r
+ UINT64 Start;\r
+ UINT64 End;\r
+ EFI_PEI_HOB_POINTERS Hob;\r
+ EFI_HOB_MEMORY_ALLOCATION *MemoryAllocationHob;\r
\r
Bytes = LShiftU64 (Pages, EFI_PAGE_SHIFT);\r
Start = Memory;\r
- End = Start + Bytes - 1;\r
+ End = Start + Bytes - 1;\r
\r
- if (Pages == 0 || ((Start & EFI_PAGE_MASK) != 0) || (Start >= End)) {\r
+ if ((Pages == 0) || ((Start & EFI_PAGE_MASK) != 0) || (Start >= End)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
}\r
\r
MemoryAllocationHob = NULL;\r
- Hob.Raw = GetFirstHob (EFI_HOB_TYPE_MEMORY_ALLOCATION);\r
+ Hob.Raw = GetFirstHob (EFI_HOB_TYPE_MEMORY_ALLOCATION);\r
while (Hob.Raw != NULL) {\r
if ((Hob.MemoryAllocation->AllocDescriptor.MemoryType != EfiConventionalMemory) &&\r
(Memory >= Hob.MemoryAllocation->AllocDescriptor.MemoryBaseAddress) &&\r
- ((Memory + Bytes) <= (Hob.MemoryAllocation->AllocDescriptor.MemoryBaseAddress + Hob.MemoryAllocation->AllocDescriptor.MemoryLength))) {\r
+ ((Memory + Bytes) <= (Hob.MemoryAllocation->AllocDescriptor.MemoryBaseAddress + Hob.MemoryAllocation->AllocDescriptor.MemoryLength)))\r
+ {\r
//\r
// Found the memory allocation HOB that includes the memory pages to be freed.\r
//\r
- MemoryAllocationHob = (EFI_HOB_MEMORY_ALLOCATION *) Hob.Raw;\r
+ MemoryAllocationHob = (EFI_HOB_MEMORY_ALLOCATION *)Hob.Raw;\r
break;\r
}\r
+\r
Hob.Raw = GET_NEXT_HOB (Hob);\r
Hob.Raw = GetNextHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, Hob.Raw);\r
}\r
\r
/**\r
\r
- Pool allocation service. Before permanent memory is discoveried, the pool will\r
- be allocated the heap in the temporary memory. Genenrally, the size of heap in temporary\r
- memory does not exceed to 64K, so the biggest pool size could be allocated is\r
+ Pool allocation service. Before permanent memory is discovered, the pool will\r
+ be allocated in the heap in temporary memory. Generally, the size of the heap in temporary\r
+ memory does not exceed 64K, so the biggest pool size could be allocated is\r
64K.\r
\r
@param PeiServices An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.\r
EFI_STATUS\r
EFIAPI\r
PeiAllocatePool (\r
- IN CONST EFI_PEI_SERVICES **PeiServices,\r
- IN UINTN Size,\r
- OUT VOID **Buffer\r
+ IN CONST EFI_PEI_SERVICES **PeiServices,\r
+ IN UINTN Size,\r
+ OUT VOID **Buffer\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_HOB_MEMORY_POOL *Hob;\r
+ EFI_STATUS Status;\r
+ EFI_HOB_MEMORY_POOL *Hob;\r
\r
//\r
// If some "post-memory" PEIM wishes to allocate larger pool,\r
//\r
\r
//\r
- // Generally, the size of heap in temporary memory does not exceed to 64K,\r
- // HobLength is multiples of 8 bytes, so the maxmium size of pool is 0xFFF8 - sizeof (EFI_HOB_MEMORY_POOL)\r
+ // Generally, the size of heap in temporary memory does not exceed 64K,\r
+ // HobLength is multiples of 8 bytes, so the maximum size of pool is 0xFFF8 - sizeof (EFI_HOB_MEMORY_POOL)\r
//\r
if (Size > (0xFFF8 - sizeof (EFI_HOB_MEMORY_POOL))) {\r
return EFI_OUT_OF_RESOURCES;\r
(VOID **)&Hob\r
);\r
ASSERT_EFI_ERROR (Status);\r
- *Buffer = Hob+1;\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ *Buffer = NULL;\r
+ } else {\r
+ *Buffer = Hob + 1;\r
+ }\r
\r
return Status;\r
}\r