// The grammar should never arrive here\r
//\r
return FALSE;\r
- break;\r
}\r
}\r
}\r
// CAUTION: The new base is computed accounding to gap of new stack.\r
//\r
NewPermenentMemoryBase = Private->PhysicalMemoryBegin + StackGap;\r
+ \r
+ //\r
+ // Caculate stack offset and heap offset between CAR and new permement \r
+ // memory seperately.\r
+ //\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
+ //\r
+ // Caculate new HandOffTable and PrivateData address in permenet memory's stack\r
+ //\r
NewHandOffTable = (EFI_HOB_HANDOFF_INFO_TABLE *)((UINTN)OldHandOffTable + HeapOffset);\r
PrivateInMem = (PEI_CORE_INSTANCE *)((UINTN) (VOID*) Private + StackOffset);\r
\r
\r
\r
if (!EFI_ERROR (Status)) {\r
+ //\r
+ // Temporary Ram support Ppi is provided by platform, it will copy \r
+ // temporary memory to permenent memory and do stack switching.\r
+ // After invoken temporary Ram support, following code's stack is in \r
+ // memory but not in CAR.\r
+ //\r
TemporaryRamSupportPpi->TemporaryRamMigration (\r
(CONST EFI_PEI_SERVICES **) PeiServices,\r
(EFI_PHYSICAL_ADDRESS)(UINTN) SecCoreData->TemporaryRamBase,\r
//\r
// We need convert the PPI desciptor's pointer\r
//\r
- ConvertPpiPointers ((CONST EFI_PEI_SERVICES **)PeiServices, \r
+ ConvertPpiPointers (PrivateInMem, \r
OldCheckingBottom, \r
OldCheckingTop, \r
HeapOffset\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
\r
-Module Name:\r
-\r
- FwVol.c\r
-\r
-Abstract:\r
-\r
- \r
-\r
**/\r
\r
#include <PeiMain.h>\r
/**\r
Returns the highest bit set of the State field\r
\r
-\r
@param ErasePolarity Erase Polarity as defined by EFI_FVB2_ERASE_POLARITY\r
in the Attributes field.\r
@param FfsHeader Pointer to FFS File Header.\r
switch (FileState) {\r
\r
case EFI_FILE_HEADER_INVALID:\r
- FileOffset += sizeof(EFI_FFS_FILE_HEADER);\r
- FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + sizeof(EFI_FFS_FILE_HEADER));\r
+ FileOffset += sizeof(EFI_FFS_FILE_HEADER);\r
+ FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + sizeof(EFI_FFS_FILE_HEADER));\r
break;\r
\r
case EFI_FILE_DATA_VALID:\r
return EFI_NOT_FOUND;\r
}\r
\r
- FileLength = *(UINT32 *)(FfsFileHeader->Size) & 0x00FFFFFF;\r
+ FileLength = *(UINT32 *)(FfsFileHeader->Size) & 0x00FFFFFF;\r
FileOccupiedSize = GET_OCCUPIED_SIZE(FileLength, 8);\r
\r
if (FileName != NULL) {\r
return EFI_SUCCESS;\r
}\r
\r
- FileOffset += FileOccupiedSize; \r
- FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + FileOccupiedSize);\r
+ FileOffset += FileOccupiedSize; \r
+ FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + FileOccupiedSize);\r
break;\r
\r
case EFI_FILE_DELETED:\r
- FileLength = *(UINT32 *)(FfsFileHeader->Size) & 0x00FFFFFF;\r
- FileOccupiedSize = GET_OCCUPIED_SIZE(FileLength, 8);\r
- FileOffset += FileOccupiedSize;\r
- FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + FileOccupiedSize);\r
+ FileLength = *(UINT32 *)(FfsFileHeader->Size) & 0x00FFFFFF;\r
+ FileOccupiedSize = GET_OCCUPIED_SIZE(FileLength, 8);\r
+ FileOffset += FileOccupiedSize;\r
+ FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + FileOccupiedSize);\r
break;\r
\r
default:\r
}\r
\r
/**\r
-\r
Initialize PeiCore Fv List.\r
\r
-\r
@param PrivateData - Pointer to PEI_CORE_INSTANCE.\r
@param SecCoreData - Pointer to EFI_SEC_PEI_HAND_OFF.\r
-\r
- @return NONE\r
-\r
**/\r
VOID \r
PeiInitializeFv (\r
\r
Gets the pointer to the HOB List.\r
\r
-\r
@param PeiServices The PEI core services table.\r
@param HobList Pointer to the HOB List.\r
\r
)\r
{\r
PEI_CORE_INSTANCE *PrivateData;\r
-\r
\r
//\r
// Only check this parameter in debug mode\r
\r
*HobList = PrivateData->HobList.Raw;\r
\r
-\r
return EFI_SUCCESS; \r
}\r
\r
/**\r
Add a new HOB to the HOB List.\r
\r
- @param PeiServices - The PEI core services table.\r
- @param Type - Type of the new HOB.\r
- @param Length - Length of the new HOB to allocate.\r
- @param Hob - Pointer to the new HOB.\r
+ @param PeiServices The PEI core services table.\r
+ @param Type Type of the new HOB.\r
+ @param Length Length of the new HOB to allocate.\r
+ @param Hob Pointer to the new HOB.\r
\r
@return EFI_SUCCESS Success to create hob.\r
@retval EFI_INVALID_PARAMETER if Hob is NULL\r
HobEnd++;\r
HandOffHob->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS) (UINTN) HobEnd;\r
\r
-\r
return EFI_SUCCESS; \r
}\r
\r
-\r
/**\r
\r
Builds a Handoff Information Table HOB\r
EFI_HOB_HANDOFF_INFO_TABLE *Hob;\r
EFI_HOB_GENERIC_HEADER *HobEnd;\r
\r
- Hob = (VOID *)(UINTN)MemoryBegin;\r
- HobEnd = (EFI_HOB_GENERIC_HEADER*) (Hob+1);\r
- Hob->Header.HobType = EFI_HOB_TYPE_HANDOFF;\r
- Hob->Header.HobLength = sizeof(EFI_HOB_HANDOFF_INFO_TABLE);\r
- Hob->Header.Reserved = 0;\r
+ Hob = (VOID *)(UINTN)MemoryBegin;\r
+ HobEnd = (EFI_HOB_GENERIC_HEADER*) (Hob+1);\r
+ Hob->Header.HobType = EFI_HOB_TYPE_HANDOFF;\r
+ Hob->Header.HobLength = sizeof(EFI_HOB_HANDOFF_INFO_TABLE);\r
+ Hob->Header.Reserved = 0;\r
\r
- HobEnd->HobType = EFI_HOB_TYPE_END_OF_HOB_LIST;\r
- HobEnd->HobLength = sizeof(EFI_HOB_GENERIC_HEADER);\r
- HobEnd->Reserved = 0;\r
+ HobEnd->HobType = EFI_HOB_TYPE_END_OF_HOB_LIST;\r
+ HobEnd->HobLength = sizeof(EFI_HOB_GENERIC_HEADER);\r
+ HobEnd->Reserved = 0;\r
\r
Hob->Version = EFI_HOB_HANDOFF_TABLE_VERSION;\r
Hob->BootMode = BootMode;\r
Hob->EfiMemoryTop = MemoryBegin + MemoryLength;\r
Hob->EfiMemoryBottom = MemoryBegin;\r
Hob->EfiFreeMemoryTop = MemoryBegin + MemoryLength;\r
- Hob->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS) (UINTN) (HobEnd+1);\r
+ Hob->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS) (UINTN) (HobEnd + 1);\r
Hob->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS) (UINTN) HobEnd;\r
\r
return EFI_SUCCESS;\r
\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
+ //\r
if (OldCoreData == NULL) {\r
\r
PrivateData->PeiMemoryInstalled = FALSE;\r
FreeMemoryBottom = &(Hob.HandoffInformationTable->EfiFreeMemoryBottom);\r
}\r
\r
- \r
-\r
//\r
// Check to see if on 4k boundary\r
//\r
VOID *Raw;\r
} PEI_PPI_LIST_POINTERS;\r
\r
+///\r
+/// PPI database structure\r
+///\r
typedef struct {\r
INTN PpiListEnd;\r
INTN NotifyListEnd;\r
UINTN SectionIndex;\r
} CACHE_SECTION_DATA;\r
\r
-//\r
-// Pei Core private data structure instance\r
-//\r
\r
#define PEI_CORE_HANDLE_SIGNATURE EFI_SIGNATURE_32('P','e','i','C')\r
\r
+///\r
+/// Pei Core private data structure instance\r
+///\r
typedef struct{\r
UINTN Signature;\r
EFI_PEI_SERVICES *PS; // Point to ServiceTableShadow\r
CACHE_SECTION_DATA CacheSection;\r
} PEI_CORE_INSTANCE;\r
\r
-//\r
-// Pei Core Instance Data Macros\r
-//\r
-\r
+///\r
+/// Pei Core Instance Data Macros\r
+///\r
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \\r
CR(a, PEI_CORE_INSTANCE, PS, PEI_CORE_HANDLE_SIGNATURE)\r
\r
environment, such as the size and location of temporary RAM, the stack location and\r
the BFV location.\r
\r
- @return None.\r
-\r
**/\r
VOID\r
InitializeDispatcherData (\r
\r
Initialize PPI services.\r
\r
-\r
@param PrivateData Pointer to the PEI Core data.\r
@param OldCoreData Pointer to old PEI Core data. \r
NULL if being run in non-permament memory mode.\r
**/\r
VOID\r
ConvertPpiPointers (\r
- IN CONST EFI_PEI_SERVICES **PeiServices,\r
- IN UINTN OldCheckingBottom,\r
- IN UINTN OldCheckingTop,\r
- IN UINTN Fixup\r
+ IN PEI_CORE_INSTANCE *PrivateData,\r
+ IN UINTN OldCheckingBottom,\r
+ IN UINTN OldCheckingTop,\r
+ IN INTN Fixup\r
)\r
;\r
\r
\r
Initialize the security services.\r
\r
-\r
- @param PeiServices - The PEI core services table.\r
- @param OldCoreData - Pointer to the old core data.\r
+ @param PeiServices The PEI core services table.\r
+ @param OldCoreData Pointer to the old core data.\r
NULL if being run in non-permament memory mode.\r
\r
**/\r
/**\r
Verify a Firmware volume\r
\r
- @param CurrentFvAddress - Pointer to the current Firmware Volume under consideration\r
+ @param CurrentFvAddress Pointer to the current Firmware Volume under consideration\r
\r
- @retval EFI_SUCCESS - Firmware Volume is legal\r
- @retval EFI_SECURITY_VIOLATION - Firmware Volume fails integrity test\r
+ @retval EFI_SUCCESS Firmware Volume is legal\r
+ @retval EFI_SECURITY_VIOLATION Firmware Volume fails integrity test\r
\r
**/\r
EFI_STATUS\r
gEfiPeiStatusCodePpiGuid # PPI SOMETIMES_CONSUMED\r
gEfiPeiResetPpiGuid # PPI SOMETIMES_CONSUMED\r
gEfiDxeIplPpiGuid # PPI ALWAYS_CONSUMED\r
- gEfiPeiMemoryDiscoveredPpiGuid # PPI ALWAYS_PRODUCED\r
- gEfiPeiDecompressPpiGuid\r
- gEfiPeiFirmwareVolumeInfoPpiGuid\r
- gEfiPeiLoadFilePpiGuid\r
- gEfiPeiSecurity2PpiGuid\r
- gEfiTemporaryRamSupportPpiGuid\r
+ gEfiPeiMemoryDiscoveredPpiGuid # PPI ALWAYS_CONSUMED\r
+ gEfiPeiDecompressPpiGuid # PPI ALWAYS_CONSUMED\r
+ gEfiPeiFirmwareVolumeInfoPpiGuid # PPI ALWAYS_CONSUMED\r
+ gEfiPeiLoadFilePpiGuid # PPI ALWAYS_CONSUMED\r
+ gEfiPeiSecurity2PpiGuid # PPI ALWAYS_CONSUMED\r
+ gEfiTemporaryRamSupportPpiGuid # PPI ALWAYS_CONSUMED\r
\r
[FixedPcd.common]\r
gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxFvSupported\r
gEfiMdePkgTokenSpaceGuid.PcdStatusCodeValuePeiCoreEntry\r
gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxPeiStackSize\r
\r
-\r
[FeaturePcd.common]\r
gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreImageLoaderSearchTeSectionFirst\r
\r
NULL\r
};\r
\r
-//\r
-// Pei Core Module Variables\r
-//\r
-//\r
+///\r
+/// Pei Core Module Variables\r
+///\r
+///\r
STATIC EFI_PEI_SERVICES gPs = {\r
{\r
PEI_SERVICES_SIGNATURE,\r
mTick = 0;\r
OldCoreData = (PEI_CORE_INSTANCE *) Data;\r
\r
+ //\r
+ // Record the system tick for first entering PeiCore.\r
+ // This tick is duration of executing platform seccore module.\r
+ // \r
if (PerformanceMeasurementEnabled()) {\r
if (OldCoreData == NULL) {\r
mTick = GetPerformanceCounter ();\r
}\r
}\r
\r
+ //\r
+ // PeiCore has been shadowed to memory for first entering, so\r
+ // just jump to PeiCore in memory here.\r
+ //\r
if (OldCoreData != NULL) {\r
ShadowedPeiCore = (PEI_CORE_ENTRY_POINT) (UINTN) OldCoreData->ShadowedPeiCore;\r
if (ShadowedPeiCore != NULL) {\r
\r
//\r
// Initialize libraries that the PeiCore is linked against\r
- // BUGBUG: The FileHandle is passed in as NULL. Do we look it up or remove it from the lib init?\r
//\r
ProcessLibraryConstructorList (NULL, &PrivateData.PS);\r
\r
//\r
ASSERT(PrivateData.PeiMemoryInstalled == TRUE);\r
\r
+ //\r
+ // Till now, PEI phase will be finished, get performace count\r
+ // for computing duration of PEI phase\r
+ //\r
PERF_END (NULL, "PostMem", NULL, 0);\r
\r
Status = PeiServicesLocatePpi (\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
+ //\r
+ // Enter DxeIpl to load Dxe core.\r
+ //\r
DEBUG ((EFI_D_INFO, "DXE IPL Entry\n"));\r
Status = TempPtr.DxeIpl->Entry (\r
TempPtr.DxeIpl,\r
\r
Initialize PPI services.\r
\r
-\r
@param PrivateData Pointer to the PEI Core data.\r
@param OldCoreData Pointer to old PEI Core data. \r
NULL if being run in non-permament memory mode.\r
**/\r
VOID\r
ConvertPpiPointers (\r
- IN CONST EFI_PEI_SERVICES **PeiServices,\r
- IN UINTN OldCheckingBottom,\r
- IN UINTN OldCheckingTop,\r
- IN UINTN Fixup\r
+ IN PEI_CORE_INSTANCE *PrivateData,\r
+ IN UINTN OldCheckingBottom,\r
+ IN UINTN OldCheckingTop,\r
+ IN INTN Fixup\r
)\r
{\r
- PEI_CORE_INSTANCE *PrivateData;\r
UINT8 Index;\r
PEI_PPI_LIST_POINTERS *PpiPointer;\r
\r
- PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS(PeiServices);\r
-\r
for (Index = 0; Index < FixedPcdGet32 (PcdPeiCoreMaxPpiSupported); Index++) {\r
if (Index < PrivateData->PpiData.PpiListEnd ||\r
Index > PrivateData->PpiData.NotifyListEnd) {\r
\r
Install a notification for a given PPI.\r
\r
-\r
@param PeiServices - Pointer to the PEI Service Table\r
@param NotifyList - Pointer to list of Descriptors to notify upon.\r
\r
PrivateData->PpiData.NotifyListEnd\r
);\r
\r
-\r
return EFI_SUCCESS;\r
}\r
\r
}\r
}\r
}\r
-\r
- return;\r
}\r
\r
};\r
\r
/**\r
-\r
Initialize the security services.\r
\r
-\r
- @param PeiServices - The PEI core services table.\r
- @param OldCoreData - Pointer to the old core data.\r
+ @param PeiServices The PEI core services table.\r
+ @param OldCoreData Pointer to the old core data.\r
NULL if being run in non-permament memory mode.\r
\r
**/\r
{\r
EFI_STATUS Status;\r
EFI_PEI_PROGRESS_CODE_PPI *StatusCodePpi;\r
- \r
\r
//\r
- //Locate StatusCode Ppi.\r
+ // Locate StatusCode Ppi.\r
//\r
Status = PeiServicesLocatePpi (\r
&gEfiPeiStatusCodePpiGuid, \r