**/\r
\r
#include "MpLib.h"\r
+\r
+#include <Library/UefiLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+\r
+#define AP_CHECK_INTERVAL (EFI_TIMER_PERIOD_MILLISECONDS (100))\r
+\r
CPU_MP_DATA *mCpuMpData = NULL;\r
+EFI_EVENT mCheckAllApsEvent = NULL;\r
+volatile BOOLEAN mStopCheckAllApsStatus = TRUE;\r
+\r
\r
/**\r
Get the pointer to CPU MP Data structure.\r
mCpuMpData = CpuMpData;\r
}\r
\r
+/**\r
+/**\r
+ Checks APs status and updates APs status if needed.\r
+\r
+**/\r
+VOID\r
+CheckAndUpdateApsStatus (\r
+ VOID\r
+ )\r
+{\r
+}\r
+\r
+/**\r
+ Checks APs' status periodically.\r
+\r
+ This function is triggerred by timer perodically to check the\r
+ state of APs for StartupAllAPs() and StartupThisAP() executed\r
+ in non-blocking mode.\r
+\r
+ @param[in] Event Event triggered.\r
+ @param[in] Context Parameter passed with the event.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+CheckApsStatus (\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
+ )\r
+{\r
+ //\r
+ // If CheckApsStatus() is not stopped, otherwise return immediately.\r
+ //\r
+ if (!mStopCheckAllApsStatus) {\r
+ CheckAndUpdateApsStatus ();\r
+ }\r
+}\r
/**\r
Initialize global data for MP support.\r
\r
IN CPU_MP_DATA *CpuMpData\r
)\r
{\r
+ EFI_STATUS Status;\r
+\r
SaveCpuMpData (CpuMpData);\r
\r
+ Status = gBS->CreateEvent (\r
+ EVT_TIMER | EVT_NOTIFY_SIGNAL,\r
+ TPL_NOTIFY,\r
+ CheckApsStatus,\r
+ NULL,\r
+ &mCheckAllApsEvent\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ //\r
+ // Set timer to check all APs status.\r
+ //\r
+ Status = gBS->SetTimer (\r
+ mCheckAllApsEvent,\r
+ TimerPeriodic,\r
+ AP_CHECK_INTERVAL\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
}\r
\r
/**\r