-/*++\r
+/** @file\r
\r
Copyright (c) 2006, Intel Corporation\r
All rights reserved. This program and the accompanying materials\r
\r
Revision History\r
\r
---*/\r
+**/\r
\r
#include <PeiMain.h>\r
\r
+//\r
+//CAR is filled with this initial value during SEC phase\r
+//\r
+#define INIT_CAR_VALUE 0x5AA55AA5\r
+\r
typedef struct {\r
EFI_STATUS_CODE_DATA DataHeader;\r
EFI_HANDLE Handle;\r
UINT32 Index2;\r
EFI_PEI_SERVICES **PeiServices;\r
EFI_PEI_FV_HANDLE VolumeHandle;\r
- //EFI_PHYSICAL_ADDRESS PeiCoreFileHandle;\r
EFI_PEI_FILE_HANDLE PeimFileHandle;\r
UINTN FvCount;\r
UINTN PeimCount;\r
TEMPORARY_RAM_SUPPORT_PPI *TemporaryRamSupportPpi;\r
EFI_HOB_HANDOFF_INFO_TABLE *OldHandOffTable;\r
EFI_HOB_HANDOFF_INFO_TABLE *NewHandOffTable;\r
- INTN Offset;\r
+ INTN StackOffset;\r
+ INTN HeapOffset;\r
PEI_CORE_INSTANCE *PrivateInMem;\r
UINT64 NewPeiStackSize;\r
UINT64 OldPeiStackSize;\r
}\r
\r
if (Private->SwitchStackSignal) {\r
-\r
+ //\r
+ // Before switch stack from CAR to permenent memory, caculate the heap and stack\r
+ // usage in temporary memory for debuging.\r
+ //\r
+ DEBUG_CODE_BEGIN ();\r
+ UINT32 *StackPointer;\r
+ \r
+ for (StackPointer = (UINT32*)SecCoreData->StackBase;\r
+ (StackPointer < (UINT32*)((UINTN)SecCoreData->StackBase + SecCoreData->StackSize)) \\r
+ && (*StackPointer == INIT_CAR_VALUE);\r
+ StackPointer ++);\r
+ \r
+ DEBUG ((EFI_D_INFO, "Total Cache as RAM: %d bytes.\n", SecCoreData->TemporaryRamSize));\r
+ DEBUG ((EFI_D_INFO, " CAR stack ever used: %d bytes.\n",\r
+ (SecCoreData->StackSize - ((UINTN) StackPointer - (UINTN)SecCoreData->StackBase))\r
+ ));\r
+ DEBUG ((EFI_D_INFO, " CAR heap used: %d bytes.\n",\r
+ ((UINTN) Private->HobList.HandoffInformationTable->EfiFreeMemoryBottom -\r
+ (UINTN) Private->HobList.Raw)\r
+ ));\r
+ DEBUG_CODE_END ();\r
+ \r
//\r
// Reserve the size of new stack at bottom of physical memory\r
//\r
// CAUTION: The new base is computed accounding to gap of new stack.\r
//\r
NewPermenentMemoryBase = Private->PhysicalMemoryBegin + StackGap;\r
- Offset = (UINTN) NewPermenentMemoryBase - (UINTN) SecCoreData->TemporaryRamBase;\r
- NewHandOffTable = (EFI_HOB_HANDOFF_INFO_TABLE *)((UINTN)OldHandOffTable + Offset);\r
- PrivateInMem = (PEI_CORE_INSTANCE *)((UINTN) (VOID*) Private + Offset);\r
+ StackOffset = (UINTN) NewPermenentMemoryBase - (UINTN) SecCoreData->StackBase;\r
+ HeapOffset = (INTN) ((UINTN) Private->PhysicalMemoryBegin + Private->StackSize - \\r
+ (UINTN) SecCoreData->PeiTemporaryRamBase);\r
+ DEBUG ((EFI_D_INFO, "Heap Offset = 0x%X Stack Offset = 0x%X\n", HeapOffset, StackOffset));\r
+ \r
+ NewHandOffTable = (EFI_HOB_HANDOFF_INFO_TABLE *)((UINTN)OldHandOffTable + HeapOffset);\r
+ PrivateInMem = (PEI_CORE_INSTANCE *)((UINTN) (VOID*) Private + StackOffset);\r
\r
//\r
// TemporaryRamSupportPpi is produced by platform's SEC\r
);\r
\r
} else {\r
- CopyMem (\r
- (VOID*)(UINTN) NewPermenentMemoryBase,\r
- SecCoreData->TemporaryRamBase,\r
- SecCoreData->TemporaryRamSize\r
- );\r
+ //\r
+ // In IA32/x64/Itanium architecture, we need platform provide\r
+ // TEMPORAY_RAM_MIGRATION_PPI.\r
+ //\r
+ ASSERT (FALSE);\r
}\r
\r
\r
//\r
PrivateInMem->PS = &PrivateInMem->ServiceTableShadow;\r
PrivateInMem->CpuIo = &PrivateInMem->ServiceTableShadow.CpuIo;\r
- PrivateInMem->HobList.Raw = (VOID*) ((UINTN) PrivateInMem->HobList.Raw + Offset);\r
+ PrivateInMem->HobList.Raw = (VOID*) ((UINTN) PrivateInMem->HobList.Raw + HeapOffset);\r
PrivateInMem->StackBase = (EFI_PHYSICAL_ADDRESS)(((UINTN)PrivateInMem->PhysicalMemoryBegin + EFI_PAGE_MASK) & ~EFI_PAGE_MASK);\r
\r
PeiServices = &PrivateInMem->PS;\r
// Update HandOffHob for new installed permenent memory\r
//\r
NewHandOffTable->EfiEndOfHobList =\r
- (EFI_PHYSICAL_ADDRESS)(VOID*)((UINTN) NewHandOffTable->EfiEndOfHobList + Offset);\r
+ (EFI_PHYSICAL_ADDRESS)((UINTN) NewHandOffTable->EfiEndOfHobList + HeapOffset);\r
NewHandOffTable->EfiMemoryTop = PrivateInMem->PhysicalMemoryBegin +\r
PrivateInMem->PhysicalMemoryLength;\r
NewHandOffTable->EfiMemoryBottom = PrivateInMem->PhysicalMemoryBegin;\r
PrivateInMem->PeiMemoryInstalled = TRUE;\r
\r
//\r
- // Make sure we don't retry the same PEIM that added memory\r
+ // Restart scan of all PEIMs on next pass\r
//\r
- PrivateInMem->CurrentPeimCount++;\r
+ PrivateInMem->CurrentPeimCount = 0;\r
\r
//\r
// Shadow PEI Core. When permanent memory is avaiable, shadow\r
// PEI Core and PEIMs to get high performance.\r
//\r
- //PeiCoreFileHandle = 0;\r
- //\r
- // Find the PEI Core in the BFV\r
- //\r
- //Status = PeiFindFileEx (\r
- // (EFI_PEI_FV_HANDLE)PrivateInMem->Fv[0].FvHeader,\r
- // NULL,\r
- // EFI_FV_FILETYPE_PEI_CORE,\r
- // (EFI_PEI_FILE_HANDLE*)&PeiCoreFileHandle,\r
- // NULL\r
- // );\r
- //ASSERT_EFI_ERROR (Status);\r
-\r
- //\r
- // Shadow PEI Core into memory so it will run faster\r
- //\r
- //Status = PeiLoadImage (\r
- // PeiServices,\r
- // *((EFI_PEI_FILE_HANDLE*)&PeiCoreFileHandle),\r
- // &EntryPoint,\r
- // &AuthenticationState\r
- // );\r
- //ASSERT_EFI_ERROR (Status);\r
-\r
- //PrivateInMem->ShadowedPeiCore = (VOID*) ((UINTN) EntryPoint +\r
- // (UINTN) PeiCore -\r
- // (UINTN) _ModuleEntryPoint);\r
PrivateInMem->ShadowedPeiCore = ShadowPeiCore (\r
PeiServices,\r
PrivateInMem\r
//\r
PeiCore (SecCoreData, NULL, PrivateInMem);\r
\r
- //((PEI_CORE_ENTRY_POINT) (UINTN) PrivateInMem->ShadowedPeiCore) (\r
- // SecCoreData,\r
- // NULL,\r
- // PrivateInMem\r
- // );\r
-\r
//\r
// Code should not come here\r
//\r