13UINTN mNumberOfProcessors = 1;
69 if ((NumberOfProcessors ==
NULL) || (NumberOfEnabledProcessors ==
NULL)) {
70 return EFI_INVALID_PARAMETER;
75 NumberOfEnabledProcessors
257 IN BOOLEAN SingleThread,
259 IN UINTN TimeoutInMicroseconds,
260 IN VOID *ProcedureArgument OPTIONAL,
268 TimeoutInMicroseconds,
367 IN UINTN TimeoutInMicroseconds,
368 IN VOID *ProcedureArgument OPTIONAL,
369 OUT BOOLEAN *Finished OPTIONAL
376 TimeoutInMicroseconds,
422 IN BOOLEAN EnableOldBSP
475 IN UINT32 *HealthFlag OPTIONAL
533 UINTN ProcessorNumber;
536 UINTN CpuInstanceNumber;
545 if (GuidHob !=
NULL) {
557 if (GuidHob !=
NULL) {
564 BspCpuInstance.CpuLocation =
GetApicId ();
566 CpuInstance = &BspCpuInstance;
568 DEBUG ((DEBUG_INFO,
"Does not find any HOB stored CPU BIST information!\n"));
576 for (ProcessorNumber = 0; ProcessorNumber < mNumberOfProcessors; ProcessorNumber++) {
578 for (CpuInstanceNumber = 0; CpuInstanceNumber < NumberOfData; CpuInstanceNumber++) {
579 if (ProcessorInfo.
ProcessorId == CpuInstance[CpuInstanceNumber].CpuLocation) {
583 BistData = CpuInstance[CpuInstanceNumber].InfoRecord.IA32HealthFlags;
587 if (BistData.Uint32 != 0) {
592 EFI_ERROR_CODE | EFI_ERROR_MAJOR,
593 (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_SELF_TEST)
633 IA32_DESCRIPTOR Idtr;
642 EssData->Ia32.IdtTable = (VOID *)Idtr.Base;
643 EssData->Ia32.IdtTableSize = Idtr.Limit + 1;
662 UINTN ExceptionNumber;
666 IA32_DESCRIPTOR Gdtr;
672 NewStackSize =
FixedPcdGet32 (PcdCpuKnownGoodStackSize) * ExceptionNumber;
676 StackTop += NewStackSize * mNumberOfProcessors;
682 EssData.Ia32.Revision = CPU_EXCEPTION_INIT_DATA_REV;
683 EssData.Ia32.InitDefaultHandlers =
FALSE;
685 EssData.Ia32.StackSwitchExceptions =
FixedPcdGetPtr (PcdCpuStackSwitchExceptionList);
686 EssData.Ia32.StackSwitchExceptionNumber = ExceptionNumber;
687 EssData.Ia32.KnownGoodStackSize =
FixedPcdGet32 (PcdCpuKnownGoodStackSize);
695 for (Index = 0; Index < mNumberOfProcessors; ++Index) {
737 OldGdtSize = Gdtr.Limit + 1;
738 EssData.Ia32.ExceptionTssDescSize =
sizeof (IA32_TSS_DESCRIPTOR) *
739 (ExceptionNumber + 1);
740 EssData.Ia32.ExceptionTssSize =
sizeof (IA32_TASK_STATE_SEGMENT) *
741 (ExceptionNumber + 1);
742 NewGdtSize =
sizeof (IA32_TSS_DESCRIPTOR) +
744 EssData.Ia32.ExceptionTssDescSize +
745 EssData.Ia32.ExceptionTssSize;
753 EssData.Ia32.GdtTable =
ALIGN_POINTER (GdtBuffer,
sizeof (IA32_TSS_DESCRIPTOR));
754 NewGdtSize -= ((UINT8 *)EssData.Ia32.GdtTable - GdtBuffer);
755 EssData.Ia32.GdtTableSize = NewGdtSize;
757 EssData.Ia32.ExceptionTssDesc = ((UINT8 *)EssData.Ia32.GdtTable + OldGdtSize);
758 EssData.Ia32.ExceptionTss = ((UINT8 *)EssData.Ia32.GdtTable + OldGdtSize +
759 EssData.Ia32.ExceptionTssDescSize);
761 EssData.Ia32.KnownGoodStackTop = (
UINTN)StackTop;
764 "Exception stack top[cpu%lu]: 0x%lX\n",
765 (UINT64)(
UINTN)Index,
766 (UINT64)(
UINTN)StackTop
782 StackTop -= NewStackSize;
799 if (HEAP_GUARD_NONSTOP_MODE || NULL_DETECTION_NONSTOP_MODE) {
822 UINTN NumberOfProcessors;
823 UINTN NumberOfEnabledProcessors;
832 mNumberOfProcessors = NumberOfProcessors;
833 DEBUG ((DEBUG_INFO,
"Detect CPU count: %d\n", mNumberOfProcessors));
845 Status =
gBS->InstallMultipleProtocolInterfaces (
847 &gEfiMpServiceProtocolGuid,
848 &mMpServicesTemplate,
VOID *EFIAPI GetFirstGuidHob(IN CONST EFI_GUID *Guid)
#define ALIGN_POINTER(Pointer, Alignment)
EFI_STATUS EFIAPI SecPlatformInformation2(IN CONST EFI_PEI_SERVICES **PeiServices, IN OUT UINT64 *StructureSize, OUT EFI_SEC_PLATFORM_INFORMATION_RECORD2 *PlatformInformationRecord2)
EFI_STATUS EFIAPI RegisterCpuInterruptHandler(IN EFI_EXCEPTION_TYPE InterruptType, IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler)
EFI_STATUS EFIAPI InitializeSeparateExceptionStacks(IN CPU_EXCEPTION_INIT_DATA *InitData OPTIONAL)
EFI_STATUS EFIAPI StartupThisAP(IN EFI_MP_SERVICES_PROTOCOL *This, IN EFI_AP_PROCEDURE Procedure, IN UINTN ProcessorNumber, IN EFI_EVENT WaitEvent OPTIONAL, IN UINTN TimeoutInMicroseconds, IN VOID *ProcedureArgument OPTIONAL, OUT BOOLEAN *Finished OPTIONAL)
EFI_STATUS EFIAPI EnableDisableAP(IN EFI_MP_SERVICES_PROTOCOL *This, IN UINTN ProcessorNumber, IN BOOLEAN EnableAP, IN UINT32 *HealthFlag OPTIONAL)
VOID EFIAPI InitializeExceptionStackSwitchHandlers(IN OUT VOID *Buffer)
VOID EFIAPI GetGdtr(IN OUT VOID *Buffer)
EFI_STATUS EFIAPI WhoAmI(IN EFI_MP_SERVICES_PROTOCOL *This, OUT UINTN *ProcessorNumber)
VOID InitializeMpExceptionStackSwitchHandlers(VOID)
EFI_STATUS EFIAPI StartupAllAPs(IN EFI_MP_SERVICES_PROTOCOL *This, IN EFI_AP_PROCEDURE Procedure, IN BOOLEAN SingleThread, IN EFI_EVENT WaitEvent OPTIONAL, IN UINTN TimeoutInMicroseconds, IN VOID *ProcedureArgument OPTIONAL, OUT UINTN **FailedCpuList OPTIONAL)
VOID CollectBistDataFromHob(VOID)
EFI_STATUS EFIAPI GetNumberOfProcessors(IN EFI_MP_SERVICES_PROTOCOL *This, OUT UINTN *NumberOfProcessors, OUT UINTN *NumberOfEnabledProcessors)
EFI_STATUS EFIAPI SwitchBSP(IN EFI_MP_SERVICES_PROTOCOL *This, IN UINTN ProcessorNumber, IN BOOLEAN EnableOldBSP)
EFI_STATUS EFIAPI GetProcessorInfo(IN EFI_MP_SERVICES_PROTOCOL *This, IN UINTN ProcessorNumber, OUT EFI_PROCESSOR_INFORMATION *ProcessorInfoBuffer)
VOID InitializeMpSupport(VOID)
VOID InitializeMpExceptionHandlers(VOID)
#define ASSERT_EFI_ERROR(StatusParameter)
#define DEBUG(Expression)
#define ASSERT(Expression)
VOID *EFIAPI AllocateRuntimeZeroPool(IN UINTN AllocationSize)
#define GET_GUID_HOB_DATA(HobStart)
UINT32 EFIAPI GetApicId(VOID)
#define REPORT_STATUS_CODE(Type, Value)
EFI_STATUS EFIAPI MpInitLibEnableDisableAP(IN UINTN ProcessorNumber, IN BOOLEAN EnableAP, IN UINT32 *HealthFlag OPTIONAL)
EFI_STATUS EFIAPI MpInitLibStartupAllAPs(IN EFI_AP_PROCEDURE Procedure, IN BOOLEAN SingleThread, IN EFI_EVENT WaitEvent OPTIONAL, IN UINTN TimeoutInMicroseconds, IN VOID *ProcedureArgument OPTIONAL, OUT UINTN **FailedCpuList OPTIONAL)
EFI_STATUS EFIAPI MpInitLibWhoAmI(OUT UINTN *ProcessorNumber)
EFI_STATUS EFIAPI MpInitLibGetNumberOfProcessors(OUT UINTN *NumberOfProcessors OPTIONAL, OUT UINTN *NumberOfEnabledProcessors OPTIONAL)
EFI_STATUS EFIAPI MpInitLibSwitchBSP(IN UINTN ProcessorNumber, IN BOOLEAN EnableOldBSP)
EFI_STATUS EFIAPI MpInitLibGetProcessorInfo(IN UINTN ProcessorNumber, OUT EFI_PROCESSOR_INFORMATION *ProcessorInfoBuffer, OUT EFI_HEALTH_FLAGS *HealthData OPTIONAL)
EFI_STATUS EFIAPI MpInitLibInitialize(VOID)
EFI_STATUS EFIAPI MpInitLibStartupThisAP(IN EFI_AP_PROCEDURE Procedure, IN UINTN ProcessorNumber, IN EFI_EVENT WaitEvent OPTIONAL, IN UINTN TimeoutInMicroseconds, IN VOID *ProcedureArgument OPTIONAL, OUT BOOLEAN *Finished OPTIONAL)
#define FixedPcdGet32(TokenName)
#define PcdGetBool(TokenName)
#define FixedPcdGetPtr(TokenName)
#define FixedPcdGetSize(TokenName)
VOID(EFIAPI * EFI_AP_PROCEDURE)(IN OUT VOID *Buffer)
VOID EFIAPI PageFaultExceptionHandler(IN EFI_EXCEPTION_TYPE ExceptionType, IN EFI_SYSTEM_CONTEXT SystemContext)
VOID EFIAPI DebugExceptionHandler(IN EFI_EXCEPTION_TYPE ExceptionType, IN EFI_SYSTEM_CONTEXT SystemContext)
VOID EFIAPI AsmReadGdtr(OUT IA32_DESCRIPTOR *Gdtr)
VOID EFIAPI AsmReadIdtr(OUT IA32_DESCRIPTOR *Idtr)