\r
VOID\r
InitializeMemoryServices (\r
- IN EFI_PEI_SERVICES **PeiServices,\r
- IN EFI_PEI_STARTUP_DESCRIPTOR *PeiStartupDescriptor,\r
+ IN PEI_CORE_INSTANCE *PrivateData,\r
+ IN CONST EFI_SEC_PEI_HAND_OFF *SecCoreData,\r
IN PEI_CORE_INSTANCE *OldCoreData\r
)\r
/*++\r
Arguments:\r
\r
PeiServices - The PEI core services table.\r
- PeiStartupDescriptor - Information and services provided by SEC phase.\r
+ SecCoreData - Points to a data structure containing information about the PEI core's operating\r
+ environment, such as the size and location of temporary RAM, the stack location and\r
+ the BFV location.\r
+\r
OldCoreData - Pointer to the PEI Core data.\r
NULL if being run in non-permament memory mode.\r
\r
\r
--*/\r
{\r
- PEI_CORE_INSTANCE *PrivateData;\r
- UINT64 SizeOfCarHeap;\r
-\r
- PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices);\r
PrivateData->SwitchStackSignal = FALSE;\r
\r
if (OldCoreData == NULL) {\r
\r
PrivateData->PeiMemoryInstalled = FALSE;\r
\r
- PrivateData->BottomOfCarHeap = (VOID *) (((UINTN)(VOID *)(&PrivateData))\r
- & (~((PeiStartupDescriptor->SizeOfCacheAsRam) - 1))); \r
- PrivateData->TopOfCarHeap = (VOID *)((UINTN)(PrivateData->BottomOfCarHeap) + PeiStartupDescriptor->SizeOfCacheAsRam);\r
- //\r
- // SizeOfCarHeap is 1/2 (arbitrary) of CacheAsRam Size.\r
- //\r
- SizeOfCarHeap = (UINT64) PeiStartupDescriptor->SizeOfCacheAsRam;\r
- SizeOfCarHeap = RShiftU64 (SizeOfCarHeap, 1);\r
+ PrivateData->BottomOfCarHeap = SecCoreData->PeiTemporaryRamBase; \r
+ PrivateData->TopOfCarHeap = (VOID *)((UINTN)(PrivateData->BottomOfCarHeap) + SecCoreData->PeiTemporaryRamSize);\r
\r
DEBUG_CODE_BEGIN ();\r
- PrivateData->SizeOfCacheAsRam = PeiStartupDescriptor->SizeOfCacheAsRam;\r
- PrivateData->MaxTopOfCarHeap = (VOID *) ((UINTN) PrivateData->BottomOfCarHeap + (UINTN) SizeOfCarHeap);\r
+ PrivateData->SizeOfCacheAsRam = SecCoreData->PeiTemporaryRamSize + SecCoreData->StackSize;\r
+ PrivateData->MaxTopOfCarHeap = (VOID *) ((UINTN) PrivateData->BottomOfCarHeap + (UINTN) PrivateData->SizeOfCacheAsRam);\r
+ PrivateData->StackBase = (EFI_PHYSICAL_ADDRESS) (UINTN) SecCoreData->StackBase;\r
+ PrivateData->StackSize = (UINT64) SecCoreData->StackSize;\r
DEBUG_CODE_END ();\r
\r
PrivateData->HobList.Raw = PrivateData->BottomOfCarHeap;\r
PeiCoreBuildHobHandoffInfoTable (\r
BOOT_WITH_FULL_CONFIGURATION,\r
(EFI_PHYSICAL_ADDRESS) (UINTN) PrivateData->BottomOfCarHeap,\r
- (UINTN) SizeOfCarHeap\r
+ (UINTN) SecCoreData->PeiTemporaryRamSize\r
);\r
- //\r
- // Copy PeiServices from ROM to Cache in PrivateData\r
- //\r
- CopyMem (&(PrivateData->ServiceTableShadow), *PeiServices, sizeof (EFI_PEI_SERVICES));\r
\r
//\r
// Set PS to point to ServiceTableShadow in Cache\r
//\r
PrivateData->PS = &(PrivateData->ServiceTableShadow);\r
- } else {\r
- // \r
- // Set PS to point to ServiceTableShadow in Cache one time after the \r
- // stack switched to main memory \r
- // \r
- PrivateData->PS = &(PrivateData->ServiceTableShadow); \r
-} \r
-\r
+ }\r
+ \r
return;\r
}\r
\r
EFI_STATUS\r
EFIAPI\r
PeiInstallPeiMemory (\r
- IN EFI_PEI_SERVICES **PeiServices,\r
+ IN CONST EFI_PEI_SERVICES **PeiServices,\r
IN EFI_PHYSICAL_ADDRESS MemoryBegin,\r
IN UINT64 MemoryLength\r
)\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
+ 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
- PrivateData->StackBase = MemoryBegin;\r
\r
- PeiStackSize = RShiftU64 (MemoryLength, 1);\r
+ //\r
+ // Ensure the stack base is in page alignment \r
+ //\r
+ PrivateData->StackBase = ((UINTN)MemoryBegin + (EFI_PAGE_SIZE - 1)) & EFI_PAGE_SIZE;\r
+ \r
+ PeiStackSize = (RShiftU64 (MemoryLength, 1) + (EFI_PAGE_SIZE - 1)) & EFI_PAGE_SIZE;\r
if (PEI_STACK_SIZE > PeiStackSize) {\r
PrivateData->StackSize = PeiStackSize;\r
} else {\r
\r
OldHandOffHob = PrivateData->HobList.HandoffInformationTable;\r
\r
- PrivateData->HobList.Raw = (VOID *)((UINTN)(MemoryBegin + PrivateData->StackSize));\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%08x\n", OldHandOffHob));\r
- DEBUG ((EFI_D_INFO, "HOBLIST address after memory init = 0x%08x\n", NewHandOffHob));\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
NewHandOffHob->EfiEndOfHobList = (UINTN)NewHandOffHob +\r
(OldHandOffHob->EfiEndOfHobList -\r
PhysicalAddressOfOldHob);\r
-\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
EFI_STATUS\r
EFIAPI\r
PeiAllocatePages (\r
- IN EFI_PEI_SERVICES **PeiServices,\r
+ IN CONST EFI_PEI_SERVICES **PeiServices,\r
IN EFI_MEMORY_TYPE MemoryType,\r
IN UINTN Pages,\r
OUT EFI_PHYSICAL_ADDRESS *Memory\r
Hob.HandoffInformationTable->EfiFreeMemoryTop -= Offset;\r
}\r
\r
+ ASSERT (Hob.HandoffInformationTable->EfiFreeMemoryTop >= Hob.HandoffInformationTable->EfiFreeMemoryBottom);\r
//\r
// Verify that there is sufficient memory to satisfy the allocation\r
//\r
//\r
BuildMemoryAllocationHob (\r
Hob.HandoffInformationTable->EfiFreeMemoryTop,\r
- Pages * EFI_PAGE_SIZE + Offset,\r
+ Pages * EFI_PAGE_SIZE,\r
MemoryType\r
);\r
\r
EFI_STATUS\r
EFIAPI\r
PeiAllocatePool (\r
- IN EFI_PEI_SERVICES **PeiServices,\r
+ IN CONST EFI_PEI_SERVICES **PeiServices,\r
IN UINTN Size,\r
OUT VOID **Buffer\r
)\r