PEI_CORE_INSTANCE PrivateData;\r
EFI_STATUS Status;\r
PEI_CORE_TEMP_POINTERS TempPtr;\r
- UINT64 Tick;\r
PEI_CORE_INSTANCE *OldCoreData;\r
EFI_PEI_CPU_IO_PPI *CpuIo;\r
EFI_PEI_PCI_CFG2_PPI *PciCfg;\r
EFI_HOB_HANDOFF_INFO_TABLE *HandoffInformationTable;\r
\r
- Tick = 0;\r
+ //\r
+ // Retrieve context passed into PEI Core\r
+ //\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
- Tick = GetPerformanceCounter ();\r
- }\r
- }\r
-\r
- if (OldCoreData != NULL) {\r
+ // Perform PEI Core phase specific actions.\r
+ //\r
+ if (OldCoreData == NULL) {\r
+ //\r
+ // If OldCoreData is NULL, means current is the first entry into the PEI Core before memory is available.\r
+ //\r
+ ZeroMem (&PrivateData, sizeof (PEI_CORE_INSTANCE));\r
+ PrivateData.Signature = PEI_CORE_HANDLE_SIGNATURE;\r
+ CopyMem (&PrivateData.ServiceTableShadow, &gPs, sizeof (gPs));\r
+ } else {\r
+ //\r
+ // Memory is available to the PEI Core. See if the PEI Core has been shadowed to memory yet.\r
+ //\r
if (OldCoreData->ShadowedPeiCore == NULL) {\r
- //\r
//\r
// Fixup the PeiCore's private data\r
//\r
- OldCoreData->Ps = &OldCoreData->ServiceTableShadow;\r
- OldCoreData->CpuIo = &OldCoreData->ServiceTableShadow.CpuIo;\r
+ OldCoreData->Ps = &OldCoreData->ServiceTableShadow;\r
+ OldCoreData->CpuIo = &OldCoreData->ServiceTableShadow.CpuIo;\r
if (OldCoreData->HeapOffsetPositive) {\r
OldCoreData->HobList.Raw = (VOID *)(OldCoreData->HobList.Raw + OldCoreData->HeapOffset);\r
} else {\r
OldCoreData->HobList.Raw = (VOID *)(OldCoreData->HobList.Raw - OldCoreData->HeapOffset);\r
}\r
\r
+ //\r
+ // Initialize libraries that the PEI Core is linked against\r
+ //\r
+ ProcessLibraryConstructorList (NULL, (CONST EFI_PEI_SERVICES **)&OldCoreData->Ps);\r
+ \r
//\r
// Fixup for PeiService's address\r
//\r
OldCoreData->PeiCodeMemoryRangeUsageBitMap = AllocateZeroPool (((PcdGet32(PcdLoadFixAddressPeiCodePageNumber)>>6) + 1)*sizeof(UINT64));\r
}\r
\r
- //\r
- // Process the Notify list and dispatch any notifies for\r
- // newly installed PPIs.\r
- //\r
- ProcessNotifyList (OldCoreData);\r
-\r
//\r
// Shadow PEI Core. When permanent memory is avaiable, shadow\r
// PEI Core and PEIMs to get high performance.\r
OldCoreData->ShadowedPeiCore = ShadowPeiCore (OldCoreData);\r
\r
//\r
- // PeiCore has been shadowed to memory for first entering, so\r
- // just jump to PeiCore in memory here.\r
+ // PEI Core has now been shadowed to memory. Restart PEI Core in memory.\r
//\r
OldCoreData->ShadowedPeiCore (SecCoreData, PpiList, OldCoreData);\r
+ \r
+ //\r
+ // Should never reach here.\r
+ //\r
+ ASSERT (FALSE);\r
+ CpuDeadLoop();\r
}\r
\r
+ //\r
+ // Memory is available to the PEI Core and the PEI Core has been shadowed to memory.\r
+ //\r
+ \r
CopyMem (&PrivateData, OldCoreData, sizeof (PrivateData));\r
\r
CpuIo = (VOID*)PrivateData.ServiceTableShadow.CpuIo;\r
\r
PrivateData.ServiceTableShadow.CpuIo = CpuIo;\r
PrivateData.ServiceTableShadow.PciCfg = PciCfg;\r
- } else {\r
- //\r
- // If OldCoreData is NULL, means current is first Peicore's entering.\r
- //\r
- \r
- ZeroMem (&PrivateData, sizeof (PEI_CORE_INSTANCE));\r
- PrivateData.Signature = PEI_CORE_HANDLE_SIGNATURE;\r
- CopyMem (&PrivateData.ServiceTableShadow, &gPs, sizeof (gPs));\r
}\r
-\r
+ \r
+ //\r
+ // Cache a pointer to the PEI Services Table that is either in temporary memory or permanent memory\r
+ //\r
PrivateData.Ps = &PrivateData.ServiceTableShadow;\r
\r
//\r
- // Initialize libraries that the PeiCore is linked against\r
+ // Initialize libraries that the PEI Core is linked against\r
//\r
ProcessLibraryConstructorList (NULL, (CONST EFI_PEI_SERVICES **)&PrivateData.Ps);\r
\r
- InitializeMemoryServices (&PrivateData, SecCoreData, OldCoreData);\r
-\r
- InitializePpiServices (&PrivateData, OldCoreData);\r
-\r
//\r
// Save PeiServicePointer so that it can be retrieved anywhere.\r
//\r
- SetPeiServicesTablePointer((CONST EFI_PEI_SERVICES **) &PrivateData.Ps);\r
- \r
- if (OldCoreData != NULL) {\r
+ SetPeiServicesTablePointer ((CONST EFI_PEI_SERVICES **)&PrivateData.Ps);\r
\r
- PERF_END (NULL,"PreMem", NULL, 0);\r
- PERF_START (NULL,"PostMem", NULL, 0);\r
+ //\r
+ // Initialize PEI Core Services\r
+ // \r
+ InitializeMemoryServices (&PrivateData, SecCoreData, OldCoreData);\r
+ InitializePpiServices (&PrivateData, OldCoreData);\r
+ \r
+ //\r
+ // Update performance measurements \r
+ //\r
+ if (OldCoreData == NULL) {\r
+ PERF_START (NULL, "SEC", NULL, 1);\r
+ PERF_END (NULL, "SEC", NULL, 0);\r
\r
//\r
- // Alert any listeners that there is permanent memory available\r
+ // If first pass, start performance measurement.\r
//\r
- \r
- PERF_START (NULL,"DisMem", NULL, 0);\r
- Status = PeiServicesInstallPpi (&mMemoryDiscoveredPpi);\r
- PERF_END (NULL,"DisMem", NULL, 0);\r
+ PERF_START (NULL,"PEI", NULL, 0);\r
+ PERF_START (NULL,"PreMem", NULL, 0);\r
\r
} else {\r
+ PERF_END (NULL,"PreMem", NULL, 0);\r
+ PERF_START (NULL,"PostMem", NULL, 0);\r
+ }\r
+\r
+ //\r
+ // Complete PEI Core Service initialization\r
+ // \r
+ InitializeSecurityServices (&PrivateData.Ps, OldCoreData);\r
+ InitializeDispatcherData (&PrivateData, OldCoreData, SecCoreData);\r
+ InitializeImageServices (&PrivateData, OldCoreData);\r
\r
+ //\r
+ // Perform PEI Core Phase specific actions\r
+ // \r
+ if (OldCoreData == NULL) {\r
//\r
// Report Status Code EFI_SW_PC_INIT\r
//\r
(EFI_SOFTWARE_PEI_CORE | EFI_SW_PC_INIT)\r
);\r
\r
- PERF_START (NULL, "SEC", NULL, 1);\r
- PERF_END (NULL, "SEC", NULL, Tick);\r
-\r
- PERF_START (NULL,"PEI", NULL, Tick);\r
- //\r
- // If first pass, start performance measurement.\r
- //\r
- PERF_START (NULL,"PreMem", NULL, Tick);\r
-\r
//\r
// If SEC provided any PPI services to PEI, install them.\r
//\r
Status = PeiServicesInstallPpi (PpiList);\r
ASSERT_EFI_ERROR (Status);\r
}\r
- }\r
-\r
- InitializeSecurityServices (&PrivateData.Ps, OldCoreData);\r
+ } else {\r
+ //\r
+ // Alert any listeners that there is permanent memory available\r
+ //\r
+ PERF_START (NULL,"DisMem", NULL, 0);\r
+ Status = PeiServicesInstallPpi (&mMemoryDiscoveredPpi);\r
\r
- InitializeDispatcherData (&PrivateData, OldCoreData, SecCoreData);\r
+ //\r
+ // Process the Notify list and dispatch any notifies for the Memory Discovered PPI\r
+ //\r
+ ProcessNotifyList (&PrivateData);\r
\r
- //\r
- // Install Pei Load File PPI. \r
- //\r
- InitializeImageServices (&PrivateData, OldCoreData);\r
+ PERF_END (NULL,"DisMem", NULL, 0);\r
+ }\r
\r
//\r
// Call PEIM dispatcher\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
+ // Measure PEI Core execution time.\r
//\r
PERF_END (NULL, "PostMem", NULL, 0);\r
\r
+ //\r
+ // Lookup DXE IPL PPI\r
+ //\r
Status = PeiServicesLocatePpi (\r
&gEfiDxeIplPpiGuid,\r
0,\r
ASSERT_EFI_ERROR (Status);\r
CpuDeadLoop();\r
}\r
-\r
-\r