if (PeiCpuMpData->CpuData[ProcessorNumber].ApicId == GetInitialApicId()) {\r
ProcessorInfoBuffer->StatusFlag |= PROCESSOR_AS_BSP_BIT;\r
}\r
- if (PeiCpuMpData->CpuData[ProcessorNumber].Health.Uint32 == 0) {\r
+ if (PeiCpuMpData->CpuData[ProcessorNumber].CpuHealthy) {\r
ProcessorInfoBuffer->StatusFlag |= PROCESSOR_HEALTH_STATUS_BIT;\r
}\r
if (PeiCpuMpData->CpuData[ProcessorNumber].State == CpuStateDisabled) {\r
return EFI_NOT_FOUND;\r
}\r
\r
+ if (Procedure == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
//\r
// Check whether caller processor is BSP\r
//\r
if (Index == CallerNumber) {\r
continue;\r
}\r
- WakeUpAP (PeiCpuMpData, FALSE, PeiCpuMpData->CpuData[Index].ApicId, Procedure, ProcedureArgument);\r
+ WakeUpAP (PeiCpuMpData, FALSE, Index, Procedure, ProcedureArgument);\r
//\r
// Wait to finish\r
//\r
WaitCountIndex = 0;\r
FinishedCount = &PeiCpuMpData->FinishedCount;\r
\r
- WakeUpAP (PeiCpuMpData, FALSE, PeiCpuMpData->CpuData[ProcessorNumber].ApicId, Procedure, ProcedureArgument);\r
+ WakeUpAP (PeiCpuMpData, FALSE, ProcessorNumber, Procedure, ProcedureArgument);\r
\r
//\r
// Wait to finish\r
//\r
// Need to wakeUp AP (future BSP).\r
//\r
- WakeUpAP (PeiCpuMpData, FALSE, PeiCpuMpData->CpuData[ProcessorNumber].ApicId, FutureBSPProc, PeiCpuMpData);\r
+ WakeUpAP (PeiCpuMpData, FALSE, ProcessorNumber, FutureBSPProc, PeiCpuMpData);\r
\r
AsmExchangeRole (&PeiCpuMpData->BSPInfo, &PeiCpuMpData->APInfo);\r
\r
ApicBaseMsr.Uint64 = AsmReadMsr64 (MSR_IA32_APIC_BASE_ADDRESS);\r
ApicBaseMsr.Bits.Bsp = 1;\r
AsmWriteMsr64 (MSR_IA32_APIC_BASE_ADDRESS, ApicBaseMsr.Uint64);\r
+ //\r
+ // Set old BSP enable state\r
+ //\r
+ if (!EnableOldBSP) {\r
+ PeiCpuMpData->CpuData[PeiCpuMpData->BspNumber].State = CpuStateDisabled;\r
+ }\r
+ //\r
+ // Save new BSP number\r
+ //\r
+ PeiCpuMpData->BspNumber = (UINT32) ProcessorNumber;\r
\r
return EFI_SUCCESS;\r
}\r