VOID\r
)\r
{\r
+ UINTN ProcessorNumber;\r
+ EFI_STATUS Status;\r
+ CPU_MP_DATA *CpuMpData;\r
+\r
+ CpuMpData = GetCpuMpData ();\r
+\r
+ //\r
+ // First, check whether pending StartupAllAPs() exists.\r
+ //\r
+ if (CpuMpData->WaitEvent != NULL) {\r
+\r
+ Status = CheckAllAPs ();\r
+ //\r
+ // If all APs finish for StartupAllAPs(), signal the WaitEvent for it.\r
+ //\r
+ if (Status != EFI_NOT_READY) {\r
+ Status = gBS->SignalEvent (CpuMpData->WaitEvent);\r
+ CpuMpData->WaitEvent = NULL;\r
+ }\r
+ }\r
+\r
+ //\r
+ // Second, check whether pending StartupThisAPs() callings exist.\r
+ //\r
+ for (ProcessorNumber = 0; ProcessorNumber < CpuMpData->CpuCount; ProcessorNumber++) {\r
+\r
+ if (CpuMpData->CpuData[ProcessorNumber].WaitEvent == NULL) {\r
+ continue;\r
+ }\r
+\r
+ Status = CheckThisAP (ProcessorNumber);\r
+\r
+ if (Status != EFI_NOT_READY) {\r
+ gBS->SignalEvent (CpuMpData->CpuData[ProcessorNumber].WaitEvent);\r
+ CpuMpData->CpuData[ProcessorNumber].WaitEvent = NULL;\r
+ }\r
+ }\r
}\r
\r
/**\r
OUT UINTN **FailedCpuList OPTIONAL\r
)\r
{\r
- return EFI_UNSUPPORTED;\r
+ EFI_STATUS Status;\r
+\r
+ //\r
+ // Temporarily stop checkAllApsStatus for avoid resource dead-lock.\r
+ //\r
+ mStopCheckAllApsStatus = TRUE;\r
+\r
+ Status = StartupAllAPsWorker (\r
+ Procedure,\r
+ SingleThread,\r
+ WaitEvent,\r
+ TimeoutInMicroseconds,\r
+ ProcedureArgument,\r
+ FailedCpuList\r
+ );\r
+\r
+ //\r
+ // Start checkAllApsStatus\r
+ //\r
+ mStopCheckAllApsStatus = FALSE;\r
+\r
+ return Status;\r
}\r
\r
/**\r
OUT BOOLEAN *Finished OPTIONAL\r
)\r
{\r
- return EFI_UNSUPPORTED;\r
+ EFI_STATUS Status;\r
+\r
+ //\r
+ // temporarily stop checkAllApsStatus for avoid resource dead-lock.\r
+ //\r
+ mStopCheckAllApsStatus = TRUE;\r
+\r
+ Status = StartupThisAPWorker (\r
+ Procedure,\r
+ ProcessorNumber,\r
+ WaitEvent,\r
+ TimeoutInMicroseconds,\r
+ ProcedureArgument,\r
+ Finished\r
+ );\r
+\r
+ mStopCheckAllApsStatus = FALSE;\r
+\r
+ return Status;\r
}\r
\r
/**\r
IN UINT32 *HealthFlag OPTIONAL\r
)\r
{\r
- return EFI_UNSUPPORTED;\r
+ EFI_STATUS Status;\r
+ BOOLEAN TempStopCheckState;\r
+\r
+ TempStopCheckState = FALSE;\r
+ //\r
+ // temporarily stop checkAllAPsStatus for initialize parameters.\r
+ //\r
+ if (!mStopCheckAllApsStatus) {\r
+ mStopCheckAllApsStatus = TRUE;\r
+ TempStopCheckState = TRUE;\r
+ }\r
+\r
+ Status = EnableDisableApWorker (ProcessorNumber, EnableAP, HealthFlag);\r
+\r
+ if (TempStopCheckState) {\r
+ mStopCheckAllApsStatus = FALSE;\r
+ }\r
+\r
+ return Status;\r
}\r