TianoCore EDK2 master
Loading...
Searching...
No Matches
CpuMpPei.c
Go to the documentation of this file.
1
9#include "CpuMpPei.h"
10
11extern EDKII_PEI_MP_SERVICES2_PPI mMpServices2Ppi;
12
13//
14// CPU MP PPI to be installed
15//
16EFI_PEI_MP_SERVICES_PPI mMpServicesPpi = {
24};
25
26EFI_PEI_PPI_DESCRIPTOR mPeiCpuMpPpiList[] = {
27 {
28 EFI_PEI_PPI_DESCRIPTOR_PPI,
29 &gEdkiiPeiMpServices2PpiGuid,
30 &mMpServices2Ppi
31 },
32 {
33 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
34 &gEfiPeiMpServicesPpiGuid,
35 &mMpServicesPpi
36 }
37};
38
74EFIAPI
76 IN CONST EFI_PEI_SERVICES **PeiServices,
78 OUT UINTN *NumberOfProcessors,
79 OUT UINTN *NumberOfEnabledProcessors
80 )
81{
82 if ((NumberOfProcessors == NULL) || (NumberOfEnabledProcessors == NULL)) {
83 return EFI_INVALID_PARAMETER;
84 }
85
87 NumberOfProcessors,
88 NumberOfEnabledProcessors
89 );
90}
91
119EFIAPI
121 IN CONST EFI_PEI_SERVICES **PeiServices,
123 IN UINTN ProcessorNumber,
124 OUT EFI_PROCESSOR_INFORMATION *ProcessorInfoBuffer
125 )
126{
127 return MpInitLibGetProcessorInfo (ProcessorNumber, ProcessorInfoBuffer, NULL);
128}
129
194EFIAPI
196 IN CONST EFI_PEI_SERVICES **PeiServices,
198 IN EFI_AP_PROCEDURE Procedure,
199 IN BOOLEAN SingleThread,
200 IN UINTN TimeoutInMicroSeconds,
201 IN VOID *ProcedureArgument OPTIONAL
202 )
203{
205 Procedure,
206 SingleThread,
207 NULL,
208 TimeoutInMicroSeconds,
209 ProcedureArgument,
210 NULL
211 );
212}
213
261EFIAPI
263 IN CONST EFI_PEI_SERVICES **PeiServices,
265 IN EFI_AP_PROCEDURE Procedure,
266 IN UINTN ProcessorNumber,
267 IN UINTN TimeoutInMicroseconds,
268 IN VOID *ProcedureArgument OPTIONAL
269 )
270{
272 Procedure,
273 ProcessorNumber,
274 NULL,
275 TimeoutInMicroseconds,
276 ProcedureArgument,
277 NULL
278 );
279}
280
316EFIAPI
318 IN CONST EFI_PEI_SERVICES **PeiServices,
320 IN UINTN ProcessorNumber,
321 IN BOOLEAN EnableOldBSP
322 )
323{
324 return MpInitLibSwitchBSP (ProcessorNumber, EnableOldBSP);
325}
326
367EFIAPI
369 IN CONST EFI_PEI_SERVICES **PeiServices,
371 IN UINTN ProcessorNumber,
372 IN BOOLEAN EnableAP,
373 IN UINT32 *HealthFlag OPTIONAL
374 )
375{
376 return MpInitLibEnableDisableAP (ProcessorNumber, EnableAP, HealthFlag);
377}
378
404EFIAPI
406 IN CONST EFI_PEI_SERVICES **PeiServices,
408 OUT UINTN *ProcessorNumber
409 )
410{
411 return MpInitLibWhoAmI (ProcessorNumber);
412}
413
414//
415// Structure for InitializeSeparateExceptionStacks
416//
417typedef struct {
418 VOID *Buffer;
419 UINTN BufferSize;
420 EFI_STATUS Status;
422
432VOID
433EFIAPI
435 IN OUT VOID *Buffer
436 )
437{
438 EXCEPTION_STACK_SWITCH_CONTEXT *SwitchStackData;
439 UINTN Index;
440 EFI_STATUS Status;
441
442 Status = MpInitLibWhoAmI (&Index);
443 if (EFI_ERROR (Status)) {
444 DEBUG ((DEBUG_ERROR, "%a - Failed to allocate Switch Stack pages.\n", __func__));
445 return;
446 }
447
448 SwitchStackData = (EXCEPTION_STACK_SWITCH_CONTEXT *)Buffer;
449
450 //
451 // This function may be called twice for each Cpu. Only run InitializeSeparateExceptionStacks
452 // if this is the first call or the first call failed because of size too small.
453 //
454 if ((SwitchStackData[Index].Status == EFI_NOT_STARTED) || (SwitchStackData[Index].Status == EFI_BUFFER_TOO_SMALL)) {
455 SwitchStackData[Index].Status = InitializeSeparateExceptionStacks (SwitchStackData[Index].Buffer, &SwitchStackData[Index].BufferSize);
456 }
457}
458
466VOID
468 VOID
469 )
470{
471 UINTN Index;
472 UINTN NumberOfProcessors;
473 EXCEPTION_STACK_SWITCH_CONTEXT *SwitchStackData;
474 UINTN BufferSize;
475 EFI_STATUS Status;
476 UINT8 *Buffer;
477
478 if (!PcdGetBool (PcdCpuStackGuard)) {
479 return;
480 }
481
482 Status = MpInitLibGetNumberOfProcessors (&NumberOfProcessors, NULL);
483 ASSERT_EFI_ERROR (Status);
484
485 if (EFI_ERROR (Status)) {
486 NumberOfProcessors = 1;
487 }
488
489 SwitchStackData = AllocatePages (EFI_SIZE_TO_PAGES (NumberOfProcessors * sizeof (EXCEPTION_STACK_SWITCH_CONTEXT)));
490 if (SwitchStackData == NULL) {
491 ASSERT (SwitchStackData != NULL);
492 DEBUG ((DEBUG_ERROR, "%a - Failed to allocate Switch Stack pages.\n", __func__));
493 return;
494 }
495
496 ZeroMem (SwitchStackData, NumberOfProcessors * sizeof (EXCEPTION_STACK_SWITCH_CONTEXT));
497 for (Index = 0; Index < NumberOfProcessors; ++Index) {
498 //
499 // Because the procedure may runs multiple times, use the status EFI_NOT_STARTED
500 // to indicate the procedure haven't been run yet.
501 //
502 SwitchStackData[Index].Status = EFI_NOT_STARTED;
503 }
504
505 Status = MpInitLibStartupAllCPUs (
507 0,
508 SwitchStackData
509 );
510 ASSERT_EFI_ERROR (Status);
511
512 BufferSize = 0;
513 for (Index = 0; Index < NumberOfProcessors; ++Index) {
514 if (SwitchStackData[Index].Status == EFI_BUFFER_TOO_SMALL) {
515 ASSERT (SwitchStackData[Index].BufferSize != 0);
516 BufferSize += SwitchStackData[Index].BufferSize;
517 } else {
518 ASSERT (SwitchStackData[Index].Status == EFI_SUCCESS);
519 ASSERT (SwitchStackData[Index].BufferSize == 0);
520 }
521 }
522
523 if (BufferSize != 0) {
524 Buffer = AllocatePages (EFI_SIZE_TO_PAGES (BufferSize));
525 if (Buffer == NULL) {
526 ASSERT (Buffer != NULL);
527 DEBUG ((DEBUG_ERROR, "%a - Failed to allocate Buffer pages.\n", __func__));
528 return;
529 }
530
531 BufferSize = 0;
532 for (Index = 0; Index < NumberOfProcessors; ++Index) {
533 if (SwitchStackData[Index].Status == EFI_BUFFER_TOO_SMALL) {
534 SwitchStackData[Index].Buffer = (VOID *)(&Buffer[BufferSize]);
535 BufferSize += SwitchStackData[Index].BufferSize;
536 DEBUG ((
537 DEBUG_INFO,
538 "Buffer[cpu%lu] for InitializeExceptionStackSwitchHandlers: 0x%lX with size 0x%lX\n",
539 (UINT64)(UINTN)Index,
540 (UINT64)(UINTN)SwitchStackData[Index].Buffer,
541 (UINT64)(UINTN)SwitchStackData[Index].BufferSize
542 ));
543 }
544 }
545
546 Status = MpInitLibStartupAllCPUs (
548 0,
549 SwitchStackData
550 );
551 ASSERT_EFI_ERROR (Status);
552 for (Index = 0; Index < NumberOfProcessors; ++Index) {
553 ASSERT (SwitchStackData[Index].Status == EFI_SUCCESS);
554 }
555 }
556
557 FreePages (SwitchStackData, EFI_SIZE_TO_PAGES (NumberOfProcessors * sizeof (EXCEPTION_STACK_SWITCH_CONTEXT)));
558}
559
565VOID
566EFIAPI
568 IN OUT VOID *Buffer
569 )
570{
571 EFI_STATUS Status;
572 UINT8 *CoreTypes;
573 CPUID_NATIVE_MODEL_ID_AND_CORE_TYPE_EAX NativeModelIdAndCoreTypeEax;
574 UINTN ProcessorIndex;
575
576 Status = MpInitLibWhoAmI (&ProcessorIndex);
577 ASSERT_EFI_ERROR (Status);
578
579 CoreTypes = (UINT8 *)Buffer;
581 CoreTypes[ProcessorIndex] = (UINT8)NativeModelIdAndCoreTypeEax.Bits.CoreType;
582}
583
587VOID
589 VOID
590 )
591{
592 EFI_STATUS Status;
593 UINTN ProcessorIndex;
594 UINTN NumberOfProcessors;
595 UINTN NumberOfEnabledProcessors;
596 UINTN NumberOfProcessorsInHob;
597 UINTN MaxProcessorsPerHob;
598 MP_INFORMATION2_HOB_DATA *MpInformation2HobData;
599 MP_INFORMATION2_ENTRY *MpInformation2Entry;
600 UINTN Index;
601 UINT8 *CoreTypes;
602 UINT32 CpuidMaxInput;
603 UINTN CoreTypePages;
604
605 ProcessorIndex = 0;
606 MpInformation2HobData = NULL;
607 MpInformation2Entry = NULL;
608 CoreTypes = NULL;
609 CoreTypePages = 0;
610
611 Status = MpInitLibGetNumberOfProcessors (&NumberOfProcessors, &NumberOfEnabledProcessors);
612 ASSERT_EFI_ERROR (Status);
613
614 //
615 // Get Processors CoreType
616 //
617 AsmCpuid (CPUID_SIGNATURE, &CpuidMaxInput, NULL, NULL, NULL);
618 if (CpuidMaxInput >= CPUID_HYBRID_INFORMATION) {
619 CoreTypePages = EFI_SIZE_TO_PAGES (sizeof (UINT8) * NumberOfProcessors);
620 CoreTypes = AllocatePages (CoreTypePages);
621 ASSERT (CoreTypes != NULL);
622
623 Status = MpInitLibStartupAllCPUs (
625 0,
626 (VOID *)CoreTypes
627 );
628 ASSERT_EFI_ERROR (Status);
629 }
630
631 MaxProcessorsPerHob = ((MAX_UINT16 & ~7) - sizeof (EFI_HOB_GUID_TYPE) - sizeof (MP_INFORMATION2_HOB_DATA)) / sizeof (MP_INFORMATION2_ENTRY);
632 NumberOfProcessorsInHob = MaxProcessorsPerHob;
633
634 //
635 // Create MP_INFORMATION2_HOB. when the max HobLength 0xFFF8 is not enough, there
636 // will be a MP_INFORMATION2_HOB series in the HOB list.
637 // In the HOB list, there is a gMpInformation2HobGuid with 0 value NumberOfProcessors
638 // fields to indicate it's the last MP_INFORMATION2_HOB.
639 //
640 while (NumberOfProcessorsInHob != 0) {
641 NumberOfProcessorsInHob = MIN (NumberOfProcessors - ProcessorIndex, MaxProcessorsPerHob);
642 MpInformation2HobData = BuildGuidHob (
643 &gMpInformation2HobGuid,
644 sizeof (MP_INFORMATION2_HOB_DATA) + sizeof (MP_INFORMATION2_ENTRY) * NumberOfProcessorsInHob
645 );
646 ASSERT (MpInformation2HobData != NULL);
647
648 MpInformation2HobData->Version = MP_INFORMATION2_HOB_REVISION;
649 MpInformation2HobData->ProcessorIndex = ProcessorIndex;
650 MpInformation2HobData->NumberOfProcessors = (UINT16)NumberOfProcessorsInHob;
651 MpInformation2HobData->EntrySize = sizeof (MP_INFORMATION2_ENTRY);
652
653 DEBUG ((DEBUG_INFO, "Creating MpInformation2 HOB...\n"));
654
655 for (Index = 0; Index < NumberOfProcessorsInHob; Index++) {
656 MpInformation2Entry = &MpInformation2HobData->Entry[Index];
658 (Index + ProcessorIndex) | CPU_V2_EXTENDED_TOPOLOGY,
659 &MpInformation2Entry->ProcessorInfo,
660 NULL
661 );
662 ASSERT_EFI_ERROR (Status);
663
664 MpInformation2Entry->CoreType = (CoreTypes != NULL) ? CoreTypes[Index + ProcessorIndex] : 0;
665
666 DEBUG ((
667 DEBUG_INFO,
668 " Processor[%04d]: ProcessorId = 0x%lx, StatusFlag = 0x%x, CoreType = 0x%x\n",
669 Index + ProcessorIndex,
670 MpInformation2Entry->ProcessorInfo.ProcessorId,
671 MpInformation2Entry->ProcessorInfo.StatusFlag,
672 MpInformation2Entry->CoreType
673 ));
674 DEBUG ((
675 DEBUG_INFO,
676 " Location = Package:%d Core:%d Thread:%d\n",
677 MpInformation2Entry->ProcessorInfo.Location.Package,
678 MpInformation2Entry->ProcessorInfo.Location.Core,
679 MpInformation2Entry->ProcessorInfo.Location.Thread
680 ));
681 DEBUG ((
682 DEBUG_INFO,
683 " Location2 = Package:%d Die:%d Tile:%d Module:%d Core:%d Thread:%d\n",
684 MpInformation2Entry->ProcessorInfo.ExtendedInformation.Location2.Package,
685 MpInformation2Entry->ProcessorInfo.ExtendedInformation.Location2.Die,
686 MpInformation2Entry->ProcessorInfo.ExtendedInformation.Location2.Tile,
687 MpInformation2Entry->ProcessorInfo.ExtendedInformation.Location2.Module,
688 MpInformation2Entry->ProcessorInfo.ExtendedInformation.Location2.Core,
689 MpInformation2Entry->ProcessorInfo.ExtendedInformation.Location2.Thread
690 ));
691 }
692
693 ProcessorIndex += NumberOfProcessorsInHob;
694 }
695
696 if (CoreTypes != NULL) {
697 FreePages (CoreTypes, CoreTypePages);
698 }
699}
700
712 IN CONST EFI_PEI_SERVICES **PeiServices
713 )
714{
715 EFI_STATUS Status;
716 EFI_VECTOR_HANDOFF_INFO *VectorInfo;
717 EFI_PEI_VECTOR_HANDOFF_INFO_PPI *VectorHandoffInfoPpi;
718
719 //
720 // Get Vector Hand-off Info PPI
721 //
722 VectorInfo = NULL;
723 Status = PeiServicesLocatePpi (
724 &gEfiVectorHandoffInfoPpiGuid,
725 0,
726 NULL,
727 (VOID **)&VectorHandoffInfoPpi
728 );
729 if (Status == EFI_SUCCESS) {
730 VectorInfo = VectorHandoffInfoPpi->Info;
731 }
732
733 //
734 // Initialize default handlers
735 //
736 Status = InitializeCpuExceptionHandlers (VectorInfo);
737 if (EFI_ERROR (Status)) {
738 return Status;
739 }
740
741 Status = MpInitLibInitialize ();
742 if (EFI_ERROR (Status)) {
743 return Status;
744 }
745
746 //
747 // Special initialization for the sake of Stack Guard
748 //
750
751 //
752 // Update and publish CPU BIST information
753 //
754 CollectBistDataFromPpi (PeiServices);
755
756 //
757 // Install CPU MP PPI
758 //
759 Status = PeiServicesInstallPpi (mPeiCpuMpPpiList);
760 ASSERT_EFI_ERROR (Status);
761
762 //
763 // Create gMpInformation2HobGuid
764 //
766
767 return Status;
768}
769
783EFIAPI
785 IN EFI_PEI_FILE_HANDLE FileHandle,
786 IN CONST EFI_PEI_SERVICES **PeiServices
787 )
788{
789 EFI_STATUS Status;
790
791 //
792 // For the sake of special initialization needing to be done right after
793 // memory discovery.
794 //
795 Status = PeiServicesNotifyPpi (&mPostMemNotifyList[0]);
796 ASSERT_EFI_ERROR (Status);
797
798 return Status;
799}
UINT64 UINTN
VOID *EFIAPI BuildGuidHob(IN CONST EFI_GUID *Guid, IN UINTN DataLength)
Definition: HobLib.c:336
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
VOID CollectBistDataFromPpi(IN CONST EFI_PEI_SERVICES **PeiServices)
Definition: CpuBist.c:157
UINT32 EFIAPI AsmCpuidEx(IN UINT32 Index, IN UINT32 SubIndex, OUT UINT32 *RegisterEax OPTIONAL, OUT UINT32 *RegisterEbx OPTIONAL, OUT UINT32 *RegisterEcx OPTIONAL, OUT UINT32 *RegisterEdx OPTIONAL)
Definition: CpuIdEx.c:43
VOID EFIAPI InitializeExceptionStackSwitchHandlers(IN OUT VOID *Buffer)
Definition: CpuMpPei.c:434
EFI_STATUS EFIAPI CpuMpPeimInit(IN EFI_PEI_FILE_HANDLE FileHandle, IN CONST EFI_PEI_SERVICES **PeiServices)
Definition: CpuMpPei.c:784
EFI_STATUS EFIAPI PeiGetProcessorInfo(IN CONST EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_MP_SERVICES_PPI *This, IN UINTN ProcessorNumber, OUT EFI_PROCESSOR_INFORMATION *ProcessorInfoBuffer)
Definition: CpuMpPei.c:120
VOID InitializeMpExceptionStackSwitchHandlers(VOID)
Definition: CpuMpPei.c:467
EFI_STATUS EFIAPI PeiWhoAmI(IN CONST EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_MP_SERVICES_PPI *This, OUT UINTN *ProcessorNumber)
Definition: CpuMpPei.c:405
EFI_STATUS EFIAPI PeiStartupAllAPs(IN CONST EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_MP_SERVICES_PPI *This, IN EFI_AP_PROCEDURE Procedure, IN BOOLEAN SingleThread, IN UINTN TimeoutInMicroSeconds, IN VOID *ProcedureArgument OPTIONAL)
Definition: CpuMpPei.c:195
VOID BuildMpInformationHob(VOID)
Definition: CpuMpPei.c:588
EFI_STATUS EFIAPI PeiEnableDisableAP(IN CONST EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_MP_SERVICES_PPI *This, IN UINTN ProcessorNumber, IN BOOLEAN EnableAP, IN UINT32 *HealthFlag OPTIONAL)
Definition: CpuMpPei.c:368
EFI_STATUS EFIAPI PeiSwitchBSP(IN CONST EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_MP_SERVICES_PPI *This, IN UINTN ProcessorNumber, IN BOOLEAN EnableOldBSP)
Definition: CpuMpPei.c:317
EFI_STATUS InitializeCpuMpWorker(IN CONST EFI_PEI_SERVICES **PeiServices)
Definition: CpuMpPei.c:711
VOID EFIAPI GetProcessorCoreType(IN OUT VOID *Buffer)
Definition: CpuMpPei.c:567
EFI_STATUS EFIAPI PeiStartupThisAP(IN CONST EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_MP_SERVICES_PPI *This, IN EFI_AP_PROCEDURE Procedure, IN UINTN ProcessorNumber, IN UINTN TimeoutInMicroseconds, IN VOID *ProcedureArgument OPTIONAL)
Definition: CpuMpPei.c:262
EFI_STATUS EFIAPI PeiGetNumberOfProcessors(IN CONST EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_MP_SERVICES_PPI *This, OUT UINTN *NumberOfProcessors, OUT UINTN *NumberOfEnabledProcessors)
Definition: CpuMpPei.c:75
VOID EFIAPI FreePages(IN VOID *Buffer, IN UINTN Pages)
EFI_STATUS EFIAPI PeiServicesLocatePpi(IN CONST EFI_GUID *Guid, IN UINTN Instance, IN OUT EFI_PEI_PPI_DESCRIPTOR **PpiDescriptor, IN OUT VOID **Ppi)
EFI_STATUS EFIAPI PeiServicesNotifyPpi(IN CONST EFI_PEI_NOTIFY_DESCRIPTOR *NotifyList)
EFI_STATUS EFIAPI PeiServicesInstallPpi(IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList)
#define NULL
Definition: Base.h:319
#define CONST
Definition: Base.h:259
#define MIN(a, b)
Definition: Base.h:1007
#define IN
Definition: Base.h:279
#define OUT
Definition: Base.h:284
#define ASSERT_EFI_ERROR(StatusParameter)
Definition: DebugLib.h:462
#define DEBUG(Expression)
Definition: DebugLib.h:434
#define CPUID_SIGNATURE
Definition: Cpuid.h:45
#define CPUID_HYBRID_INFORMATION_MAIN_LEAF
Definition: Cpuid.h:3621
#define CPUID_HYBRID_INFORMATION
Definition: Cpuid.h:3616
UINT32 EFIAPI AsmCpuid(IN UINT32 Index, OUT UINT32 *RegisterEax OPTIONAL, OUT UINT32 *RegisterEbx OPTIONAL, OUT UINT32 *RegisterEcx OPTIONAL, OUT UINT32 *RegisterEdx OPTIONAL)
Definition: CpuId.c:36
EFI_STATUS EFIAPI MpInitLibEnableDisableAP(IN UINTN ProcessorNumber, IN BOOLEAN EnableAP, IN UINT32 *HealthFlag OPTIONAL)
Definition: DxeMpLib.c:920
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)
Definition: DxeMpLib.c:682
EFI_STATUS EFIAPI MpInitLibWhoAmI(OUT UINTN *ProcessorNumber)
Definition: MpLib.c:1522
EFI_STATUS EFIAPI MpInitLibGetNumberOfProcessors(OUT UINTN *NumberOfProcessors OPTIONAL, OUT UINTN *NumberOfEnabledProcessors OPTIONAL)
Definition: MpLib.c:1559
EFI_STATUS EFIAPI MpInitLibSwitchBSP(IN UINTN ProcessorNumber, IN BOOLEAN EnableOldBSP)
Definition: DxeMpLib.c:847
EFI_STATUS EFIAPI MpInitLibStartupAllCPUs(IN EFI_AP_PROCEDURE Procedure, IN UINTN TimeoutInMicroseconds, IN VOID *ProcedureArgument OPTIONAL)
Definition: MpLib.c:1287
EFI_STATUS EFIAPI MpInitLibGetProcessorInfo(IN UINTN ProcessorNumber, OUT EFI_PROCESSOR_INFORMATION *ProcessorInfoBuffer, OUT EFI_HEALTH_FLAGS *HealthData OPTIONAL)
Definition: MpLib.c:1452
EFI_STATUS EFIAPI MpInitLibInitialize(VOID)
Definition: MpLib.c:1319
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)
Definition: DxeMpLib.c:789
#define CPU_V2_EXTENDED_TOPOLOGY
Definition: MpService.h:53
#define PcdGetBool(TokenName)
Definition: PcdLib.h:401
VOID(EFIAPI * EFI_AP_PROCEDURE)(IN OUT VOID *Buffer)
Definition: PiMultiPhase.h:198
VOID * EFI_PEI_FILE_HANDLE
Definition: PiPeiCis.h:26
VOID *EFIAPI AllocatePages(IN UINTN Pages)
RETURN_STATUS EFI_STATUS
Definition: UefiBaseType.h:29
#define EFI_SIZE_TO_PAGES(Size)
Definition: UefiBaseType.h:200
#define EFI_SUCCESS
Definition: UefiBaseType.h:112
EXTENDED_PROCESSOR_INFORMATION ExtendedInformation
Definition: MpService.h:182
EFI_CPU_PHYSICAL_LOCATION Location
Definition: MpService.h:178
struct CPUID_NATIVE_MODEL_ID_AND_CORE_TYPE_EAX::@748 Bits
EFI_CPU_PHYSICAL_LOCATION2 Location2
Definition: MpService.h:140