\r
#include <PeiMain.h>\r
\r
+static EFI_PEI_PPI_DESCRIPTOR mMemoryDiscoveredPpi = {\r
+ (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
+ &gEfiPeiMemoryDiscoveredPpiGuid,\r
+ NULL\r
+};\r
+\r
VOID\r
InitializeMemoryServices (\r
IN PEI_CORE_INSTANCE *PrivateData,\r
\r
--*/\r
{\r
- PrivateData->SwitchStackSignal = FALSE;\r
+ \r
+ PrivateData->SwitchStackSignal = FALSE;\r
\r
if (OldCoreData == NULL) {\r
\r
PrivateData->PeiMemoryInstalled = FALSE;\r
\r
- PrivateData->BottomOfCarHeap = SecCoreData->PeiTemporaryRamBase; \r
- PrivateData->TopOfCarHeap = (VOID *)((UINTN)(PrivateData->BottomOfCarHeap) + SecCoreData->PeiTemporaryRamSize);\r
- \r
+ PrivateData->BottomOfCarHeap = SecCoreData->PeiTemporaryRamBase; \r
+ PrivateData->TopOfCarHeap = (VOID *)((UINTN)(PrivateData->BottomOfCarHeap) + SecCoreData->PeiTemporaryRamSize);\r
+ PrivateData->SizeOfTemporaryMemory = SecCoreData->TemporaryRamSize;\r
+ PrivateData->StackSize = (UINT64) SecCoreData->StackSize;\r
+ \r
DEBUG_CODE_BEGIN ();\r
PrivateData->SizeOfCacheAsRam = SecCoreData->PeiTemporaryRamSize + SecCoreData->StackSize;\r
PrivateData->MaxTopOfCarHeap = (VOID *) ((UINTN) PrivateData->BottomOfCarHeap + (UINTN) PrivateData->SizeOfCacheAsRam);\r
EFI_STATUS\r
EFIAPI\r
PeiInstallPeiMemory (\r
- IN CONST EFI_PEI_SERVICES **PeiServices,\r
- IN EFI_PHYSICAL_ADDRESS MemoryBegin,\r
- IN UINT64 MemoryLength\r
+ IN CONST EFI_PEI_SERVICES **PeiServices,\r
+ IN EFI_PHYSICAL_ADDRESS MemoryBegin,\r
+ IN UINT64 MemoryLength\r
)\r
/*++\r
\r
--*/\r
{\r
PEI_CORE_INSTANCE *PrivateData;\r
- EFI_HOB_HANDOFF_INFO_TABLE *OldHandOffHob;\r
- EFI_HOB_HANDOFF_INFO_TABLE *NewHandOffHob;\r
- UINT64 PeiStackSize;\r
- UINT64 EfiFreeMemorySize;\r
- EFI_PHYSICAL_ADDRESS PhysicalAddressOfOldHob;\r
-\r
- if (MemoryLength > (MAX_ADDRESS - MemoryBegin + 1))\r
- return EFI_INVALID_PARAMETER;\r
- \r
- \r
+\r
DEBUG ((EFI_D_INFO, "PeiInstallPeiMemory MemoryBegin 0x%LX, MemoryLength 0x%LX\n", MemoryBegin, MemoryLength));\r
- \r
PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices);\r
\r
- PrivateData->SwitchStackSignal = TRUE;\r
- PrivateData->PeiMemoryInstalled = TRUE;\r
- \r
- //\r
- // Ensure the stack base is in page alignment \r
- //\r
- PrivateData->StackBase = ((UINTN)MemoryBegin + EFI_PAGE_MASK) & ~EFI_PAGE_MASK;\r
- PeiStackSize = (RShiftU64 (MemoryLength, 1) + EFI_PAGE_MASK) & ~EFI_PAGE_MASK;\r
- \r
- if (PEI_STACK_SIZE > PeiStackSize) {\r
- PrivateData->StackSize = PeiStackSize;\r
- } else {\r
- PrivateData->StackSize = PEI_STACK_SIZE;\r
- }\r
-\r
- OldHandOffHob = PrivateData->HobList.HandoffInformationTable;\r
-\r
- PrivateData->HobList.Raw = (VOID *)((UINTN)(PrivateData->StackBase + PrivateData->StackSize));\r
- NewHandOffHob = PrivateData->HobList.HandoffInformationTable;\r
- PhysicalAddressOfOldHob = (EFI_PHYSICAL_ADDRESS) (UINTN) OldHandOffHob;\r
-\r
- EfiFreeMemorySize = OldHandOffHob->EfiFreeMemoryBottom - PhysicalAddressOfOldHob;\r
- \r
- DEBUG ((EFI_D_INFO, "HOBLIST address before memory init = 0x%p\n", OldHandOffHob));\r
- DEBUG ((EFI_D_INFO, "HOBLIST address after memory init = 0x%p\n", NewHandOffHob));\r
-\r
- CopyMem (\r
- NewHandOffHob,\r
- OldHandOffHob,\r
- (UINTN)EfiFreeMemorySize\r
- );\r
-\r
- NewHandOffHob->EfiMemoryTop = MemoryBegin + MemoryLength;\r
- NewHandOffHob->EfiFreeMemoryTop = NewHandOffHob->EfiMemoryTop;\r
- NewHandOffHob->EfiMemoryBottom = MemoryBegin;\r
- \r
- NewHandOffHob->EfiFreeMemoryBottom = (UINTN)NewHandOffHob + EfiFreeMemorySize; \r
- \r
- NewHandOffHob->EfiEndOfHobList = (UINTN)NewHandOffHob +\r
- (OldHandOffHob->EfiEndOfHobList -\r
- PhysicalAddressOfOldHob);\r
- \r
- //\r
- // For IPF in CAR mode the real memory access is uncached,in InstallPeiMemory()\r
- // the 63-bit of address is set to 1.\r
- //\r
- SWITCH_TO_CACHE_MODE (PrivateData);\r
- \r
- ConvertPpiPointers (PeiServices, OldHandOffHob, NewHandOffHob);\r
-\r
- BuildStackHob (PrivateData->StackBase, PrivateData->StackSize);\r
- \r
+ PrivateData->PhysicalMemoryBegin = MemoryBegin;\r
+ PrivateData->PhysicalMemoryLength = MemoryLength;\r
+ PrivateData->FreePhysicalMemoryTop = MemoryBegin + MemoryLength;\r
+ \r
+ PrivateData->SwitchStackSignal = TRUE;\r
\r
return EFI_SUCCESS; \r
}\r
PEI_CORE_INSTANCE *PrivateData;\r
EFI_PEI_HOB_POINTERS Hob;\r
EFI_PHYSICAL_ADDRESS Offset;\r
+ EFI_PHYSICAL_ADDRESS *FreeMemoryTop;\r
+ EFI_PHYSICAL_ADDRESS *FreeMemoryBottom;\r
\r
PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices);\r
-\r
+ Hob.Raw = PrivateData->HobList.Raw;\r
+ \r
//\r
// Check if Hob already available\r
//\r
if (!PrivateData->PeiMemoryInstalled) {\r
- return EFI_NOT_AVAILABLE_YET;\r
+ //\r
+ // When PeiInstallMemory is called but CAR has *not* been moved to temporary memory,\r
+ // the AllocatePage will dependent the field of PEI_CORE_INSTANCE structure.\r
+ //\r
+ if (!PrivateData->SwitchStackSignal) {\r
+ return EFI_NOT_AVAILABLE_YET;\r
+ } else {\r
+ FreeMemoryTop = &(PrivateData->FreePhysicalMemoryTop);\r
+ FreeMemoryBottom = &(PrivateData->PhysicalMemoryBegin);\r
+ }\r
+ } else {\r
+ FreeMemoryTop = &(Hob.HandoffInformationTable->EfiFreeMemoryTop);\r
+ FreeMemoryBottom = &(Hob.HandoffInformationTable->EfiFreeMemoryBottom);\r
}\r
\r
- Hob.Raw = PrivateData->HobList.Raw;\r
+ \r
\r
//\r
// Check to see if on 4k boundary\r
//\r
- Offset = Hob.HandoffInformationTable->EfiFreeMemoryTop & 0xFFF;\r
-\r
+ Offset = *(FreeMemoryTop) & 0xFFF;\r
+ \r
//\r
// If not aligned, make the allocation aligned.\r
//\r
if (Offset != 0) {\r
- Hob.HandoffInformationTable->EfiFreeMemoryTop -= Offset;\r
+ *(FreeMemoryTop) -= Offset;\r
}\r
-\r
- ASSERT (Hob.HandoffInformationTable->EfiFreeMemoryTop >= Hob.HandoffInformationTable->EfiFreeMemoryBottom);\r
+ \r
//\r
// Verify that there is sufficient memory to satisfy the allocation\r
//\r
- if (Hob.HandoffInformationTable->EfiFreeMemoryTop - ((Pages * EFI_PAGE_SIZE) + sizeof (EFI_HOB_MEMORY_ALLOCATION)) < \r
- Hob.HandoffInformationTable->EfiFreeMemoryBottom) {\r
+ if (*(FreeMemoryTop) - ((Pages * EFI_PAGE_SIZE) + sizeof (EFI_HOB_MEMORY_ALLOCATION)) < \r
+ *(FreeMemoryBottom)) {\r
DEBUG ((EFI_D_ERROR, "AllocatePages failed: No 0x%x Pages is available.\n", Pages));\r
DEBUG ((EFI_D_ERROR, "There is only left 0x%x pages memory resource to be allocated.\n", \\r
- EFI_SIZE_TO_PAGES ((UINTN) (Hob.HandoffInformationTable->EfiFreeMemoryTop - Hob.HandoffInformationTable->EfiFreeMemoryBottom))));\r
+ EFI_SIZE_TO_PAGES ((UINTN) (*(FreeMemoryTop) - *(FreeMemoryBottom)))));\r
return EFI_OUT_OF_RESOURCES;\r
} else {\r
//\r
// Update the PHIT to reflect the memory usage\r
//\r
- Hob.HandoffInformationTable->EfiFreeMemoryTop -= Pages * EFI_PAGE_SIZE;\r
+ *(FreeMemoryTop) -= Pages * EFI_PAGE_SIZE;\r
\r
//\r
// Update the value for the caller\r
//\r
- *Memory = Hob.HandoffInformationTable->EfiFreeMemoryTop;\r
+ *Memory = *(FreeMemoryTop);\r
\r
//\r
// Create a memory allocation HOB.\r
//\r
BuildMemoryAllocationHob (\r
- Hob.HandoffInformationTable->EfiFreeMemoryTop,\r
+ *(FreeMemoryTop),\r
Pages * EFI_PAGE_SIZE,\r
MemoryType\r
);\r