}\r
\r
/**\r
- Save the volatile registers required to be restored following INIT IPI\r
+ Save the volatile registers required to be restored following INIT IPI.\r
\r
@param VolatileRegisters Returns buffer saved the volatile resisters\r
**/\r
}\r
\r
/**\r
- Restore the volatile registers following INIT IPI\r
+ Restore the volatile registers following INIT IPI.\r
\r
@param VolatileRegisters Pointer to volatile resisters\r
@param IsRestoreDr TRUE: Restore DRx if supported\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 curret executing AP\r
+ @param NumApsExecuting Number of current executing AP\r
**/\r
VOID\r
EFIAPI\r
// Execute AP function if AP is not disabled\r
//\r
GetProcessorNumber (PeiCpuMpData, &ProcessorNumber);\r
+ //\r
+ // Restore AP's volatile registers saved\r
+ //\r
+ RestoreVolatileRegisters (&PeiCpuMpData->CpuData[ProcessorNumber].VolatileRegisters, TRUE);\r
+\r
if ((PeiCpuMpData->CpuData[ProcessorNumber].State != CpuStateDisabled) &&\r
(PeiCpuMpData->ApFunction != 0)) {\r
PeiCpuMpData->CpuData[ProcessorNumber].State = CpuStateBusy;\r
Procedure = (EFI_AP_PROCEDURE)(UINTN)PeiCpuMpData->ApFunction;\r
+ //\r
+ // Invoke AP function here\r
+ //\r
Procedure ((VOID *)(UINTN)PeiCpuMpData->ApFunctionArgument);\r
PeiCpuMpData->CpuData[ProcessorNumber].State = CpuStateIdle;\r
}\r
//\r
InterlockedIncrement ((UINT32 *)&PeiCpuMpData->FinishedCount);\r
\r
+ //\r
+ // Save AP volatile registers\r
+ //\r
+ SaveVolatileRegisters (&PeiCpuMpData->CpuData[ProcessorNumber].VolatileRegisters);\r
+\r
AsmCliHltLoop ();\r
}\r
\r
EFI_PEI_HOB_POINTERS Hob;\r
EFI_HOB_MEMORY_ALLOCATION *MemoryHob;\r
\r
- DEBUG ((EFI_D_INFO, "CpuMpPei: CpuMpEndOfPeiCallback () invokded\n"));\r
+ DEBUG ((EFI_D_INFO, "CpuMpPei: CpuMpEndOfPeiCallback () invoked\n"));\r
\r
Status = PeiServicesGetBootMode (&BootMode);\r
ASSERT_EFI_ERROR (Status);\r