19#include <Protocol/MpService.h>
20#include <Library/BaseLib.h>
21#include <Library/BaseMemoryLib.h>
22#include <Library/BaseOverflowLib.h>
23#include <Library/DebugLib.h>
25#include <Library/MemoryAllocationLib.h>
26#include <Library/UefiBootServicesTableLib.h>
28#include <Register/Microcode.h>
29#include <Register/Msr.h>
30#include <Register/Intel/Msr/SandyBridgeMsr.h>
31#include <Register/Intel/Msr/NehalemMsr.h>
38 IN EFI_MP_SERVICES_PROTOCOL *MpServices,
40 OUT UINTN *NumberOfProcessors,
41 OUT UINTN *NumberOfEnabledProcessors
46 EFI_PROCESSOR_INFORMATION Info;
48 ASSERT (MpServices != NULL);
50 ASSERT (NumberOfProcessors != NULL);
51 ASSERT (NumberOfEnabledProcessors != NULL);
53 Status = MpServices->GetNumberOfProcessors (
56 NumberOfEnabledProcessors
59 if (EFI_ERROR (Status)) {
63 if (*NumberOfProcessors == 0) {
70 for (Index = 0; Index < *NumberOfProcessors; ++Index) {
71 Status = MpServices->GetProcessorInfo (MpServices, Index, &Info);
73 if (EFI_ERROR (Status)) {
76 "OCCPU: Failed to get info for processor %Lu - %r\n",
84 if (Info.Location.Package + 1 >= Cpu->PackageCount) {
85 Cpu->PackageCount = (UINT16)(Info.Location.Package + 1);
88 if (Info.Location.Core + 1 >= Cpu->CoreCount) {
89 Cpu->CoreCount = (UINT16)(Info.Location.Core + 1);
92 if (Info.Location.Thread + 1 >= Cpu->ThreadCount) {
93 Cpu->ThreadCount = (UINT16)(Info.Location.Thread + 1);
105 OUT UINTN *NumberOfProcessors,
106 OUT UINTN *NumberOfEnabledProcessors
114 ASSERT (FrameworkMpServices != NULL);
116 ASSERT (NumberOfProcessors != NULL);
117 ASSERT (NumberOfEnabledProcessors != NULL);
119 Status = FrameworkMpServices->GetGeneralMPInfo (
123 NumberOfEnabledProcessors,
128 if (EFI_ERROR (Status)) {
132 if (*NumberOfProcessors == 0) {
133 return EFI_NOT_FOUND;
139 for (Index = 0; Index < *NumberOfProcessors; ++Index) {
140 ContextSize =
sizeof (Context);
142 Status = FrameworkMpServices->GetProcessorContext (
149 if (EFI_ERROR (Status)) {
152 "OCCPU: Failed to get context for processor %Lu - %r\n",
200 EFI_MP_SERVICES_PROTOCOL *MpServices;
202 UINTN NumberOfProcessors;
203 UINTN NumberOfEnabledProcessors;
205 Cpu->PackageCount = 1;
207 Cpu->ThreadCount = 1;
208 NumberOfProcessors = 0;
209 NumberOfEnabledProcessors = 0;
211 Status =
gBS->LocateProtocol (
217 if (EFI_ERROR (Status)) {
218 Status =
gBS->LocateProtocol (
221 (VOID **)&FrameworkMpServices
224 if (EFI_ERROR (Status)) {
225 DEBUG ((DEBUG_INFO,
"OCCPU: No MP services - %r\n", Status));
233 &NumberOfEnabledProcessors
240 &NumberOfEnabledProcessors
246 "OCCPU: MP services threads %Lu (enabled %Lu) - %r\n",
247 (UINT64)NumberOfProcessors,
248 (UINT64)NumberOfEnabledProcessors,
252 if (EFI_ERROR (Status)) {
258 "OCCPU: MP services Pkg %u Cores %u Threads %u - %r\n",
268 if (Cpu->ThreadCount < Cpu->CoreCount) {
269 Cpu->ThreadCount = Cpu->CoreCount;
279 OUT UINT8 *MaxBusRatio,
280 OUT UINT8 *MaxBusRatioDiv
283 MSR_IA32_PERF_STATUS_REGISTER PerfStatus;
284 MSR_NEHALEM_PLATFORM_INFO_REGISTER PlatformInfo;
285 CPUID_VERSION_INFO_EAX Eax;
288 ASSERT (MaxBusRatio != NULL);
289 ASSERT (MaxBusRatioDiv != NULL);
291 if (CpuInfo != NULL) {
292 CpuModel = CpuInfo->Model;
304 CpuModel = (UINT8)Eax.Bits.Model | (UINT8)(Eax.Bits.ExtendedModelId << 4U);
311 PlatformInfo.Uint64 =
AsmReadMsr64 (MSR_NEHALEM_PLATFORM_INFO);
312 *MaxBusRatio = (UINT8)PlatformInfo.Bits.MaximumNonTurboRatio;
315 PerfStatus.Uint64 =
AsmReadMsr64 (MSR_IA32_PERF_STATUS);
316 *MaxBusRatio = (UINT8)(
RShiftU64 (PerfStatus.Uint64, 40) & 0x1FU);
317 *MaxBusRatioDiv = (UINT8)(
RShiftU64 (PerfStatus.Uint64, 46) & BIT0);
323 if (*MaxBusRatio == 0) {
335 UINT8 MaxBusRatioDiv;
342 if (CpuInfo->FSBFrequency > 0) {
352 if (CpuInfo->CPUFrequency > 0) {
353 if (MaxBusRatioDiv == 0) {
354 CpuInfo->FSBFrequency =
DivU64x32 (CpuInfo->CPUFrequency, MaxBusRatio);
356 CpuInfo->FSBFrequency = BaseMultThenDivU64x64x32 (
357 CpuInfo->CPUFrequency,
367 CpuInfo->FSBFrequency = 100000000;
372 "OCCPU: Intel TSC: %11LuHz, %5LuMHz; FSB: %11LuHz, %5LuMHz; MaxBusRatio: %u%a\n",
373 CpuInfo->CPUFrequency,
374 DivU64x32 (CpuInfo->CPUFrequency, 1000000),
375 CpuInfo->FSBFrequency,
376 DivU64x32 (CpuInfo->FSBFrequency, 1000000),
378 MaxBusRatioDiv != 0 ?
".5" :
""
384 IN UINT64 FSBFrequency
388 UINT8 MaxBusRatioDiv;
395 if (MaxBusRatioDiv == 1) {
396 return FSBFrequency * MaxBusRatio + FSBFrequency / 2;
399 return FSBFrequency * MaxBusRatio;
408 UINT8 AppleMajorType;
419 DEBUG ((DEBUG_INFO,
"OCCPU: Detected Apple Processor Type: %02X -> %04X\n", AppleMajorType, Cpu->AppleProcessorType));
429 CPUID_CACHE_PARAMS_EAX CpuidCacheEax;
430 CPUID_CACHE_PARAMS_EBX CpuidCacheEbx;
431 CPUID_EXTENDED_TOPOLOGY_EAX CpuidExTopologyEax;
432 CPUID_EXTENDED_TOPOLOGY_EBX CpuidExTopologyEbx;
433 CPUID_EXTENDED_TOPOLOGY_ECX CpuidExTopologyEcx;
434 MSR_SANDY_BRIDGE_PKG_CST_CONFIG_CONTROL_REGISTER PkgCstConfigControl;
436 CONST CHAR8 *TimerSourceType;
440 if ( ((Cpu->Family != 0x06) || (Cpu->Model < 0x0c))
441 && ((Cpu->Family != 0x0f) || (Cpu->Model < 0x03)))
454 PkgCstConfigControl.Uint64 =
AsmReadMsr64 (MSR_SANDY_BRIDGE_PKG_CST_CONFIG_CONTROL);
455 Cpu->CstConfigLock = PkgCstConfigControl.Bits.CFGLock == 1;
457 Cpu->CstConfigLock = FALSE;
460 DEBUG ((DEBUG_INFO,
"OCCPU: EIST CFG Lock %d\n", Cpu->CstConfigLock));
467 if (Cpu->CPUFrequencyFromVMT == 0) {
483 &Cpu->CPUFrequencyFromART,
491 if ((Cpu->CPUFrequencyFromART == 0) || Recalculate) {
494 DEBUG ((DEBUG_INFO,
"OCCPU: Timer address is %Lx from %a\n", (UINT64)TimerAddr, TimerSourceType));
497 if ((Cpu->CPUFrequencyFromApple == 0) || Recalculate) {
505 if (Cpu->CPUFrequencyFromART != 0) {
506 Cpu->CPUFrequency = Cpu->CPUFrequencyFromART;
511 if (Cpu->CPUFrequencyFromApple != 0) {
512 Cpu->CPUFrequency = Cpu->CPUFrequencyFromApple;
517 Cpu->CPUFrequency = Cpu->CPUFrequencyFromTSC;
524 if ( (Cpu->CPUFrequencyFromART > 0) && (Cpu->CPUFrequencyFromTSC > 0)
529 "OCCPU: ART based CPU frequency differs substantially from TSC: %11LuHz != %11LuHz\n",
530 Cpu->CPUFrequencyFromART,
531 Cpu->CPUFrequencyFromTSC
538 if ( (Cpu->CPUFrequencyFromApple > 0) && (Cpu->CPUFrequencyFromTSC > 0)
543 "OCCPU: Apple based CPU frequency differs substantially from TSC: %11LuHz != %11LuHz\n",
544 Cpu->CPUFrequencyFromApple,
545 Cpu->CPUFrequencyFromTSC
556 if ( (Cpu->MaxId >= CPUID_CACHE_PARAMS)
563 AsmCpuidEx (CPUID_CACHE_PARAMS, 0, &CpuidCacheEax.Uint32, &CpuidCacheEbx.Uint32, NULL, NULL);
564 if (CpuidCacheEax.Bits.CacheType != CPUID_CACHE_PARAMS_CACHE_TYPE_NULL) {
565 CoreCount = (UINT16)GetPowerOfTwo32 (CpuidCacheEax.Bits.MaximumAddressableIdsForProcessorCores + 1);
566 if (CoreCount < CpuidCacheEax.Bits.MaximumAddressableIdsForProcessorCores + 1) {
570 Cpu->CoreCount = CoreCount;
575 if (Cpu->ThreadCount < Cpu->CoreCount) {
576 Cpu->ThreadCount = Cpu->CoreCount;
586 AsmCpuidEx (CPUID_EXTENDED_TOPOLOGY, 0, &CpuidExTopologyEax.Uint32, &CpuidExTopologyEbx.Uint32, &CpuidExTopologyEcx.Uint32, NULL);
589 AsmCpuidEx (CPUID_EXTENDED_TOPOLOGY, 1, &CpuidExTopologyEax.Uint32, &CpuidExTopologyEbx.Uint32, &CpuidExTopologyEcx.Uint32, NULL);
590 Cpu->CoreCount = (UINT16)GetPowerOfTwo32 (CpuidExTopologyEbx.Bits.LogicalProcessors);
591 Cpu->ThreadCount = Cpu->CoreCount;
594 Cpu->CoreCount = (UINT16)BitFieldRead64 (Msr, 16, 19);
595 Cpu->ThreadCount = (UINT16)BitFieldRead64 (Msr, 0, 15);
602 Cpu->ThreadCount = 0;
604 && (Cpu->MaxId < CPUID_CACHE_PARAMS))
613 Cpu->CoreCount = (UINT16)BitFieldRead64 (Msr, 16, 31);
614 Cpu->ThreadCount = (UINT16)BitFieldRead64 (Msr, 0, 15);
617 if (Cpu->CoreCount == 0) {
621 if (Cpu->ThreadCount == 0) {
622 Cpu->ThreadCount = 1;
637 UINT8 CoreFrequencyID;
661 if (Cpu->CPUFrequencyFromVMT == 0) {
663 Cpu->CPUFrequency = Cpu->CPUFrequencyFromTSC;
669 if (Cpu->MaxExtId >= 0x80000008) {
670 AsmCpuid (0x80000008, NULL, NULL, &CpuidEcx, NULL);
671 Cpu->ThreadCount = (UINT16)(BitFieldRead32 (CpuidEcx, 0, 7) + 1);
680 if (Cpu->ThreadCount >= 8) {
692 switch (Cpu->ExtFamily) {
694 if (Cpu->CPUFrequencyFromVMT == 0) {
696 CoreFrequencyID = (UINT8)BitFieldRead64 (CofVid, 0, 11);
703 if (CoreFrequencyID > 0x0f) {
704 CoreFrequencyID *= 5;
707 MaxBusRatio = (UINT8)(CoreFrequencyID);
713 if (Cpu->MaxExtId >= 0x8000001E) {
714 AsmCpuid (0x8000001E, NULL, &CpuidEbx, NULL, NULL);
717 (BitFieldRead32 (CpuidEbx, 8, 15) + 1)
724 if (Cpu->CPUFrequencyFromVMT == 0) {
726 CoreFrequencyID = (UINT8)BitFieldRead64 (CofVid, 0, 7);
727 CoreDivisorID = (UINT8)BitFieldRead64 (CofVid, 8, 13);
728 if (CoreDivisorID > 0ULL) {
733 MaxBusRatio = (UINT8)(CoreFrequencyID / CoreDivisorID * 2);
740 if (Cpu->MaxExtId >= 0x8000001E) {
741 AsmCpuid (0x8000001E, NULL, &CpuidEbx, NULL, NULL);
744 (BitFieldRead32 (CpuidEbx, 8, 15) + 1)
752 if (Cpu->CPUFrequencyFromVMT == 0) {
755 CoreFrequencyID = (UINT8)BitFieldRead64 (CofVid, 0, 5);
756 CoreDivisorID = (UINT8)BitFieldRead64 (CofVid, 6, 8);
757 Divisor = 1U << CoreDivisorID;
763 if (Divisor > 0ULL) {
768 MaxBusRatio = (UINT8)((CoreFrequencyID + 0x10) / Divisor);
776 Cpu->CoreCount = Cpu->ThreadCount;
779 if (Cpu->CPUFrequencyFromVMT == 0) {
782 CoreFrequencyID = (UINT8)BitFieldRead64 (CofVid, 0, 5);
786 MaxBusRatio = (CoreFrequencyID / 2) + 4;
793 Cpu->CoreCount = Cpu->ThreadCount;
801 "OCCPU: FID %u DID %u Divisor %u MaxBR %u\n",
811 if (Cpu->CPUFrequencyFromVMT == 0) {
815 if (MaxBusRatio == 0) {
816 Cpu->FSBFrequency = 100000000;
818 Cpu->FSBFrequency =
DivU64x32 (Cpu->CPUFrequency, CoreFrequencyID);
820 Cpu->FSBFrequency =
DivU64x32 (Cpu->CPUFrequency, MaxBusRatio);
848 AsmCpuid (CPUID_SIGNATURE, &CpuidEax, &Cpu->Vendor[0], &Cpu->Vendor[2], &Cpu->Vendor[1]);
850 Cpu->MaxId = CpuidEax;
855 AsmCpuid (CPUID_EXTENDED_FUNCTION, &CpuidEax, &CpuidEbx, &CpuidEcx, &CpuidEdx);
857 Cpu->MaxExtId = CpuidEax;
862 if (Cpu->MaxExtId >= CPUID_BRAND_STRING3) {
866 UINT32 *BrandString = (UINT32 *)Cpu->BrandString;
898 if (Cpu->MaxId >= CPUID_VERSION_INFO) {
905 &Cpu->CpuidVerEax.Uint32,
906 &Cpu->CpuidVerEbx.Uint32,
907 &Cpu->CpuidVerEcx.Uint32,
908 &Cpu->CpuidVerEdx.Uint32
911 Cpu->Signature = Cpu->CpuidVerEax.Uint32;
912 Cpu->Stepping = (UINT8)Cpu->CpuidVerEax.Bits.SteppingId;
913 Cpu->ExtModel = (UINT8)Cpu->CpuidVerEax.Bits.ExtendedModelId;
914 Cpu->Model = (UINT8)Cpu->CpuidVerEax.Bits.Model | (UINT8)(Cpu->CpuidVerEax.Bits.ExtendedModelId << 4U);
915 Cpu->Family = (UINT8)Cpu->CpuidVerEax.Bits.FamilyId;
916 Cpu->Type = (UINT8)Cpu->CpuidVerEax.Bits.ProcessorType;
917 Cpu->ExtFamily = (UINT8)Cpu->CpuidVerEax.Bits.ExtendedFamilyId;
918 Cpu->Brand = (UINT8)Cpu->CpuidVerEbx.Bits.BrandIndex;
919 Cpu->Features =
LShiftU64 (Cpu->CpuidVerEcx.Uint32, 32) | Cpu->CpuidVerEdx.Uint32;
922 Cpu->ThreadCount = (UINT16)Cpu->CpuidVerEbx.Bits.MaximumAddressableIdsForLogicalProcessors;
929 if (Cpu->MaxExtId >= CPUID_EXTENDED_CPU_SIG) {
931 CPUID_EXTENDED_CPU_SIG,
934 &Cpu->CpuidExtSigEcx.Uint32,
935 &Cpu->CpuidExtSigEdx.Uint32
938 Cpu->ExtFeatures =
LShiftU64 (Cpu->CpuidExtSigEcx.Uint32, 32) | Cpu->CpuidExtSigEdx.Uint32;
941 DEBUG ((DEBUG_INFO,
"OCCPU: Found %a\n", Cpu->BrandString));
945 "OCCPU: Signature %0X Stepping %0X Model %0X Family %0X Type %0X ExtModel %0X ExtFamily %0X uCode %0X CPUID MAX (%0X/%0X)\n",
953 Cpu->MicrocodeRevision,
963 if (Cpu->Hypervisor) {
964 DEBUG ((DEBUG_INFO,
"OCCPU: Hypervisor detected\n"));
967 if (Cpu->CPUFrequencyFromVMT > 0) {
968 Cpu->CPUFrequency = Cpu->CPUFrequencyFromVMT;
972 "OCCPU: VMWare TSC: %11LuHz, %5LuMHz; FSB: %11LuHz, %5LuMHz\n",
985 DEBUG ((DEBUG_WARN,
"OCCPU: Found unsupported CPU vendor: %0X", Cpu->Vendor[0]));
997 Cpu->ExternalClock = (UINT16)
DivU64x32 (Cpu->FSBFrequency, 1000000);
1001 if ((Cpu->ExternalClock >= 99) && (Cpu->ExternalClock <= 101)) {
1002 Cpu->ExternalClock = 100;
1003 }
else if ((Cpu->ExternalClock >= 132) && (Cpu->ExternalClock <= 134)) {
1004 Cpu->ExternalClock = 133;
1005 }
else if ((Cpu->ExternalClock >= 265) && (Cpu->ExternalClock <= 267)) {
1006 Cpu->ExternalClock = 266;
1011 "OCCPU: CPUFrequencyFromTSC %11LuHz %5LuMHz\n",
1012 Cpu->CPUFrequencyFromTSC,
1013 DivU64x32 (Cpu->CPUFrequencyFromTSC, 1000000)
1016 if (Cpu->CPUFrequencyFromApple > 0) {
1019 "OCCPU: CPUFrequencyFromApple %11LuHz %5LuMHz\n",
1020 Cpu->CPUFrequencyFromApple,
1021 DivU64x32 (Cpu->CPUFrequencyFromApple, 1000000)
1027 "OCCPU: CPUFrequency %11LuHz %5LuMHz\n",
1034 "OCCPU: FSBFrequency %11LuHz %5LuMHz\n",
1041 "OCCPU: Pkg %u Cores %u Threads %u\n",
1054 ASSERT (CpuInfo != NULL);
1057 ZeroMem (Report,
sizeof (*Report));
1070 if (CpuInfo->Hypervisor) {
1078 Report->CpuHasMsrPlatformInfo = TRUE;
1079 Report->CpuMsrPlatformInfoValue =
AsmReadMsr64 (MSR_NEHALEM_PLATFORM_INFO);
1084 Report->CpuHasMsrTurboRatioLimit = TRUE;
1085 Report->CpuMsrTurboRatioLimitValue =
AsmReadMsr64 (MSR_NEHALEM_TURBO_RATIO_LIMIT);
1091 Report->CpuHasMsrPkgPowerInfo = TRUE;
1092 Report->CpuMsrPkgPowerInfoValue =
AsmReadMsr64 (MSR_GOLDMONT_PKG_POWER_INFO);
1097 Report->CpuHasMsrE2 = TRUE;
1098 Report->CpuMsrE2Value =
AsmReadMsr64 (MSR_BROADWELL_PKG_CST_CONFIG_CONTROL);
1105 Report->CpuHasMsrIa32ExtConfig = TRUE;
1111 Report->CpuHasMsrFsbFreq = TRUE;
1112 Report->CpuMsrFsbFreqValue =
AsmReadMsr64 (MSR_CORE_FSB_FREQ);
1118 Report->CpuHasMsrIa32MiscEnable = TRUE;
1119 Report->CpuMsrIa32MiscEnableValue =
AsmReadMsr64 (MSR_IA32_MISC_ENABLE);
1124 Report->CpuHasMsrIa32PerfStatus = TRUE;
1125 Report->CpuMsrIa32PerfStatusValue =
AsmReadMsr64 (MSR_IA32_PERF_STATUS);
1145 if (EFI_ERROR (Status)) {
1155 OUT UINTN *EntryCount
1160 EFI_MP_SERVICES_PROTOCOL *MpServices;
1161 UINTN NumberOfProcessors;
1162 UINTN NumberOfEnabledProcessors;
1165 ASSERT (CpuInfo != NULL);
1166 ASSERT (EntryCount != NULL);
1170 Status =
gBS->LocateProtocol (
1173 (VOID **)&MpServices
1175 if (!EFI_ERROR (Status)) {
1176 Status = MpServices->GetNumberOfProcessors (
1178 &NumberOfProcessors,
1179 &NumberOfEnabledProcessors
1181 if (EFI_ERROR (Status)) {
1182 DEBUG ((DEBUG_INFO,
"OCCPU: Failed to get the number of processors - %r, assuming one core\n", Status));
1183 NumberOfProcessors = 1;
1186 DEBUG ((DEBUG_INFO,
"OCCPU: Failed to find mp services - %r, assuming one core\n", Status));
1188 NumberOfProcessors = 1;
1192 if (Reports == NULL) {
1203 if (MpServices != NULL) {
1211 Status = MpServices->StartupAllAPs (
1225 *EntryCount = NumberOfProcessors;
1244 FlexRatio = BitFieldRead64 (Msr, 8, 15);
1245 if (FlexRatio == 0) {
1260 CPUID_VERSION_INFO_ECX RegEcx;
1261 MSR_IA32_FEATURE_CONTROL_REGISTER Msr;
1263 AsmCpuid (1, 0, 0, &RegEcx.Uint32, 0);
1264 if (RegEcx.Bits.VMX == 0) {
1265 return EFI_UNSUPPORTED;
1269 if (Msr.Bits.Lock != 0) {
1270 return EFI_WRITE_PROTECTED;
1277 Msr.Bits.EnableVmxOutsideSmx = 1;
1330 EFI_MP_SERVICES_PROTOCOL *MpServices;
1334 BOOLEAN InterruptState;
1336 if (Cpu->ThreadCount <= 1) {
1337 DEBUG ((DEBUG_INFO,
"OCCPU: Thread count is too low for sync - %u\n", Cpu->ThreadCount));
1338 return EFI_UNSUPPORTED;
1341 Status =
gBS->LocateProtocol (
1344 (VOID **)&MpServices
1347 if (EFI_ERROR (Status)) {
1349 Status =
gBS->LocateProtocol (
1352 (VOID **)&FrameworkMpServices
1355 if (EFI_ERROR (Status)) {
1356 DEBUG ((DEBUG_INFO,
"OCCPU: Failed to find mp services - %r\n", Status));
1364 OldTpl =
gBS->RaiseTPL (TPL_HIGH_LEVEL);
1365 InterruptState = SaveAndDisableInterrupts ();
1367 if (Cpu->TscAdjust > 0) {
1368 if (MpServices != NULL) {
1369 Status = MpServices->StartupAllAPs (MpServices,
ResetAdjustTsc, FALSE, NULL, Timeout, &Sync, NULL);
1378 if (MpServices != NULL) {
1379 Status = MpServices->StartupAllAPs (MpServices,
SyncTscOnCpu, FALSE, NULL, Timeout, &Sync, NULL);
1387 SetInterruptState (InterruptState);
1388 gBS->RestoreTPL (OldTpl);
1390 DEBUG ((DEBUG_INFO,
"OCCPU: Completed TSC sync with code - %r\n", Status));
1403 if (CpuInfo->Family == 6) {
1404 switch (CpuInfo->Model) {
1466 if (CpuInfo->Stepping == 9) {
1516 "OCCPU: Discovered CpuFamily %d CpuModel %d CpuStepping %d CpuGeneration %d\n",
1523 return CpuGeneration;
UINT16 InternalDetectAppleProcessorType(IN UINT8 Model, IN UINT8 Stepping, IN UINT8 AppleMajorType, IN UINT16 CoreCount, IN BOOLEAN Is64Bit)
UINT8 InternalDetectAppleMajorType(IN CONST CHAR8 *BrandString)
@ AppleProcessorTypeXeonW
@ AppleProcessorTypeCorei5Type5
#define CPUID_EXTFEATURE_EM64T
Extended Mem 64 Technology.
#define CPUID_VENDOR_INTEL
#define CPUID_FEATURE_HTT
Hyper-Threading Technology.
EFI_GUID gFrameworkEfiMpServiceProtocolGuid
UINTN InternalGetPmTimerAddr(OUT CONST CHAR8 **Type OPTIONAL)
UINT64 InternalCalculateVMTFrequency(OUT UINT64 *FSBFrequency OPTIONAL, OUT BOOLEAN *UnderHypervisor OPTIONAL)
UINT64 InternalCalculateARTFrequencyIntel(OUT UINT64 *CPUFrequency, OUT UINT64 *TscAdjustPtr OPTIONAL, IN BOOLEAN Recalculate)
UINT64 InternalCalculateTSCFromApplePlatformInfo(OUT UINT64 *FSBFrequency OPTIONAL, IN BOOLEAN Recalculate)
UINT64 InternalCalculateTSCFromPMTimer(IN BOOLEAN Recalculate)
UINT32 EFIAPI AsmReadIntelMicrocodeRevision(VOID)
#define OC_CPU_FREQUENCY_TOLERANCE
UINT32 EFIAPI AsmIncrementUint32(IN volatile UINT32 *Value)
STATIC VOID EFIAPI SyncTscOnCpu(IN VOID *Buffer)
STATIC EFI_STATUS ScanThreadCount(OUT OC_CPU_INFO *Cpu)
EFI_STATUS OcCpuEnableVmx(VOID)
EFI_STATUS OcCpuCorrectTscSync(IN OC_CPU_INFO *Cpu, IN UINTN Timeout)
OC_CPU_GENERATION InternalDetectIntelProcessorGeneration(IN OC_CPU_INFO *CpuInfo)
VOID OcCpuScanProcessor(IN OUT OC_CPU_INFO *Cpu)
STATIC VOID ScanIntelProcessorApple(IN OUT OC_CPU_INFO *Cpu)
VOID OcCpuCorrectFlexRatio(IN OC_CPU_INFO *Cpu)
VOID OcCpuGetMsrReport(IN OC_CPU_INFO *CpuInfo, OUT OC_CPU_MSR_REPORT *Report)
STATIC EFI_STATUS ScanFrameworkMpServices(IN FRAMEWORK_EFI_MP_SERVICES_PROTOCOL *FrameworkMpServices, OUT OC_CPU_INFO *Cpu, OUT UINTN *NumberOfProcessors, OUT UINTN *NumberOfEnabledProcessors)
VOID EFIAPI OcCpuGetMsrReportPerCore(IN OUT VOID *Buffer)
STATIC VOID EFIAPI ResetAdjustTsc(IN VOID *Buffer)
OC_CPU_MSR_REPORT * OcCpuGetMsrReports(IN OC_CPU_INFO *CpuInfo, OUT UINTN *EntryCount)
STATIC VOID ScanAmdProcessor(IN OUT OC_CPU_INFO *Cpu)
STATIC EFI_STATUS ScanMpServices(IN EFI_MP_SERVICES_PROTOCOL *MpServices, OUT OC_CPU_INFO *Cpu, OUT UINTN *NumberOfProcessors, OUT UINTN *NumberOfEnabledProcessors)
STATIC VOID SetMaxBusRatioAndMaxBusRatioDiv(IN OC_CPU_INFO *CpuInfo OPTIONAL, OUT UINT8 *MaxBusRatio, OUT UINT8 *MaxBusRatioDiv)
UINT64 InternalConvertAppleFSBToTSCFrequency(IN UINT64 FSBFrequency)
STATIC VOID ScanIntelProcessor(IN OUT OC_CPU_INFO *Cpu)
STATIC VOID ScanIntelFSBFrequency(IN OC_CPU_INFO *CpuInfo)
@ OcCpuGenerationBroadwell
@ OcCpuGenerationRaptorLake
@ OcCpuGenerationWestmere
@ OcCpuGenerationCoffeeLake
@ OcCpuGenerationArrowLake
@ OcCpuGenerationSilvermont
@ OcCpuGenerationIvyBridge
@ OcCpuGenerationTigerLake
@ OcCpuGenerationKabyLake
@ OcCpuGenerationSandyBridge
@ OcCpuGenerationRocketLake
@ OcCpuGenerationAlderLake
@ OcCpuGenerationCometLake
@ OcCpuGenerationYonahMerom
@ OcCpuGenerationPostSandyBridge
@ OcCpuGenerationCannonLake
@ OcCpuGenerationPreYonah
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
#define AMD_CPU_EXT_FAMILY_17H
#define CPU_MODEL_SKYLAKE_W
#define CPU_MODEL_IVYBRIDGE_EP
#define CPU_MODEL_TIGERLAKE_U
#define AMD_CPU_EXT_FAMILY_19H
#define K10_PSTATE_STATUS
#define CPU_MODEL_MEROM
Allendale, Conroe, Kentsfield, Woodcrest, Clovertown, Tigerton, Merom.
#define CPU_MODEL_IVYBRIDGE
Ivy Bridge.
#define K10_COFVID_STATUS
#define CPU_MODEL_ARROWLAKE_U
#define CPU_MODEL_ROCKETLAKE_S
desktop RocketLake
#define CPU_MODEL_SKYLAKE_DT
#define CPU_MODEL_CANNONLAKE
#define CPU_MODEL_AIRMONT
CherryTrail / Braswell.
#define CPU_MODEL_BANIAS
Banias.
#define CPU_MODEL_ARROWLAKE_S
desktop ArrowLake
#define CPU_MODEL_SILVERMONT
Bay Trail.
#define CPU_MODEL_ARROWLAKE_HX
#define CPU_MODEL_RAPTORLAKE_S
Raptor Lake B0 stepping.
#define CPU_MODEL_JAKETOWN
Sandy Bridge Xeon E5, Core i7 Extreme.
#define CPU_MODEL_YONAH
Sossaman, Yonah.
#define CPU_MODEL_BROADWELL_EP
Broadwell_EP.
#define CPU_MODEL_COMETLAKE_S
desktop CometLake
#define CPU_MODEL_NEHALEM
Bloomfield, Nehalem-EP, Nehalem-WS, Gainestown.
#define CPU_MODEL_COMETLAKE_U
#define AMD_CPU_EXT_FAMILY_16H
#define AMD_CPU_EXT_FAMILY_10H
#define CPU_MODEL_BRYSTALWELL
#define CPU_MODEL_ICELAKE_U
#define CPU_MODEL_HASWELL
#define CPU_MODEL_CRYSTALWELL
#define CPU_MODEL_WESTMERE
Gulftown, Westmere-EP, Westmere-WS.
#define CPU_MODEL_WESTMERE_EX
#define CPU_MODEL_HASWELL_ULT
Haswell ULT.
#define CPU_MODEL_ICELAKE_Y
#define AMD_CPU_EXT_FAMILY_15H
#define CPU_MODEL_PENRYN
Wolfdale, Yorkfield, Harpertown, Penryn.
#define CPU_MODEL_RAPTORLAKE_HX
Raptor Lake C0 stepping.
#define CPU_MODEL_HASWELL_EP
Haswell MB.
#define CPU_MODEL_SKYLAKE
Skylake-S.
#define CPU_MODEL_FIELDS
Lynnfield, Clarksfield, Jasper Forest.
#define CPU_MODEL_AVOTON
Avaton/Rangely.
#define MSR_CORE_THREAD_COUNT
#define AMD_CPU_EXT_FAMILY_0FH
#define MSR_IA32_EXT_CONFIG
#define CPU_MODEL_NEHALEM_EX
Beckton.
#define CPU_MODEL_DALES_32NM
Clarkdale, Arrandale.
#define AMD_CPU_EXT_FAMILY_1AH
#define CPU_MODEL_ALDERLAKE_S
#define CPU_MODEL_ICELAKE_SP
Some variation of Ice Lake.
#define CPU_MODEL_DOTHAN
Dothan.
#define CPU_MODEL_BONNELL
Bonnell, Silverthorne, Diamondville, Pineview.
#define CPU_MODEL_BROADWELL
Broadwell.
#define CPU_MODEL_GOLDMONT
Apollo Lake.
#define CPU_MODEL_KABYLAKE_DT
#define CPU_MODEL_KABYLAKE
Kabylake Dektop.
#define CPU_MODEL_DALES
Havendale, Auburndale.
#define CPU_MODEL_BONNELL_MID
Bonnell, Lincroft.
#define CPU_MODEL_SANDYBRIDGE
Sandy Bridge.
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
EFI_GUID gEfiMpServiceProtocolGuid
UINT64 EFIAPI RShiftU64(IN UINT64 Operand, IN UINTN Count)
UINT64 EFIAPI LShiftU64(IN UINT64 Operand, IN UINTN Count)
UINT64 EFIAPI AsmReadTsc(VOID)
UINT32 AsmCpuid(IN UINT32 Index, OUT UINT32 *Eax, OPTIONAL OUT UINT32 *Ebx, OPTIONAL OUT UINT32 *Ecx, OPTIONAL OUT UINT32 *Edx OPTIONAL)
UINT32 AsmCpuidEx(IN UINT32 Index, IN UINT32 SubIndex, OUT UINT32 *Eax, OPTIONAL OUT UINT32 *Ebx, OPTIONAL OUT UINT32 *Ecx, OPTIONAL OUT UINT32 *Edx OPTIONAL)
UINT64 EFIAPI AsmReadMsr64(IN UINT32 Index)
UINT64 EFIAPI AsmWriteMsr64(IN UINT32 Index, IN UINT64 Value)
#define DivU64x32(x, y, z)
FRAMEWORK_EFI_MP_SERVICES_STARTUP_ALL_APS StartupAllAPs
OC_CPU_MSR_REPORT * Reports
EFI_MP_SERVICES_PROTOCOL * MpServices
volatile UINT32 CurrentCount