OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
CpuInfoDump.c
Go to the documentation of this file.
1
15#include <Library/BaseLib.h>
16#include <Library/DebugLib.h>
17#include <Library/MemoryAllocationLib.h>
18#include <Library/PrintLib.h>
20#include <Library/OcStringLib.h>
21
22EFI_STATUS
24 IN OC_CPU_INFO *CpuInfo,
25 IN EFI_FILE_PROTOCOL *Root
26 )
27{
28 EFI_STATUS Status;
29 OC_CPU_MSR_REPORT *Reports;
30 UINTN EntryCount;
31 UINTN Index;
32
33 CHAR8 *FileBuffer;
34 UINTN FileBufferSize;
35 CHAR16 TmpFileName[32];
36
37 ASSERT (CpuInfo != NULL);
38 ASSERT (Root != NULL);
39
40 FileBufferSize = SIZE_1KB;
41 FileBuffer = AllocateZeroPool (FileBufferSize);
42 if (FileBuffer == NULL) {
43 return EFI_OUT_OF_RESOURCES;
44 }
45
46 //
47 // Firstly, dump basic CPU info.
48 //
50 &FileBuffer,
51 &FileBufferSize,
52 "CPU BrandString: %a\nMicrocodeRevision: 0x%08X\nVirtualization %d\n",
53 CpuInfo->BrandString,
54 CpuInfo->MicrocodeRevision,
55 CpuInfo->Hypervisor
56 );
58 &FileBuffer,
59 &FileBufferSize,
60 "CPUID %08X %08X %08X %08X\nExtSigEcx %08X\nExtSigEdx %08X\n",
61 CpuInfo->CpuidVerEax.Uint32,
62 CpuInfo->CpuidVerEbx.Uint32,
63 CpuInfo->CpuidVerEcx.Uint32,
64 CpuInfo->CpuidVerEdx.Uint32,
65 CpuInfo->CpuidExtSigEcx.Uint32,
66 CpuInfo->CpuidExtSigEdx.Uint32
67 );
69 &FileBuffer,
70 &FileBufferSize,
71 "Type 0x%02X\nFamily 0x%02X\nModel 0x%02X\nExtModel 0x%02X\nExtFamily 0x%02X\nStepping 0x%02X\n",
72 CpuInfo->Type,
73 CpuInfo->Family,
74 CpuInfo->Model,
75 CpuInfo->ExtModel,
76 CpuInfo->ExtFamily,
77 CpuInfo->Stepping
78 );
80 &FileBuffer,
81 &FileBufferSize,
82 "Features 0x%16LX\nExtFeatures 0x%16LX\nSignature 0x%08X\n",
83 CpuInfo->Features,
84 CpuInfo->ExtFeatures,
85 CpuInfo->Signature
86 );
88 &FileBuffer,
89 &FileBufferSize,
90 "Brand 0x%02X\nAppleProcessorType 0x%04X\nCstConfigLock %d\nCpuGeneration %d\n",
91 CpuInfo->Brand,
92 CpuInfo->AppleProcessorType,
93 CpuInfo->CstConfigLock,
94 CpuInfo->CpuGeneration
95 );
97 &FileBuffer,
98 &FileBufferSize,
99 "MaxId 0x%08X\nMaxExtId 0x%08X\n",
100 CpuInfo->MaxId,
101 CpuInfo->MaxExtId
102 );
104 &FileBuffer,
105 &FileBufferSize,
106 "PackageCount %u\nCoreCount %u\nThreadCount %u\n",
107 CpuInfo->PackageCount,
108 CpuInfo->CoreCount,
109 CpuInfo->ThreadCount
110 );
112 &FileBuffer,
113 &FileBufferSize,
114 "ExternalClock %u\n",
115 CpuInfo->ExternalClock
116 );
118 &FileBuffer,
119 &FileBufferSize,
120 "ARTFrequency %Lu\nCPUFrequency %Lu\nCPUFrequencyFromTSC %Lu\nCPUFrequencyFromART %Lu\nTscAdjust %Lu\nCPUFrequencyFromApple %Lu\nCPUFrequencyFromVMT %Lu\nFSBFrequency %Lu\n\n",
121 CpuInfo->ARTFrequency,
122 CpuInfo->CPUFrequency,
123 CpuInfo->CPUFrequencyFromTSC,
124 CpuInfo->CPUFrequencyFromART,
125 CpuInfo->TscAdjust,
126 CpuInfo->CPUFrequencyFromApple,
127 CpuInfo->CPUFrequencyFromVMT,
128 CpuInfo->FSBFrequency
129 );
130
131 //
132 // Then, get reports of MSR status.
133 //
134 Reports = OcCpuGetMsrReports (CpuInfo, &EntryCount);
135 if (Reports == NULL) {
136 return EFI_UNSUPPORTED;
137 }
138
139 for (Index = 0; Index < EntryCount; ++Index) {
140 OcAsciiPrintBuffer (&FileBuffer, &FileBufferSize, "CPU%02u:\n", Index);
141
142 //
143 // MSR_PLATFORM_INFO
144 //
145 if (Reports[Index].CpuHasMsrPlatformInfo) {
146 OcAsciiPrintBuffer (&FileBuffer, &FileBufferSize, "MSR_PLATFORM_INFO: 0x%llX\n", Reports[Index].CpuMsrPlatformInfoValue);
147 }
148
149 //
150 // MSR_TURBO_RATIO_LIMIT
151 //
152 if (Reports[Index].CpuHasMsrTurboRatioLimit) {
153 OcAsciiPrintBuffer (&FileBuffer, &FileBufferSize, "MSR_TURBO_RATIO_LIMIT: 0x%llX\n", Reports[Index].CpuMsrTurboRatioLimitValue);
154 }
155
156 //
157 // MSR_PKG_POWER_INFO (TODO: To be confirmed)
158 //
159 if (Reports[Index].CpuHasMsrPkgPowerInfo) {
160 OcAsciiPrintBuffer (&FileBuffer, &FileBufferSize, "MSR_PKG_POWER_INFO: 0x%llX\n", Reports[Index].CpuMsrPkgPowerInfoValue);
161 }
162
163 //
164 // MSR_BROADWELL_PKG_CST_CONFIG_CONTROL_REGISTER (0xE2)
165 //
166 if (Reports[Index].CpuHasMsrE2) {
167 OcAsciiPrintBuffer (&FileBuffer, &FileBufferSize, "MSR_BROADWELL_PKG_CST_CONFIG_CONTROL_REGISTER (0xE2): 0x%llX\n", Reports[Index].CpuMsrPkgPowerInfoValue);
168 }
169
170 //
171 // MSR_IA32_MISC_ENABLE
172 //
173 if (Reports[Index].CpuHasMsrIa32MiscEnable) {
174 OcAsciiPrintBuffer (&FileBuffer, &FileBufferSize, "MSR_IA32_MISC_ENABLE: 0x%llX\n", Reports[Index].CpuMsrIa32MiscEnableValue);
175 }
176
177 //
178 // MSR_IA32_EXT_CONFIG
179 //
180 if (Reports[Index].CpuHasMsrIa32ExtConfig) {
181 OcAsciiPrintBuffer (&FileBuffer, &FileBufferSize, "MSR_IA32_EXT_CONFIG: 0x%llX\n", Reports[Index].CpuMsrIa32ExtConfigValue);
182 }
183
184 //
185 // MSR_FSB_FREQ
186 //
187 if (Reports[Index].CpuHasMsrFsbFreq) {
188 OcAsciiPrintBuffer (&FileBuffer, &FileBufferSize, "MSR_FSB_FREQ: 0x%llX\n", Reports[Index].CpuMsrFsbFreqValue);
189 }
190
191 //
192 // MSR_IA32_PERF_STATUS
193 //
194 if (Reports[Index].CpuHasMsrIa32PerfStatus) {
195 OcAsciiPrintBuffer (&FileBuffer, &FileBufferSize, "MSR_IA32_PERF_STATUS: 0x%llX\n", Reports[Index].CpuMsrIa32PerfStatusValue);
196 }
197
198 OcAsciiPrintBuffer (&FileBuffer, &FileBufferSize, "\n");
199 }
200
201 //
202 // Save dumped CPU info to file.
203 //
204 if (FileBuffer != NULL) {
205 UnicodeSPrint (TmpFileName, sizeof (TmpFileName), L"CPUInfo.txt");
206 Status = OcSetFileData (Root, TmpFileName, FileBuffer, (UINT32)AsciiStrLen (FileBuffer));
207 DEBUG ((DEBUG_INFO, "OCDM: Dumped CPU info - %r\n", Status));
208
209 FreePool (FileBuffer);
210 }
211
212 FreePool (Reports);
213
214 return EFI_SUCCESS;
215}
EFI_STATUS OcCpuInfoDump(IN OC_CPU_INFO *CpuInfo, IN EFI_FILE_PROTOCOL *Root)
Definition CpuInfoDump.c:23
OC_CPU_MSR_REPORT * OcCpuGetMsrReports(IN OC_CPU_INFO *CpuInfo, OUT UINTN *EntryCount)
Definition OcCpuLib.c:1153
EFI_STATUS OcSetFileData(IN EFI_FILE_PROTOCOL *WritableFs OPTIONAL, IN CONST CHAR16 *FileName, IN CONST VOID *Buffer, IN UINT32 Size)
VOID EFIAPI OcAsciiPrintBuffer(IN OUT CHAR8 **AsciiBuffer, IN OUT UINTN *AsciiBufferSize, IN CONST CHAR8 *FormatString,...)
Definition OcAsciiLib.c:510
#define ASSERT(x)
Definition coder.h:55