return EFI_UNSUPPORTED;\r
}\r
\r
+ for (Number = 0; Number < gMPSystem.NumberOfProcessors; Number++) {\r
+ ProcessorData = &gMPSystem.ProcessorData[Number];\r
+ if ((ProcessorData->Info.StatusFlag & PROCESSOR_AS_BSP_BIT) == PROCESSOR_AS_BSP_BIT) {\r
+ // Skip BSP\r
+ continue;\r
+ }\r
+\r
+ if ((ProcessorData->Info.StatusFlag & PROCESSOR_ENABLED_BIT) == 0) {\r
+ // Skip Disabled processors\r
+ continue;\r
+ }\r
+ gThread->MutexLock(ProcessorData->StateLock);\r
+ if (ProcessorData->State != CPU_STATE_IDLE) {\r
+ gThread->MutexUnlock (ProcessorData->StateLock);\r
+ return EFI_NOT_READY;\r
+ }\r
+ gThread->MutexUnlock(ProcessorData->StateLock);\r
+ }\r
\r
if (FailedCpuList != NULL) {\r
gMPSystem.FailedList = AllocatePool ((gMPSystem.NumberOfProcessors + 1) * sizeof (UINTN));\r
// if not "SingleThread", all APs are put to ready state from the beginning\r
//\r
gThread->MutexLock(ProcessorData->StateLock);\r
- if (ProcessorData->State == CPU_STATE_IDLE) {\r
- ProcessorData->State = APInitialState;\r
- gThread->MutexUnlock (ProcessorData->StateLock);\r
+ ASSERT (ProcessorData->State == CPU_STATE_IDLE);\r
+ ProcessorData->State = APInitialState;\r
+ gThread->MutexUnlock (ProcessorData->StateLock);\r
\r
- gMPSystem.StartCount++;\r
- if (SingleThread) {\r
- APInitialState = CPU_STATE_BLOCKED;\r
- }\r
- } else {\r
- gThread->MutexUnlock (ProcessorData->StateLock);\r
- return EFI_NOT_READY;\r
+ gMPSystem.StartCount++;\r
+ if (SingleThread) {\r
+ APInitialState = CPU_STATE_BLOCKED;\r
}\r
}\r
\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
+ if ((gMPSystem.ProcessorData[ProcessorNumber].Info.StatusFlag & PROCESSOR_ENABLED_BIT) == 0) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
gThread->MutexLock(gMPSystem.ProcessorData[ProcessorNumber].StateLock);\r
if (gMPSystem.ProcessorData[ProcessorNumber].State != CPU_STATE_IDLE) {\r
gThread->MutexUnlock(gMPSystem.ProcessorData[ProcessorNumber].StateLock);\r