\r
@param PeiCpuMpData Pointer to PEI CPU MP Data\r
**/\r
+STATIC\r
VOID\r
SortApicId (\r
IN PEI_CPU_MP_DATA *PeiCpuMpData\r
\r
@param Buffer Pointer to private data buffer.\r
**/\r
+STATIC\r
VOID\r
EFIAPI\r
ApFuncEnableX2Apic (\r
\r
@return The AP loop mode.\r
**/\r
+STATIC\r
UINT8\r
GetApLoopMode (\r
OUT UINT16 *MonitorFilterSize\r
\r
@param VolatileRegisters Returns buffer saved the volatile resisters\r
**/\r
+STATIC\r
VOID\r
SaveVolatileRegisters (\r
OUT CPU_VOLATILE_REGISTERS *VolatileRegisters\r
@param IsRestoreDr TRUE: Restore DRx if supported\r
FALSE: Do not restore DRx\r
**/\r
+STATIC\r
VOID\r
RestoreVolatileRegisters (\r
IN CPU_VOLATILE_REGISTERS *VolatileRegisters,\r
}\r
}\r
\r
+/**\r
+ Find the current Processor number by APIC ID.\r
+\r
+ @param PeiCpuMpData Pointer to PEI CPU MP Data\r
+ @param ProcessorNumber Return the pocessor number found\r
+\r
+ @retval EFI_SUCCESS ProcessorNumber is found and returned.\r
+ @retval EFI_NOT_FOUND ProcessorNumber is not found.\r
+**/\r
+STATIC\r
+EFI_STATUS\r
+GetProcessorNumber (\r
+ IN PEI_CPU_MP_DATA *PeiCpuMpData,\r
+ OUT UINTN *ProcessorNumber\r
+ )\r
+{\r
+ UINTN TotalProcessorNumber;\r
+ UINTN Index;\r
+\r
+ TotalProcessorNumber = PeiCpuMpData->CpuCount;\r
+ for (Index = 0; Index < TotalProcessorNumber; Index ++) {\r
+ if (PeiCpuMpData->CpuData[Index].ApicId == GetInitialApicId ()) {\r
+ *ProcessorNumber = Index;\r
+ return EFI_SUCCESS;\r
+ }\r
+ }\r
+ return EFI_NOT_FOUND;\r
+}\r
+\r
/**\r
This function will be called from AP reset code if BSP uses WakeUpAP.\r
\r
@param ExchangeInfo Pointer to the MP exchange info buffer\r
@param NumApsExecuting Number of current executing AP\r
**/\r
+STATIC\r
VOID\r
EFIAPI\r
ApCFunction (\r
@param Procedure The function to be invoked by AP\r
@param ProcedureArgument The argument to be passed into AP function\r
**/\r
+STATIC\r
VOID\r
WakeUpAP (\r
IN PEI_CPU_MP_DATA *PeiCpuMpData,\r
@retval other Return wakeup buffer address below 1MB.\r
@retval -1 Cannot find free memory below 1MB.\r
**/\r
+STATIC\r
UINTN\r
GetWakeupBuffer (\r
IN UINTN WakeupBufferSize\r
\r
@param PeiCpuMpData Pointer to PEI CPU MP Data\r
**/\r
+STATIC\r
VOID\r
BackupAndPrepareWakeupBuffer(\r
IN PEI_CPU_MP_DATA *PeiCpuMpData\r
\r
@param PeiCpuMpData Pointer to PEI CPU MP Data\r
**/\r
+STATIC\r
VOID\r
RestoreWakeupBuffer(\r
IN PEI_CPU_MP_DATA *PeiCpuMpData\r
@retval EFI_SUCCESS When everything is OK.\r
\r
**/\r
+STATIC\r
EFI_STATUS\r
EFIAPI\r
CpuMpEndOfPeiCallback (\r
IN CONST EFI_PEI_SERVICES **PeiServices\r
)\r
{\r
- EFI_STATUS Status;\r
- PEI_CPU_MP_DATA *PeiCpuMpData;\r
+ EFI_STATUS Status;\r
EFI_VECTOR_HANDOFF_INFO *VectorInfo;\r
EFI_PEI_VECTOR_HANDOFF_INFO_PPI *VectorHandoffInfoPpi;\r
\r
}\r
Status = InitializeCpuExceptionHandlers (VectorInfo);\r
ASSERT_EFI_ERROR (Status);\r
+ \r
//\r
- // Get wakeup buffer and copy AP reset code in it\r
- //\r
- PeiCpuMpData = PrepareAPStartupVector ();\r
- //\r
- // Count processor number and collect processor information\r
- //\r
- CountProcessorNumber (PeiCpuMpData);\r
- //\r
- // Build location of PEI CPU MP DATA buffer in HOB\r
+ // Wakeup APs to do initialization\r
//\r
- BuildGuidDataHob (\r
- &gEfiCallerIdGuid,\r
- (VOID *)&PeiCpuMpData,\r
- sizeof(UINT64)\r
- );\r
+ Status = MpInitLibInitialize ();\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
//\r
// Update and publish CPU BIST information\r
//\r
- CollectBistDataFromPpi (PeiServices, PeiCpuMpData);\r
- //\r
- // register an event for EndOfPei\r
- //\r
- Status = PeiServicesNotifyPpi (&mNotifyList);\r
- ASSERT_EFI_ERROR (Status);\r
+ CollectBistDataFromPpi (PeiServices);\r
+\r
//\r
// Install CPU MP PPI\r
//\r