11CHAR16 *mDependTypeStr[] = { L
"None", L
"Thread", L
"Core", L
"Package", L
"Invalid" };
22 IN UINT8 *SupportedFeatureMask,
28 Status =
PcdSetPtrS (PcdCpuFeaturesCapability, &BitMaskSize, SupportedFeatureMask);
40 IN UINT8 *SupportedFeatureMask,
46 Status =
PcdSetPtrS (PcdCpuFeaturesSetting, &BitMaskSize, SupportedFeatureMask);
63 UINT32 DisplayedFamily;
64 UINT32 DisplayedModel;
68 DisplayedFamily = Eax.Bits.FamilyId;
69 if (Eax.Bits.FamilyId == 0x0F) {
70 DisplayedFamily += Eax.Bits.ExtendedFamilyId;
73 DisplayedModel = Eax.Bits.Model;
74 if ((Eax.Bits.FamilyId == 0x06) || (Eax.Bits.FamilyId == 0x0f)) {
75 DisplayedModel += (Eax.Bits.ExtendedModelId << 4);
78 CpuInfo->DisplayFamily = DisplayedFamily;
79 CpuInfo->DisplayModel = DisplayedModel;
80 CpuInfo->SteppingId = Eax.Bits.SteppingId;
81 CpuInfo->ProcessorType = Eax.Bits.ProcessorType;
82 CpuInfo->CpuIdVersionInfoEcx.Uint32 = Ecx.Uint32;
83 CpuInfo->CpuIdVersionInfoEdx.Uint32 = Edx.Uint32;
96 UINTN ProcessorNumber;
114 UINT32 *ThreadCountPerPackage;
115 UINT8 *ThreadCountPerCore;
117 UINTN NumberOfEnabledProcessors;
133 ASSERT (CpuFeaturesData->InitOrder !=
NULL);
140 while (!
IsNull (&CpuFeaturesData->FeatureList, Entry)) {
141 CpuFeature = CPU_FEATURE_ENTRY_FROM_LINK (Entry);
142 ASSERT (CpuFeature->InitializeFunc !=
NULL);
143 if (CpuFeature->GetConfigDataFunc !=
NULL) {
144 CpuFeature->ConfigData = CpuFeature->GetConfigDataFunc (NumberOfCpus);
147 Entry = Entry->ForwardLink;
150 CpuFeaturesData->NumberOfCpus = (UINT32)NumberOfCpus;
153 ASSERT (AcpiCpuData !=
NULL);
154 CpuFeaturesData->AcpiCpuData = AcpiCpuData;
156 CpuStatus = &AcpiCpuData->CpuFeatureInitData.CpuStatus;
158 ASSERT (Location !=
NULL);
162 for (ProcessorNumber = 0; ProcessorNumber < NumberOfCpus; ProcessorNumber++) {
163 InitOrder = &CpuFeaturesData->InitOrder[ProcessorNumber];
164 InitOrder->FeaturesSupportedMask =
AllocateZeroPool (CpuFeaturesData->BitMaskSize);
165 ASSERT (InitOrder->FeaturesSupportedMask !=
NULL);
171 &ProcessorInfoBuffer,
175 &Location[ProcessorNumber],
202 CpuStatus->PackageCount = Package + 1;
203 CpuStatus->MaxCoreCount = Core + 1;
204 CpuStatus->MaxThreadCount = Thread + 1;
207 "Processor Info: Package: %d, MaxCore : %d, MaxThread: %d\n",
208 CpuStatus->PackageCount,
209 CpuStatus->MaxCoreCount,
210 CpuStatus->MaxThreadCount
217 ASSERT (ThreadCountPerPackage !=
NULL);
218 ZeroMem (ThreadCountPerPackage,
sizeof (UINT32) * CpuStatus->PackageCount);
222 ASSERT (ThreadCountPerCore !=
NULL);
223 ZeroMem (ThreadCountPerCore,
sizeof (UINT8) * CpuStatus->PackageCount * CpuStatus->MaxCoreCount);
226 for (ProcessorNumber = 0; ProcessorNumber < NumberOfCpus; ProcessorNumber++) {
228 ThreadCountPerPackage[Location->
Package]++;
229 ThreadCountPerCore[Location->
Package * CpuStatus->MaxCoreCount + Location->
Core]++;
232 for (PackageIndex = 0; PackageIndex < CpuStatus->PackageCount; PackageIndex++) {
233 if (ThreadCountPerPackage[PackageIndex] != 0) {
234 DEBUG ((DEBUG_INFO,
"P%02d: Thread Count = %d\n", PackageIndex, ThreadCountPerPackage[PackageIndex]));
235 for (CoreIndex = 0; CoreIndex < CpuStatus->MaxCoreCount; CoreIndex++) {
236 if (ThreadCountPerCore[PackageIndex * CpuStatus->MaxCoreCount + CoreIndex] != 0) {
239 " P%02d C%04d, Thread Count = %d\n",
242 ThreadCountPerCore[PackageIndex * CpuStatus->MaxCoreCount + CoreIndex]
249 CpuFeaturesData->CpuFlags.CoreSemaphoreCount =
AllocateZeroPool (
sizeof (UINT32) * CpuStatus->PackageCount * CpuStatus->MaxCoreCount * CpuStatus->MaxThreadCount);
250 ASSERT (CpuFeaturesData->CpuFlags.CoreSemaphoreCount !=
NULL);
251 CpuFeaturesData->CpuFlags.PackageSemaphoreCount =
AllocateZeroPool (
sizeof (UINT32) * CpuStatus->PackageCount * CpuStatus->MaxCoreCount * CpuStatus->MaxThreadCount);
252 ASSERT (CpuFeaturesData->CpuFlags.PackageSemaphoreCount !=
NULL);
258 Pages =
EFI_SIZE_TO_PAGES (CpuStatus->PackageCount * sizeof (UINT32) + CpuStatus->PackageCount * CpuStatus->MaxCoreCount * sizeof (UINT32));
260 ASSERT (FirstCore !=
NULL);
261 FirstThread = FirstCore + CpuStatus->PackageCount;
266 FirstPackage = MAX_UINT32;
267 SetMem32 (FirstCore, CpuStatus->PackageCount * sizeof (UINT32), MAX_UINT32);
268 SetMem32 (FirstThread, CpuStatus->PackageCount * CpuStatus->MaxCoreCount * sizeof (UINT32), MAX_UINT32);
270 for (ProcessorNumber = 0; ProcessorNumber < NumberOfCpus; ProcessorNumber++) {
276 FirstPackage =
MIN (Location->
Package, FirstPackage);
286 FirstThread[Location->
Package * CpuStatus->MaxCoreCount + Location->
Core] =
MIN (
288 FirstThread[Location->
Package * CpuStatus->MaxCoreCount + Location->
Core]
295 for (ProcessorNumber = 0; ProcessorNumber < NumberOfCpus; ProcessorNumber++) {
298 if (Location->
Package == FirstPackage) {
299 CpuFeaturesData->InitOrder[ProcessorNumber].CpuInfo.
First.Package = 1;
306 CpuFeaturesData->InitOrder[ProcessorNumber].CpuInfo.
First.Die = 1;
307 CpuFeaturesData->InitOrder[ProcessorNumber].CpuInfo.
First.Tile = 1;
308 CpuFeaturesData->InitOrder[ProcessorNumber].CpuInfo.
First.Module = 1;
310 if (Location->
Core == FirstCore[Location->
Package]) {
311 CpuFeaturesData->InitOrder[ProcessorNumber].CpuInfo.
First.Core = 1;
314 if (Location->
Thread == FirstThread[Location->
Package * CpuStatus->MaxCoreCount + Location->
Core]) {
315 CpuFeaturesData->InitOrder[ProcessorNumber].CpuInfo.
First.Thread = 1;
332 IN UINT8 *SupportedFeatureMask,
333 IN UINT8 *OrFeatureBitMask,
334 IN UINT32 BitMaskSize
341 Data1 = SupportedFeatureMask;
342 Data2 = OrFeatureBitMask;
343 for (Index = 0; Index < BitMaskSize; Index++) {
344 *(Data1++) |= *(Data2++);
358 IN UINT8 *SupportedFeatureMask,
359 IN CONST UINT8 *AndFeatureBitMask,
360 IN UINT32 BitMaskSize
367 Data1 = SupportedFeatureMask;
368 Data2 = AndFeatureBitMask;
369 for (Index = 0; Index < BitMaskSize; Index++) {
370 *(Data1++) &= *(Data2++);
383 IN UINT8 *SupportedFeatureMask,
384 IN UINT8 *AndFeatureBitMask,
385 IN UINT32 BitMaskSize
392 Data1 = SupportedFeatureMask;
393 Data2 = AndFeatureBitMask;
394 for (Index = 0; Index < BitMaskSize; Index++) {
395 *(Data1++) &= ~(*(Data2++));
414 IN UINT8 *SupportedFeatureMask,
415 IN UINT8 *ComparedFeatureBitMask,
416 IN UINT32 BitMaskSize
423 Data1 = SupportedFeatureMask;
424 Data2 = ComparedFeatureBitMask;
425 for (Index = 0; Index < BitMaskSize; Index++) {
426 if (((*(Data1++)) & (*(Data2++))) != 0) {
445 UINTN ProcessorNumber;
453 CpuInfo = &CpuFeaturesData->InitOrder[ProcessorNumber].CpuInfo;
459 while (!
IsNull (&CpuFeaturesData->FeatureList, Entry)) {
460 CpuFeature = CPU_FEATURE_ENTRY_FROM_LINK (Entry);
461 if (CpuFeature->SupportFunc ==
NULL) {
466 CpuFeaturesData->InitOrder[ProcessorNumber].FeaturesSupportedMask,
467 CpuFeature->FeatureMask,
468 CpuFeaturesData->BitMaskSize
470 }
else if (CpuFeature->SupportFunc (ProcessorNumber, CpuInfo, CpuFeature->ConfigData)) {
472 CpuFeaturesData->InitOrder[ProcessorNumber].FeaturesSupportedMask,
473 CpuFeature->FeatureMask,
474 CpuFeaturesData->BitMaskSize
478 Entry = Entry->ForwardLink;
499 UINT32 DebugPrintErrorLevel;
501 DebugPrintErrorLevel = (ProcessorNumber == 0) ? DEBUG_INFO : DEBUG_VERBOSE;
506 RegisterTable = &CpuFeaturesData->RegisterTable[ProcessorNumber];
507 DEBUG ((DebugPrintErrorLevel,
"RegisterTable->TableLength = %d\n", RegisterTable->TableLength));
511 for (FeatureIndex = 0; FeatureIndex < RegisterTable->TableLength; FeatureIndex++) {
512 RegisterTableEntry = &RegisterTableEntryHead[FeatureIndex];
513 switch (RegisterTableEntry->RegisterType) {
516 DebugPrintErrorLevel,
517 "Processor: %04d: Index %04d, MSR : %08x, Bit Start: %02d, Bit Length: %02d, Value: %016lx\r\n",
518 (UINT32)ProcessorNumber,
519 (UINT32)FeatureIndex,
520 RegisterTableEntry->Index,
521 RegisterTableEntry->ValidBitStart,
522 RegisterTableEntry->ValidBitLength,
523 RegisterTableEntry->Value
526 case ControlRegister:
528 DebugPrintErrorLevel,
529 "Processor: %04d: Index %04d, CR : %08x, Bit Start: %02d, Bit Length: %02d, Value: %016lx\r\n",
530 (UINT32)ProcessorNumber,
531 (UINT32)FeatureIndex,
532 RegisterTableEntry->Index,
533 RegisterTableEntry->ValidBitStart,
534 RegisterTableEntry->ValidBitLength,
535 RegisterTableEntry->Value
540 DebugPrintErrorLevel,
541 "Processor: %04d: Index %04d, MMIO : %016lx, Bit Start: %02d, Bit Length: %02d, Value: %016lx\r\n",
542 (UINT32)ProcessorNumber,
543 (UINT32)FeatureIndex,
544 RegisterTableEntry->Index |
LShiftU64 (RegisterTableEntry->HighIndex, 32),
545 RegisterTableEntry->ValidBitStart,
546 RegisterTableEntry->ValidBitLength,
547 RegisterTableEntry->Value
552 DebugPrintErrorLevel,
553 "Processor: %04d: Index %04d, CACHE: %08x, Bit Start: %02d, Bit Length: %02d, Value: %016lx\r\n",
554 (UINT32)ProcessorNumber,
555 (UINT32)FeatureIndex,
556 RegisterTableEntry->Index,
557 RegisterTableEntry->ValidBitStart,
558 RegisterTableEntry->ValidBitLength,
559 RegisterTableEntry->Value
564 DebugPrintErrorLevel,
565 "Processor: %04d: Index %04d, SEMAP: %s\r\n",
566 (UINT32)ProcessorNumber,
567 (UINT32)FeatureIndex,
568 mDependTypeStr[
MIN ((UINT32)RegisterTableEntry->Value, InvalidDepType)]
589CPU_FEATURE_DEPENDENCE_TYPE
591 IN CPU_FEATURE_DEPENDENCE_TYPE BeforeDep,
592 IN CPU_FEATURE_DEPENDENCE_TYPE AfterDep,
593 IN CPU_FEATURE_DEPENDENCE_TYPE NoneNeibBeforeDep,
594 IN CPU_FEATURE_DEPENDENCE_TYPE NoneNeibAfterDep
597 CPU_FEATURE_DEPENDENCE_TYPE Bigger;
599 Bigger =
MAX (BeforeDep, AfterDep);
600 Bigger =
MAX (Bigger, NoneNeibBeforeDep);
601 return MAX (Bigger, NoneNeibAfterDep);
616 UINTN ProcessorNumber;
626 CPU_FEATURE_DEPENDENCE_TYPE BeforeDep;
627 CPU_FEATURE_DEPENDENCE_TYPE AfterDep;
628 CPU_FEATURE_DEPENDENCE_TYPE NoneNeibBeforeDep;
629 CPU_FEATURE_DEPENDENCE_TYPE NoneNeibAfterDep;
632 CpuFeaturesData->CapabilityPcd =
AllocatePool (CpuFeaturesData->BitMaskSize);
633 ASSERT (CpuFeaturesData->CapabilityPcd !=
NULL);
634 SetMem (CpuFeaturesData->CapabilityPcd, CpuFeaturesData->BitMaskSize, 0xFF);
635 for (ProcessorNumber = 0; ProcessorNumber < NumberOfCpus; ProcessorNumber++) {
636 CpuInitOrder = &CpuFeaturesData->InitOrder[ProcessorNumber];
640 SupportedMaskAnd (CpuFeaturesData->CapabilityPcd, CpuInitOrder->FeaturesSupportedMask, CpuFeaturesData->BitMaskSize);
646 CpuFeaturesData->SettingPcd =
AllocateCopyPool (CpuFeaturesData->BitMaskSize, CpuFeaturesData->CapabilityPcd);
647 ASSERT (CpuFeaturesData->SettingPcd !=
NULL);
654 DEBUG ((DEBUG_INFO,
"Last CPU features list...\n"));
656 while (!
IsNull (&CpuFeaturesData->FeatureList, Entry)) {
657 CpuFeature = CPU_FEATURE_ENTRY_FROM_LINK (Entry);
658 if (
IsBitMaskMatch (CpuFeature->FeatureMask, CpuFeaturesData->CapabilityPcd, CpuFeaturesData->BitMaskSize)) {
659 if (
IsBitMaskMatch (CpuFeature->FeatureMask, CpuFeaturesData->SettingPcd, CpuFeaturesData->BitMaskSize)) {
660 DEBUG ((DEBUG_INFO,
"[Enable ] "));
662 DEBUG ((DEBUG_INFO,
"[Disable ] "));
665 DEBUG ((DEBUG_INFO,
"[Unsupport] "));
669 Entry = Entry->ForwardLink;
672 DEBUG ((DEBUG_INFO,
"PcdCpuFeaturesCapability:\n"));
674 DEBUG ((DEBUG_INFO,
"Origin PcdCpuFeaturesSetting:\n"));
676 DEBUG ((DEBUG_INFO,
"Final PcdCpuFeaturesSetting:\n"));
683 SetCapabilityPcd (CpuFeaturesData->CapabilityPcd, CpuFeaturesData->BitMaskSize);
684 SetSettingPcd (CpuFeaturesData->SettingPcd, CpuFeaturesData->BitMaskSize);
686 for (ProcessorNumber = 0; ProcessorNumber < NumberOfCpus; ProcessorNumber++) {
687 CpuInitOrder = &CpuFeaturesData->InitOrder[ProcessorNumber];
689 while (!
IsNull (&CpuFeaturesData->FeatureList, Entry)) {
693 CpuFeature = CPU_FEATURE_ENTRY_FROM_LINK (Entry);
694 if (
IsBitMaskMatch (CpuFeature->FeatureMask, CpuFeaturesData->CapabilityPcd, CpuFeaturesData->BitMaskSize)) {
696 ASSERT (CpuFeatureInOrder !=
NULL);
697 InsertTailList (&CpuInitOrder->OrderList, &CpuFeatureInOrder->Link);
700 Entry = Entry->ForwardLink;
706 CpuInfo = &CpuFeaturesData->InitOrder[ProcessorNumber].CpuInfo;
708 while (!
IsNull (&CpuInitOrder->OrderList, Entry)) {
709 CpuFeatureInOrder = CPU_FEATURE_ENTRY_FROM_LINK (Entry);
712 if (
IsBitMaskMatch (CpuFeatureInOrder->FeatureMask, CpuFeaturesData->SettingPcd, CpuFeaturesData->BitMaskSize)) {
713 Status = CpuFeatureInOrder->InitializeFunc (ProcessorNumber, CpuInfo, CpuFeatureInOrder->ConfigData,
TRUE);
714 if (EFI_ERROR (Status)) {
718 SupportedMaskCleanBit (CpuFeaturesData->SettingPcd, CpuFeatureInOrder->FeatureMask, CpuFeaturesData->BitMaskSize);
719 if (CpuFeatureInOrder->FeatureName !=
NULL) {
720 DEBUG ((DEBUG_WARN,
"Warning :: Failed to enable Feature: Name = %a.\n", CpuFeatureInOrder->FeatureName));
722 DEBUG ((DEBUG_WARN,
"Warning :: Failed to enable Feature: Mask = "));
729 Status = CpuFeatureInOrder->InitializeFunc (ProcessorNumber, CpuInfo, CpuFeatureInOrder->ConfigData,
FALSE);
730 if (EFI_ERROR (Status)) {
731 if (CpuFeatureInOrder->FeatureName !=
NULL) {
732 DEBUG ((DEBUG_WARN,
"Warning :: Failed to disable Feature: Name = %a.\n", CpuFeatureInOrder->FeatureName));
734 DEBUG ((DEBUG_WARN,
"Warning :: Failed to disable Feature: Mask = "));
743 NextEntry = Entry->ForwardLink;
744 if (!
IsNull (&CpuInitOrder->OrderList, NextEntry)) {
745 NextCpuFeatureInOrder = CPU_FEATURE_ENTRY_FROM_LINK (NextEntry);
759 BeforeDep = NoneDepType;
760 AfterDep = NoneDepType;
761 NoneNeibAfterDep = NoneDepType;
774 BeforeDep =
BiggestDep (BeforeDep, AfterDep, NoneNeibBeforeDep, NoneNeibAfterDep);
775 if (BeforeDep > ThreadDepType) {
780 Entry = Entry->ForwardLink;
787 DEBUG ((DEBUG_INFO,
"Dump final value for PcdCpuFeaturesSetting:\n"));
805 IN OUT volatile UINT32 *Sem
823 IN OUT volatile UINT32 *Sem
830 }
while (Value == 0 ||
888 return EFI_UNSUPPORTED;
916 volatile UINT32 *SemaphorePtr;
918 UINT32 CurrentThread;
920 UINTN ProcessorIndex;
921 UINT32 *ThreadCountPerPackage;
922 UINT8 *ThreadCountPerCore;
931 for (Index = 0; Index < RegisterTable->TableLength; Index++) {
932 RegisterTableEntry = &RegisterTableEntryHead[Index];
937 switch (RegisterTableEntry->RegisterType) {
941 case ControlRegister:
943 if (EFI_ERROR (Status)) {
947 if (RegisterTableEntry->TestThenWrite) {
950 RegisterTableEntry->ValidBitStart,
951 RegisterTableEntry->ValidBitStart + RegisterTableEntry->ValidBitLength - 1
953 if (CurrentValue == RegisterTableEntry->Value) {
960 RegisterTableEntry->ValidBitStart,
961 RegisterTableEntry->ValidBitStart + RegisterTableEntry->ValidBitLength - 1,
962 RegisterTableEntry->Value
971 if (RegisterTableEntry->TestThenWrite) {
973 if (RegisterTableEntry->ValidBitLength >= 64) {
974 if (Value == RegisterTableEntry->Value) {
980 RegisterTableEntry->ValidBitStart,
981 RegisterTableEntry->ValidBitStart + RegisterTableEntry->ValidBitLength - 1
983 if (CurrentValue == RegisterTableEntry->Value) {
989 if (RegisterTableEntry->ValidBitLength >= 64) {
994 RegisterTableEntry->Index,
995 RegisterTableEntry->Value
1002 RegisterTableEntry->Index,
1003 RegisterTableEntry->ValidBitStart,
1004 RegisterTableEntry->ValidBitStart + RegisterTableEntry->ValidBitLength - 1,
1005 RegisterTableEntry->Value
1016 (
UINTN)(RegisterTableEntry->Index |
LShiftU64 (RegisterTableEntry->HighIndex, 32)),
1017 RegisterTableEntry->ValidBitStart,
1018 RegisterTableEntry->ValidBitStart + RegisterTableEntry->ValidBitLength - 1,
1019 (UINT32)RegisterTableEntry->Value
1030 if (RegisterTableEntry->Value == 0) {
1053 switch (RegisterTableEntry->Value) {
1055 SemaphorePtr = CpuFlags->CoreSemaphoreCount;
1056 ThreadCountPerCore = (UINT8 *)(
UINTN)CpuStatus->ThreadCountPerCore;
1058 CurrentCore = ApLocation->Package * CpuStatus->MaxCoreCount + ApLocation->Core;
1062 FirstThread = CurrentCore * CpuStatus->MaxThreadCount;
1063 CurrentThread = FirstThread + ApLocation->Thread;
1080 for (ProcessorIndex = 0; ProcessorIndex < CpuStatus->MaxThreadCount; ProcessorIndex++) {
1087 for (ProcessorIndex = 0; ProcessorIndex < ThreadCountPerCore[CurrentCore]; ProcessorIndex++) {
1093 case PackageDepType:
1094 SemaphorePtr = CpuFlags->PackageSemaphoreCount;
1095 ThreadCountPerPackage = (UINT32 *)(
UINTN)CpuStatus->ThreadCountPerPackage;
1099 FirstThread = ApLocation->Package * CpuStatus->MaxCoreCount * CpuStatus->MaxThreadCount;
1103 CurrentThread = FirstThread + CpuStatus->MaxThreadCount * ApLocation->Core + ApLocation->Thread;
1120 for (ProcessorIndex = 0; ProcessorIndex < CpuStatus->MaxThreadCount * CpuStatus->MaxCoreCount; ProcessorIndex++) {
1127 for (ProcessorIndex = 0; ProcessorIndex < ThreadCountPerPackage[ApLocation->Package]; ProcessorIndex++) {
1166 AcpiCpuData = CpuFeaturesData->AcpiCpuData;
1171 RegisterTable =
NULL;
1172 ProcIndex = (
UINTN)-1;
1173 for (Index = 0; Index < AcpiCpuData->NumberOfCpus; Index++) {
1174 if (RegisterTables[Index].InitialApicId == InitApicId) {
1175 RegisterTable = &RegisterTables[Index];
1181 ASSERT (RegisterTable !=
NULL);
1186 &AcpiCpuData->CpuFeatureInitData.CpuStatus,
1187 &CpuFeaturesData->CpuFlags
1211 if (CpuFeaturesData->NumberOfCpus > 1) {
BOOLEAN EFIAPI IsNull(IN CONST LIST_ENTRY *List, IN CONST LIST_ENTRY *Node)
LIST_ENTRY *EFIAPI GetFirstNode(IN CONST LIST_ENTRY *List)
UINT64 EFIAPI BitFieldWrite64(IN UINT64 Operand, IN UINTN StartBit, IN UINTN EndBit, IN UINT64 Value)
LIST_ENTRY *EFIAPI InitializeListHead(IN OUT LIST_ENTRY *ListHead)
UINT64 EFIAPI BitFieldRead64(IN UINT64 Operand, IN UINTN StartBit, IN UINTN EndBit)
UINT64 EFIAPI LShiftU64(IN UINT64 Operand, IN UINTN Count)
LIST_ENTRY *EFIAPI InsertTailList(IN OUT LIST_ENTRY *ListHead, IN OUT LIST_ENTRY *Entry)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI SetMem(OUT VOID *Buffer, IN UINTN Length, IN UINT8 Value)
VOID *EFIAPI SetMem32(OUT VOID *Buffer, IN UINTN Length, IN UINT32 Value)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
VOID SetSettingPcd(IN UINT8 *SupportedFeatureMask, IN UINTN BitMaskSize)
VOID SetCapabilityPcd(IN UINT8 *SupportedFeatureMask, IN UINTN BitMaskSize)
VOID FillProcessorInfo(IN OUT REGISTER_CPU_FEATURE_INFORMATION *CpuInfo)
VOID ProgramProcessorRegister(IN CPU_REGISTER_TABLE *RegisterTable, IN EFI_CPU_PHYSICAL_LOCATION *ApLocation, IN CPU_STATUS_INFORMATION *CpuStatus, IN PROGRAM_CPU_REGISTER_FLAGS *CpuFlags)
VOID DumpRegisterTableOnProcessor(IN UINTN ProcessorNumber)
UINTN ReadWriteCr(IN UINT32 CrIndex, IN BOOLEAN Read, IN OUT UINTN *CrValue)
VOID LibWaitForSemaphore(IN OUT volatile UINT32 *Sem)
BOOLEAN IsBitMaskMatch(IN UINT8 *SupportedFeatureMask, IN UINT8 *ComparedFeatureBitMask, IN UINT32 BitMaskSize)
VOID SupportedMaskAnd(IN UINT8 *SupportedFeatureMask, IN CONST UINT8 *AndFeatureBitMask, IN UINT32 BitMaskSize)
VOID EFIAPI CpuFeaturesDetect(VOID)
VOID SupportedMaskOr(IN UINT8 *SupportedFeatureMask, IN UINT8 *OrFeatureBitMask, IN UINT32 BitMaskSize)
CPU_FEATURE_DEPENDENCE_TYPE BiggestDep(IN CPU_FEATURE_DEPENDENCE_TYPE BeforeDep, IN CPU_FEATURE_DEPENDENCE_TYPE AfterDep, IN CPU_FEATURE_DEPENDENCE_TYPE NoneNeibBeforeDep, IN CPU_FEATURE_DEPENDENCE_TYPE NoneNeibAfterDep)
VOID AnalysisProcessorFeatures(IN UINTN NumberOfCpus)
VOID SupportedMaskCleanBit(IN UINT8 *SupportedFeatureMask, IN UINT8 *AndFeatureBitMask, IN UINT32 BitMaskSize)
VOID EFIAPI SetProcessorRegister(IN OUT VOID *Buffer)
VOID EFIAPI CollectProcessorData(IN OUT VOID *Buffer)
VOID CpuInitDataInitialize(VOID)
VOID LibReleaseSemaphore(IN OUT volatile UINT32 *Sem)
#define ASSERT_EFI_ERROR(StatusParameter)
#define DEBUG_CODE_BEGIN()
#define DEBUG(Expression)
UINT32 GetProcessorIndex(VOID)
VOID EFIAPI AsmDisableCache(VOID)
CPU_FEATURES_DATA * GetCpuFeaturesData(VOID)
VOID GetNumberOfProcessor(OUT UINTN *NumberOfCpus, OUT UINTN *NumberOfEnabledProcessors)
EFI_STATUS GetProcessorInformation(IN UINTN ProcessorNumber, OUT EFI_PROCESSOR_INFORMATION *ProcessorInfoBuffer)
VOID StartupAllAPsWorker(IN EFI_AP_PROCEDURE Procedure, IN EFI_EVENT MpEvent)
MP_SERVICES GetMpService(VOID)
VOID EFIAPI FreePages(IN VOID *Buffer, IN UINTN Pages)
VOID *EFIAPI AllocateZeroPool(IN UINTN AllocationSize)
VOID *EFIAPI AllocateCopyPool(IN UINTN AllocationSize, IN CONST VOID *Buffer)
VOID EFIAPI AsmEnableCache(VOID)
UINTN EFIAPI AsmReadCr3(VOID)
UINTN EFIAPI AsmWriteCr2(UINTN Cr2)
UINT64 EFIAPI AsmReadMsr64(IN UINT32 Index)
UINTN EFIAPI AsmWriteCr3(UINTN Cr3)
UINTN EFIAPI AsmWriteCr4(UINTN Cr4)
UINTN EFIAPI AsmReadCr0(VOID)
UINTN EFIAPI AsmWriteCr0(UINTN Cr0)
UINTN EFIAPI AsmReadCr2(VOID)
UINT64 EFIAPI AsmWriteMsr64(IN UINT32 Index, IN UINT64 Value)
UINTN EFIAPI AsmReadCr4(VOID)
UINT32 EFIAPI MmioBitFieldWrite32(IN UINTN Address, IN UINTN StartBit, IN UINTN EndBit, IN UINT32 Value)
UINT32 EFIAPI GetInitialApicId(VOID)
#define CPUID_VERSION_INFO
UINT32 EFIAPI AsmCpuid(IN UINT32 Index, OUT UINT32 *RegisterEax OPTIONAL, OUT UINT32 *RegisterEbx OPTIONAL, OUT UINT32 *RegisterEcx OPTIONAL, OUT UINT32 *RegisterEdx OPTIONAL)
#define PcdSetPtrS(TokenName, SizeOfBuffer, Buffer)
#define PcdGetPtr(TokenName)
VOID *EFIAPI AllocatePool(IN UINTN AllocationSize)
VOID *EFIAPI AllocatePages(IN UINTN Pages)
VOID DumpCpuFeature(IN CPU_FEATURES_ENTRY *CpuFeature, IN UINT32 BitMaskSize)
VOID DumpCpuFeatureMask(IN UINT8 *FeatureMask, IN UINT32 BitMaskSize)
CPU_FEATURE_DEPENDENCE_TYPE DetectNoneNeighborhoodFeatureScope(IN CPU_FEATURES_ENTRY *CpuFeature, IN BOOLEAN Before, IN LIST_ENTRY *FeatureList)
ACPI_CPU_DATA * GetAcpiCpuData(VOID)
CPU_FEATURE_DEPENDENCE_TYPE DetectFeatureScope(IN CPU_FEATURES_ENTRY *CpuFeature, IN BOOLEAN Before, IN UINT8 *NextCpuFeatureMask)
#define CPU_REGISTER_TABLE_WRITE32(ProcessorNumber, RegisterType, Index, Value)
UINT32 EFIAPI InterlockedIncrement(IN volatile UINT32 *Value)
SPIN_LOCK *EFIAPI AcquireSpinLock(IN OUT SPIN_LOCK *SpinLock)
UINT32 EFIAPI InterlockedCompareExchange32(IN OUT volatile UINT32 *Value, IN UINT32 CompareValue, IN UINT32 ExchangeValue)
SPIN_LOCK *EFIAPI ReleaseSpinLock(IN OUT SPIN_LOCK *SpinLock)
UINT64 EFI_PHYSICAL_ADDRESS
#define EFI_SIZE_TO_PAGES(Size)
UINT64 EFIAPI AsmMsrBitFieldWrite64(IN UINT32 Index, IN UINTN StartBit, IN UINTN EndBit, IN UINT64 Value)
EFI_CPU_PHYSICAL_LOCATION Location
EFI_PROCESSOR_INFORMATION ProcessorInfo
REGISTER_CPU_FEATURE_FIRST_PROCESSOR First