return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Resets the Application Processor and directs it to jump to the\r
+ specified routine.\r
+\r
+ The processor jumps to this code in flat mode, but the processor's\r
+ stack is not initialized.\r
+\r
+ @param ProcessorId the AP of ProcessorId was reset\r
+**/\r
+VOID\r
+ResetApStackless (\r
+ IN UINT32 ProcessorId\r
+ )\r
+{\r
+ SendInitSipiSipi (ProcessorId,\r
+ (UINT32)(UINTN)(VOID*) StartupCode);\r
+}\r
VOID *mTopOfApCommonStack = 0;\r
VOID *mApStackStart = 0;\r
\r
+BOOLEAN mAPsAlreadyInitFinished = FALSE;\r
volatile BOOLEAN mStopCheckAllAPsStatus = TRUE;\r
\r
EFI_MP_SERVICES_PROTOCOL mMpServicesTemplate = {\r
IN CPU_DATA_BLOCK *CpuData\r
)\r
{\r
+ ResetApStackless ((UINT32)CpuData->Info.ProcessorId);\r
}\r
\r
/**\r
\r
AsmApDoneWithCommonStack ();\r
\r
+ //\r
+ // Avoid forcibly reset AP caused the AP State is not updated.\r
+ //\r
+ GetMpSpinLock (CpuData);\r
+ CpuData->State = CpuStateIdle;\r
+ CpuData->Procedure = NULL;\r
+ ReleaseMpSpinLock (CpuData);\r
+\r
while (TRUE) {\r
GetMpSpinLock (CpuData);\r
ProcedureArgument = CpuData->Parameter;\r
VOID\r
)\r
{\r
- VOID* TopOfApStack;\r
+ VOID* TopOfApStack;\r
+ UINTN ProcessorNumber;\r
\r
- FillInProcessorInformation (FALSE, mMpSystemData.NumberOfProcessors);\r
- TopOfApStack = (UINT8*)mApStackStart + gApStackSize;\r
- mApStackStart = TopOfApStack;\r
+ if (!mAPsAlreadyInitFinished) {\r
+ FillInProcessorInformation (FALSE, mMpSystemData.NumberOfProcessors);\r
+ TopOfApStack = (UINT8*)mApStackStart + gApStackSize;\r
+ mApStackStart = TopOfApStack;\r
\r
- mMpSystemData.NumberOfProcessors++;\r
+ //\r
+ // Store the Stack address, when reset the AP, We can found the original address.\r
+ //\r
+ mMpSystemData.CpuDatas[mMpSystemData.NumberOfProcessors].TopOfStack = TopOfApStack;\r
+ mMpSystemData.NumberOfProcessors++;\r
+ mMpSystemData.NumberOfEnabledProcessors++;\r
+ } else {\r
+ WhoAmI (&mMpServicesTemplate, &ProcessorNumber);\r
+ //\r
+ // Get the original stack address.\r
+ //\r
+ TopOfApStack = mMpSystemData.CpuDatas[ProcessorNumber].TopOfStack;\r
+ }\r
\r
SwitchStack (\r
(SWITCH_STACK_ENTRY_POINT)(UINTN)ProcessorToIdleState,\r
return;\r
}\r
\r
+ mAPsAlreadyInitFinished = TRUE;\r
+\r
if (mMpSystemData.NumberOfProcessors < gMaxLogicalProcessorNumber) {\r
FreePages (mApStackStart, EFI_SIZE_TO_PAGES (\r
(gMaxLogicalProcessorNumber - mMpSystemData.NumberOfProcessors) *\r