VOID *mTopOfApCommonStack = 0;\r
VOID *mApStackStart = 0;\r
\r
+volatile BOOLEAN mStopCheckAllAPsStatus = TRUE;\r
+\r
EFI_MP_SERVICES_PROTOCOL mMpServicesTemplate = {\r
GetNumberOfProcessors,\r
GetProcessorInfo,\r
}\r
}\r
\r
+ //\r
+ // temporarily stop checkAllAPsStatus for initialize parameters.\r
+ //\r
+ mStopCheckAllAPsStatus = TRUE;\r
+\r
mMpSystemData.Procedure = Procedure;\r
mMpSystemData.ProcedureArgument = ProcedureArgument;\r
mMpSystemData.WaitEvent = WaitEvent;\r
}\r
}\r
\r
+ mStopCheckAllAPsStatus = FALSE;\r
+\r
if (WaitEvent != NULL) {\r
- Status = gBS->SetTimer (\r
- mMpSystemData.CheckAllAPsEvent,\r
- TimerPeriodic,\r
- EFI_TIMER_PERIOD_MICROSECONDS (100)\r
- );\r
- return Status;\r
+ //\r
+ // non blocking\r
+ //\r
+ return EFI_SUCCESS;\r
}\r
\r
while (TRUE) {\r
)\r
{\r
CPU_DATA_BLOCK *CpuData;\r
- EFI_STATUS Status;\r
\r
CpuData = NULL;\r
\r
return EFI_NOT_READY;\r
}\r
\r
+ //\r
+ // temporarily stop checkAllAPsStatus for initialize parameters.\r
+ //\r
+ mStopCheckAllAPsStatus = TRUE;\r
+\r
SetApState (CpuData, CpuStateReady);\r
\r
SetApProcedure (CpuData, Procedure, ProcedureArgument);\r
CpuData->TimeoutActive = !!(TimeoutInMicroseconds);\r
CpuData->Finished = Finished;\r
\r
+ mStopCheckAllAPsStatus = FALSE;\r
+\r
if (WaitEvent != NULL) {\r
//\r
// Non Blocking\r
//\r
- Status = gBS->SetTimer (\r
- CpuData->CheckThisAPEvent,\r
- TimerPeriodic,\r
- EFI_TIMER_PERIOD_MICROSECONDS (100)\r
- );\r
- return Status;\r
+ return EFI_SUCCESS;\r
}\r
\r
//\r
return;\r
\r
out:\r
- gBS->SetTimer (CpuData->CheckThisAPEvent, TimerCancel, 0);\r
- if (CpuData->WaitEvent) {\r
- gBS->SignalEvent (CpuData->WaitEvent);\r
- CpuData->WaitEvent = NULL;\r
- }\r
+ CpuData->TimeoutActive = FALSE;\r
+ gBS->SignalEvent (CpuData->WaitEvent);\r
+ CpuData->WaitEvent = NULL;\r
}\r
\r
/**\r
IN VOID *Context\r
)\r
{\r
+ CPU_DATA_BLOCK *CpuData;\r
+ UINTN Number;\r
+\r
if (mMpSystemData.TimeoutActive) {\r
mMpSystemData.Timeout -= gPollInterval;\r
}\r
\r
- CheckAndUpdateAllAPsToIdleState ();\r
+ if (mStopCheckAllAPsStatus) {\r
+ return;\r
+ }\r
\r
- //\r
- // task timeout\r
- //\r
- if (mMpSystemData.TimeoutActive && mMpSystemData.Timeout < 0) {\r
- ResetAllFailedAPs();\r
+ if (mMpSystemData.WaitEvent != NULL) {\r
+ CheckAndUpdateAllAPsToIdleState ();\r
//\r
- // force exit\r
+ // task timeout\r
//\r
- mMpSystemData.FinishCount = mMpSystemData.StartCount;\r
- }\r
-\r
- if (mMpSystemData.FinishCount != mMpSystemData.StartCount) {\r
- return;\r
- }\r
+ if (mMpSystemData.TimeoutActive && mMpSystemData.Timeout < 0) {\r
+ ResetAllFailedAPs();\r
+ //\r
+ // force exit\r
+ //\r
+ mMpSystemData.FinishCount = mMpSystemData.StartCount;\r
+ }\r
\r
- gBS->SetTimer (\r
- mMpSystemData.CheckAllAPsEvent,\r
- TimerCancel,\r
- 0\r
- );\r
+ if (mMpSystemData.FinishCount != mMpSystemData.StartCount) {\r
+ return;\r
+ }\r
\r
- if (mMpSystemData.WaitEvent) {\r
+ mMpSystemData.TimeoutActive = FALSE;\r
gBS->SignalEvent (mMpSystemData.WaitEvent);\r
mMpSystemData.WaitEvent = NULL;\r
+ mStopCheckAllAPsStatus = TRUE;\r
+ }\r
+\r
+ //\r
+ // check each AP status for StartupThisAP\r
+ //\r
+ for (Number = 0; Number < mMpSystemData.NumberOfProcessors; Number++) {\r
+ CpuData = &mMpSystemData.CpuDatas[Number];\r
+ if (TestCpuStatusFlag (CpuData, PROCESSOR_AS_BSP_BIT)) {\r
+ //\r
+ // Skip BSP\r
+ //\r
+ continue;\r
+ }\r
+\r
+ if (!TestCpuStatusFlag (CpuData, PROCESSOR_ENABLED_BIT)) {\r
+ //\r
+ // Skip Disabled processors\r
+ //\r
+ continue;\r
+ }\r
+\r
+ if (CpuData->WaitEvent) {\r
+ CheckThisAPStatus (NULL, (VOID *)CpuData);\r
+ }\r
}\r
}\r
\r
VOID\r
)\r
{\r
- UINTN ProcessorNumber;\r
- CPU_DATA_BLOCK *CpuData;\r
EFI_STATUS Status;\r
\r
ZeroMem (&mMpSystemData, sizeof (MP_SYSTEM_DATA));\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
- for (ProcessorNumber = 0; ProcessorNumber < gMaxLogicalProcessorNumber; ProcessorNumber++) {\r
- CpuData = &mMpSystemData.CpuDatas[ProcessorNumber];\r
- Status = gBS->CreateEvent (\r
- EVT_TIMER | EVT_NOTIFY_SIGNAL,\r
- TPL_CALLBACK,\r
- CheckThisAPStatus,\r
- (VOID *) CpuData,\r
- &CpuData->CheckThisAPEvent\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
+ //\r
+ // Set timer to check all APs status.\r
+ //\r
+ Status = gBS->SetTimer (\r
+ mMpSystemData.CheckAllAPsEvent,\r
+ TimerPeriodic,\r
+ EFI_TIMER_PERIOD_MICROSECONDS (100)\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
\r
//\r
// BSP\r