1 #include <stdio.h>
2 #include <stdint.h>
3 #include <stdlib.h>
4 #include <inttypes.h>
5
6 #include <cpuinfo.h>
7
8
vendor_to_string(enum cpuinfo_vendor vendor)9 static const char* vendor_to_string(enum cpuinfo_vendor vendor) {
10 switch (vendor) {
11 case cpuinfo_vendor_unknown:
12 return "unknown";
13 case cpuinfo_vendor_intel:
14 return "Intel";
15 case cpuinfo_vendor_amd:
16 return "AMD";
17 case cpuinfo_vendor_huawei:
18 return "Huawei";
19 case cpuinfo_vendor_hygon:
20 return "Hygon";
21 case cpuinfo_vendor_arm:
22 return "ARM";
23 case cpuinfo_vendor_qualcomm:
24 return "Qualcomm";
25 case cpuinfo_vendor_apple:
26 return "Apple";
27 case cpuinfo_vendor_samsung:
28 return "Samsung";
29 case cpuinfo_vendor_nvidia:
30 return "Nvidia";
31 case cpuinfo_vendor_mips:
32 return "MIPS";
33 case cpuinfo_vendor_ibm:
34 return "IBM";
35 case cpuinfo_vendor_ingenic:
36 return "Ingenic";
37 case cpuinfo_vendor_via:
38 return "VIA";
39 case cpuinfo_vendor_cavium:
40 return "Cavium";
41 case cpuinfo_vendor_broadcom:
42 return "Broadcom";
43 case cpuinfo_vendor_apm:
44 return "Applied Micro";
45 default:
46 return NULL;
47 }
48 }
49
uarch_to_string(enum cpuinfo_uarch uarch)50 static const char* uarch_to_string(enum cpuinfo_uarch uarch) {
51 switch (uarch) {
52 case cpuinfo_uarch_unknown:
53 return "unknown";
54 case cpuinfo_uarch_p5:
55 return "P5";
56 case cpuinfo_uarch_quark:
57 return "Quark";
58 case cpuinfo_uarch_p6:
59 return "P6";
60 case cpuinfo_uarch_dothan:
61 return "Dothan";
62 case cpuinfo_uarch_yonah:
63 return "Yonah";
64 case cpuinfo_uarch_conroe:
65 return "Conroe";
66 case cpuinfo_uarch_penryn:
67 return "Penryn";
68 case cpuinfo_uarch_nehalem:
69 return "Nehalem";
70 case cpuinfo_uarch_sandy_bridge:
71 return "Sandy Bridge";
72 case cpuinfo_uarch_ivy_bridge:
73 return "Ivy Bridge";
74 case cpuinfo_uarch_haswell:
75 return "Haswell";
76 case cpuinfo_uarch_broadwell:
77 return "Broadwell";
78 case cpuinfo_uarch_sky_lake:
79 return "Sky Lake";
80 case cpuinfo_uarch_palm_cove:
81 return "Palm Cove";
82 case cpuinfo_uarch_sunny_cove:
83 return "Sunny Cove";
84 case cpuinfo_uarch_willamette:
85 return "Willamette";
86 case cpuinfo_uarch_prescott:
87 return "Prescott";
88 case cpuinfo_uarch_bonnell:
89 return "Bonnell";
90 case cpuinfo_uarch_saltwell:
91 return "Saltwell";
92 case cpuinfo_uarch_silvermont:
93 return "Silvermont";
94 case cpuinfo_uarch_airmont:
95 return "Airmont";
96 case cpuinfo_uarch_goldmont:
97 return "Goldmont";
98 case cpuinfo_uarch_goldmont_plus:
99 return "Goldmont Plus";
100 case cpuinfo_uarch_knights_ferry:
101 return "Knights Ferry";
102 case cpuinfo_uarch_knights_corner:
103 return "Knights Corner";
104 case cpuinfo_uarch_knights_landing:
105 return "Knights Landing";
106 case cpuinfo_uarch_knights_hill:
107 return "Knights Hill";
108 case cpuinfo_uarch_knights_mill:
109 return "Knights Mill";
110 case cpuinfo_uarch_k5:
111 return "K5";
112 case cpuinfo_uarch_k6:
113 return "K6";
114 case cpuinfo_uarch_k7:
115 return "K7";
116 case cpuinfo_uarch_k8:
117 return "K8";
118 case cpuinfo_uarch_k10:
119 return "K10";
120 case cpuinfo_uarch_bulldozer:
121 return "Bulldozer";
122 case cpuinfo_uarch_piledriver:
123 return "Piledriver";
124 case cpuinfo_uarch_steamroller:
125 return "Steamroller";
126 case cpuinfo_uarch_excavator:
127 return "Excavator";
128 case cpuinfo_uarch_zen:
129 return "Zen";
130 case cpuinfo_uarch_zen2:
131 return "Zen 2";
132 case cpuinfo_uarch_zen3:
133 return "Zen 3";
134 case cpuinfo_uarch_geode:
135 return "Geode";
136 case cpuinfo_uarch_bobcat:
137 return "Bobcat";
138 case cpuinfo_uarch_jaguar:
139 return "Jaguar";
140 case cpuinfo_uarch_puma:
141 return "Puma";
142 case cpuinfo_uarch_xscale:
143 return "XScale";
144 case cpuinfo_uarch_arm7:
145 return "ARM7";
146 case cpuinfo_uarch_arm9:
147 return "ARM9";
148 case cpuinfo_uarch_arm11:
149 return "ARM11";
150 case cpuinfo_uarch_cortex_a5:
151 return "Cortex-A5";
152 case cpuinfo_uarch_cortex_a7:
153 return "Cortex-A7";
154 case cpuinfo_uarch_cortex_a8:
155 return "Cortex-A8";
156 case cpuinfo_uarch_cortex_a9:
157 return "Cortex-A9";
158 case cpuinfo_uarch_cortex_a12:
159 return "Cortex-A12";
160 case cpuinfo_uarch_cortex_a15:
161 return "Cortex-A15";
162 case cpuinfo_uarch_cortex_a17:
163 return "Cortex-A17";
164 case cpuinfo_uarch_cortex_a32:
165 return "Cortex-A32";
166 case cpuinfo_uarch_cortex_a35:
167 return "Cortex-A35";
168 case cpuinfo_uarch_cortex_a53:
169 return "Cortex-A53";
170 case cpuinfo_uarch_cortex_a55r0:
171 return "Cortex-A55r0";
172 case cpuinfo_uarch_cortex_a55:
173 return "Cortex-A55";
174 case cpuinfo_uarch_cortex_a57:
175 return "Cortex-A57";
176 case cpuinfo_uarch_cortex_a65:
177 return "Cortex-A65";
178 case cpuinfo_uarch_cortex_a72:
179 return "Cortex-A72";
180 case cpuinfo_uarch_cortex_a73:
181 return "Cortex-A73";
182 case cpuinfo_uarch_cortex_a75:
183 return "Cortex-A75";
184 case cpuinfo_uarch_cortex_a76:
185 return "Cortex-A76";
186 case cpuinfo_uarch_cortex_a77:
187 return "Cortex-A77";
188 case cpuinfo_uarch_cortex_a78:
189 return "Cortex-A78";
190 case cpuinfo_uarch_cortex_x1:
191 return "Cortex-X1";
192 case cpuinfo_uarch_scorpion:
193 return "Scorpion";
194 case cpuinfo_uarch_krait:
195 return "Krait";
196 case cpuinfo_uarch_kryo:
197 return "Kryo";
198 case cpuinfo_uarch_falkor:
199 return "Falkor";
200 case cpuinfo_uarch_saphira:
201 return "Saphira";
202 case cpuinfo_uarch_denver:
203 return "Denver";
204 case cpuinfo_uarch_denver2:
205 return "Denver 2";
206 case cpuinfo_uarch_carmel:
207 return "Carmel";
208 case cpuinfo_uarch_exynos_m1:
209 return "Exynos M1";
210 case cpuinfo_uarch_exynos_m2:
211 return "Exynos M2";
212 case cpuinfo_uarch_exynos_m3:
213 return "Exynos M3";
214 case cpuinfo_uarch_exynos_m4:
215 return "Exynos M4";
216 case cpuinfo_uarch_exynos_m5:
217 return "Exynos M5";
218 case cpuinfo_uarch_swift:
219 return "Swift";
220 case cpuinfo_uarch_cyclone:
221 return "Cyclone";
222 case cpuinfo_uarch_typhoon:
223 return "Typhoon";
224 case cpuinfo_uarch_twister:
225 return "Twister";
226 case cpuinfo_uarch_hurricane:
227 return "Hurricane";
228 case cpuinfo_uarch_monsoon:
229 return "Monsoon";
230 case cpuinfo_uarch_mistral:
231 return "Mistral";
232 case cpuinfo_uarch_vortex:
233 return "Vortex";
234 case cpuinfo_uarch_tempest:
235 return "Tempest";
236 case cpuinfo_uarch_lightning:
237 return "Lightning";
238 case cpuinfo_uarch_thunder:
239 return "Thunder";
240 case cpuinfo_uarch_firestorm:
241 return "Firestorm";
242 case cpuinfo_uarch_icestorm:
243 return "Icestorm";
244 case cpuinfo_uarch_thunderx:
245 return "ThunderX";
246 case cpuinfo_uarch_thunderx2:
247 return "ThunderX2";
248 case cpuinfo_uarch_pj4:
249 return "PJ4";
250 case cpuinfo_uarch_brahma_b15:
251 return "Brahma B15";
252 case cpuinfo_uarch_brahma_b53:
253 return "Brahma B53";
254 case cpuinfo_uarch_xgene:
255 return "X-Gene";
256 case cpuinfo_uarch_dhyana:
257 return "Dhyana";
258 case cpuinfo_uarch_taishan_v110:
259 return "TaiShan v110";
260 default:
261 return NULL;
262 }
263 }
264
main(int argc,char ** argv)265 int main(int argc, char** argv) {
266 if (!cpuinfo_initialize()) {
267 fprintf(stderr, "failed to initialize CPU information\n");
268 exit(EXIT_FAILURE);
269 }
270 #ifdef __ANDROID__
271 printf("SoC name: %s\n", cpuinfo_get_package(0)->name);
272 #else
273 printf("Packages:\n");
274 for (uint32_t i = 0; i < cpuinfo_get_packages_count(); i++) {
275 printf("\t%"PRIu32": %s\n", i, cpuinfo_get_package(i)->name);
276 }
277 #endif
278 printf("Microarchitectures:\n");
279 for (uint32_t i = 0; i < cpuinfo_get_uarchs_count(); i++) {
280 const struct cpuinfo_uarch_info* uarch_info = cpuinfo_get_uarch(i);
281 const char* uarch_string = uarch_to_string(uarch_info->uarch);
282 if (uarch_string == NULL) {
283 printf("\t%"PRIu32"x Unknown (0x%08"PRIx32"\n",
284 uarch_info->core_count, (uint32_t) uarch_info->uarch);
285 } else {
286 printf("\t%"PRIu32"x %s\n", uarch_info->core_count, uarch_string);
287 }
288 }
289 printf("Cores:\n");
290 for (uint32_t i = 0; i < cpuinfo_get_cores_count(); i++) {
291 const struct cpuinfo_core* core = cpuinfo_get_core(i);
292 if (core->processor_count == 1) {
293 printf("\t%"PRIu32": 1 processor (%"PRIu32")", i, core->processor_start);
294 } else {
295 printf("\t%"PRIu32": %"PRIu32" processors (%"PRIu32"-%"PRIu32")",
296 i, core->processor_count, core->processor_start, core->processor_start + core->processor_count - 1);
297 }
298 const char* vendor_string = vendor_to_string(core->vendor);
299 const char* uarch_string = uarch_to_string(core->uarch);
300 if (vendor_string == NULL) {
301 printf(", vendor 0x%08"PRIx32" uarch 0x%08"PRIx32"\n",
302 (uint32_t) core->vendor, (uint32_t) core->uarch);
303 }
304 else if (uarch_string == NULL) {
305 printf(", %s uarch 0x%08"PRIx32"\n",
306 vendor_string, (uint32_t) core->uarch);
307 }
308 else {
309 printf(", %s %s\n", vendor_string, uarch_string);
310 }
311 }
312 printf("Logical processors");
313 #if defined(__linux__)
314 printf(" (System ID)");
315 #endif
316 printf(":\n");
317 for (uint32_t i = 0; i < cpuinfo_get_processors_count(); i++) {
318 const struct cpuinfo_processor* processor = cpuinfo_get_processor(i);
319 printf("\t%"PRIu32"", i);
320
321 #if defined(__linux__)
322 printf(" (%"PRId32")", processor->linux_id);
323 #endif
324
325 #if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
326 printf(": APIC ID 0x%08"PRIx32"\n", processor->apic_id);
327 #else
328 printf("\n");
329 #endif
330 }
331 }
332