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