IN VOID *Context2 OPTIONAL\r
)\r
{\r
- DEBUG ((DEBUG_INFO, "Ap apicid is %d\n", GetApicId ()));\r
+ UINTN ProcessorNumber;\r
+ CPU_DATA_BLOCK *CpuData;\r
+ EFI_AP_PROCEDURE Procedure;\r
+ VOID *ProcedureArgument;\r
+\r
+ WhoAmI (&mMpServicesTemplate, &ProcessorNumber);\r
+ CpuData = &mMpSystemData.CpuDatas[ProcessorNumber];\r
\r
AsmApDoneWithCommonStack ();\r
\r
+ while (TRUE) {\r
+ while (!AcquireSpinLockOrFail (&CpuData->CpuDataLock)) {\r
+ CpuPause ();\r
+ }\r
+\r
+ ProcedureArgument = CpuData->Parameter;\r
+ Procedure = CpuData->Procedure;\r
+ ReleaseSpinLock (&CpuData->CpuDataLock);\r
+\r
+ if (Procedure != NULL) {\r
+ Procedure (ProcedureArgument);\r
+\r
+ while (!AcquireSpinLockOrFail (&CpuData->CpuDataLock)) {\r
+ CpuPause ();\r
+ }\r
+\r
+ CpuData->Procedure = NULL;\r
+ ReleaseSpinLock (&CpuData->CpuDataLock);\r
+\r
+ SetApState (CpuData, CpuStateFinished);\r
+ }\r
+\r
+ CpuPause ();\r
+ }\r
+\r
CpuSleep ();\r
CpuDeadLoop ();\r
}\r