|
#include <stdio.h> |
|
#include <stdint.h> |
|
#include <stdlib.h> |
|
#include <inttypes.h> |
|
|
|
#include <cpuinfo.h> |
|
|
|
|
|
static const char* vendor_to_string(enum cpuinfo_vendor vendor) { |
|
switch (vendor) { |
|
case cpuinfo_vendor_unknown: |
|
return "unknown"; |
|
case cpuinfo_vendor_intel: |
|
return "Intel"; |
|
case cpuinfo_vendor_amd: |
|
return "AMD"; |
|
case cpuinfo_vendor_huawei: |
|
return "Huawei"; |
|
case cpuinfo_vendor_hygon: |
|
return "Hygon"; |
|
case cpuinfo_vendor_arm: |
|
return "ARM"; |
|
case cpuinfo_vendor_qualcomm: |
|
return "Qualcomm"; |
|
case cpuinfo_vendor_apple: |
|
return "Apple"; |
|
case cpuinfo_vendor_samsung: |
|
return "Samsung"; |
|
case cpuinfo_vendor_nvidia: |
|
return "Nvidia"; |
|
case cpuinfo_vendor_mips: |
|
return "MIPS"; |
|
case cpuinfo_vendor_ibm: |
|
return "IBM"; |
|
case cpuinfo_vendor_ingenic: |
|
return "Ingenic"; |
|
case cpuinfo_vendor_via: |
|
return "VIA"; |
|
case cpuinfo_vendor_cavium: |
|
return "Cavium"; |
|
case cpuinfo_vendor_broadcom: |
|
return "Broadcom"; |
|
case cpuinfo_vendor_apm: |
|
return "Applied Micro"; |
|
default: |
|
return NULL; |
|
} |
|
} |
|
|
|
static const char* uarch_to_string(enum cpuinfo_uarch uarch) { |
|
switch (uarch) { |
|
case cpuinfo_uarch_unknown: |
|
return "unknown"; |
|
case cpuinfo_uarch_p5: |
|
return "P5"; |
|
case cpuinfo_uarch_quark: |
|
return "Quark"; |
|
case cpuinfo_uarch_p6: |
|
return "P6"; |
|
case cpuinfo_uarch_dothan: |
|
return "Dothan"; |
|
case cpuinfo_uarch_yonah: |
|
return "Yonah"; |
|
case cpuinfo_uarch_conroe: |
|
return "Conroe"; |
|
case cpuinfo_uarch_penryn: |
|
return "Penryn"; |
|
case cpuinfo_uarch_nehalem: |
|
return "Nehalem"; |
|
case cpuinfo_uarch_sandy_bridge: |
|
return "Sandy Bridge"; |
|
case cpuinfo_uarch_ivy_bridge: |
|
return "Ivy Bridge"; |
|
case cpuinfo_uarch_haswell: |
|
return "Haswell"; |
|
case cpuinfo_uarch_broadwell: |
|
return "Broadwell"; |
|
case cpuinfo_uarch_sky_lake: |
|
return "Sky Lake"; |
|
case cpuinfo_uarch_palm_cove: |
|
return "Palm Cove"; |
|
case cpuinfo_uarch_sunny_cove: |
|
return "Sunny Cove"; |
|
case cpuinfo_uarch_willamette: |
|
return "Willamette"; |
|
case cpuinfo_uarch_prescott: |
|
return "Prescott"; |
|
case cpuinfo_uarch_bonnell: |
|
return "Bonnell"; |
|
case cpuinfo_uarch_saltwell: |
|
return "Saltwell"; |
|
case cpuinfo_uarch_silvermont: |
|
return "Silvermont"; |
|
case cpuinfo_uarch_airmont: |
|
return "Airmont"; |
|
case cpuinfo_uarch_goldmont: |
|
return "Goldmont"; |
|
case cpuinfo_uarch_goldmont_plus: |
|
return "Goldmont Plus"; |
|
case cpuinfo_uarch_knights_ferry: |
|
return "Knights Ferry"; |
|
case cpuinfo_uarch_knights_corner: |
|
return "Knights Corner"; |
|
case cpuinfo_uarch_knights_landing: |
|
return "Knights Landing"; |
|
case cpuinfo_uarch_knights_hill: |
|
return "Knights Hill"; |
|
case cpuinfo_uarch_knights_mill: |
|
return "Knights Mill"; |
|
case cpuinfo_uarch_k5: |
|
return "K5"; |
|
case cpuinfo_uarch_k6: |
|
return "K6"; |
|
case cpuinfo_uarch_k7: |
|
return "K7"; |
|
case cpuinfo_uarch_k8: |
|
return "K8"; |
|
case cpuinfo_uarch_k10: |
|
return "K10"; |
|
case cpuinfo_uarch_bulldozer: |
|
return "Bulldozer"; |
|
case cpuinfo_uarch_piledriver: |
|
return "Piledriver"; |
|
case cpuinfo_uarch_steamroller: |
|
return "Steamroller"; |
|
case cpuinfo_uarch_excavator: |
|
return "Excavator"; |
|
case cpuinfo_uarch_zen: |
|
return "Zen"; |
|
case cpuinfo_uarch_zen2: |
|
return "Zen 2"; |
|
case cpuinfo_uarch_zen3: |
|
return "Zen 3"; |
|
case cpuinfo_uarch_zen4: |
|
return "Zen 4"; |
|
case cpuinfo_uarch_geode: |
|
return "Geode"; |
|
case cpuinfo_uarch_bobcat: |
|
return "Bobcat"; |
|
case cpuinfo_uarch_jaguar: |
|
return "Jaguar"; |
|
case cpuinfo_uarch_puma: |
|
return "Puma"; |
|
case cpuinfo_uarch_xscale: |
|
return "XScale"; |
|
case cpuinfo_uarch_arm7: |
|
return "ARM7"; |
|
case cpuinfo_uarch_arm9: |
|
return "ARM9"; |
|
case cpuinfo_uarch_arm11: |
|
return "ARM11"; |
|
case cpuinfo_uarch_cortex_a5: |
|
return "Cortex-A5"; |
|
case cpuinfo_uarch_cortex_a7: |
|
return "Cortex-A7"; |
|
case cpuinfo_uarch_cortex_a8: |
|
return "Cortex-A8"; |
|
case cpuinfo_uarch_cortex_a9: |
|
return "Cortex-A9"; |
|
case cpuinfo_uarch_cortex_a12: |
|
return "Cortex-A12"; |
|
case cpuinfo_uarch_cortex_a15: |
|
return "Cortex-A15"; |
|
case cpuinfo_uarch_cortex_a17: |
|
return "Cortex-A17"; |
|
case cpuinfo_uarch_cortex_a32: |
|
return "Cortex-A32"; |
|
case cpuinfo_uarch_cortex_a35: |
|
return "Cortex-A35"; |
|
case cpuinfo_uarch_cortex_a53: |
|
return "Cortex-A53"; |
|
case cpuinfo_uarch_cortex_a55r0: |
|
return "Cortex-A55r0"; |
|
case cpuinfo_uarch_cortex_a55: |
|
return "Cortex-A55"; |
|
case cpuinfo_uarch_cortex_a57: |
|
return "Cortex-A57"; |
|
case cpuinfo_uarch_cortex_a65: |
|
return "Cortex-A65"; |
|
case cpuinfo_uarch_cortex_a72: |
|
return "Cortex-A72"; |
|
case cpuinfo_uarch_cortex_a73: |
|
return "Cortex-A73"; |
|
case cpuinfo_uarch_cortex_a75: |
|
return "Cortex-A75"; |
|
case cpuinfo_uarch_cortex_a76: |
|
return "Cortex-A76"; |
|
case cpuinfo_uarch_cortex_a77: |
|
return "Cortex-A77"; |
|
case cpuinfo_uarch_cortex_a78: |
|
return "Cortex-A78"; |
|
case cpuinfo_uarch_cortex_a510: |
|
return "Cortex-A510"; |
|
case cpuinfo_uarch_cortex_a710: |
|
return "Cortex-A710"; |
|
case cpuinfo_uarch_cortex_a715: |
|
return "Cortex-A715"; |
|
case cpuinfo_uarch_cortex_x1: |
|
return "Cortex-X1"; |
|
case cpuinfo_uarch_cortex_x2: |
|
return "Cortex-X2"; |
|
case cpuinfo_uarch_cortex_x3: |
|
return "Cortex-X3"; |
|
case cpuinfo_uarch_neoverse_n1: |
|
return "Neoverse-N1"; |
|
case cpuinfo_uarch_neoverse_v1: |
|
return "Neoverse-V1"; |
|
case cpuinfo_uarch_neoverse_n2: |
|
return "Neoverse-N2"; |
|
case cpuinfo_uarch_scorpion: |
|
return "Scorpion"; |
|
case cpuinfo_uarch_krait: |
|
return "Krait"; |
|
case cpuinfo_uarch_kryo: |
|
return "Kryo"; |
|
case cpuinfo_uarch_falkor: |
|
return "Falkor"; |
|
case cpuinfo_uarch_saphira: |
|
return "Saphira"; |
|
case cpuinfo_uarch_denver: |
|
return "Denver"; |
|
case cpuinfo_uarch_denver2: |
|
return "Denver 2"; |
|
case cpuinfo_uarch_carmel: |
|
return "Carmel"; |
|
case cpuinfo_uarch_exynos_m1: |
|
return "Exynos M1"; |
|
case cpuinfo_uarch_exynos_m2: |
|
return "Exynos M2"; |
|
case cpuinfo_uarch_exynos_m3: |
|
return "Exynos M3"; |
|
case cpuinfo_uarch_exynos_m4: |
|
return "Exynos M4"; |
|
case cpuinfo_uarch_exynos_m5: |
|
return "Exynos M5"; |
|
case cpuinfo_uarch_swift: |
|
return "Swift"; |
|
case cpuinfo_uarch_cyclone: |
|
return "Cyclone"; |
|
case cpuinfo_uarch_typhoon: |
|
return "Typhoon"; |
|
case cpuinfo_uarch_twister: |
|
return "Twister"; |
|
case cpuinfo_uarch_hurricane: |
|
return "Hurricane"; |
|
case cpuinfo_uarch_monsoon: |
|
return "Monsoon"; |
|
case cpuinfo_uarch_mistral: |
|
return "Mistral"; |
|
case cpuinfo_uarch_vortex: |
|
return "Vortex"; |
|
case cpuinfo_uarch_tempest: |
|
return "Tempest"; |
|
case cpuinfo_uarch_lightning: |
|
return "Lightning"; |
|
case cpuinfo_uarch_thunder: |
|
return "Thunder"; |
|
case cpuinfo_uarch_firestorm: |
|
return "Firestorm"; |
|
case cpuinfo_uarch_icestorm: |
|
return "Icestorm"; |
|
case cpuinfo_uarch_avalanche: |
|
return "Avalanche"; |
|
case cpuinfo_uarch_blizzard: |
|
return "Blizzard"; |
|
case cpuinfo_uarch_thunderx: |
|
return "ThunderX"; |
|
case cpuinfo_uarch_thunderx2: |
|
return "ThunderX2"; |
|
case cpuinfo_uarch_pj4: |
|
return "PJ4"; |
|
case cpuinfo_uarch_brahma_b15: |
|
return "Brahma B15"; |
|
case cpuinfo_uarch_brahma_b53: |
|
return "Brahma B53"; |
|
case cpuinfo_uarch_xgene: |
|
return "X-Gene"; |
|
case cpuinfo_uarch_dhyana: |
|
return "Dhyana"; |
|
case cpuinfo_uarch_taishan_v110: |
|
return "TaiShan v110"; |
|
default: |
|
return NULL; |
|
} |
|
} |
|
|
|
int main(int argc, char** argv) { |
|
if (!cpuinfo_initialize()) { |
|
fprintf(stderr, "failed to initialize CPU information\n"); |
|
exit(EXIT_FAILURE); |
|
} |
|
#ifdef __ANDROID__ |
|
printf("SoC name: %s\n", cpuinfo_get_package(0)->name); |
|
#else |
|
printf("Packages:\n"); |
|
for (uint32_t i = 0; i < cpuinfo_get_packages_count(); i++) { |
|
printf("\t%"PRIu32": %s\n", i, cpuinfo_get_package(i)->name); |
|
} |
|
#endif |
|
printf("Microarchitectures:\n"); |
|
for (uint32_t i = 0; i < cpuinfo_get_uarchs_count(); i++) { |
|
const struct cpuinfo_uarch_info* uarch_info = cpuinfo_get_uarch(i); |
|
const char* uarch_string = uarch_to_string(uarch_info->uarch); |
|
if (uarch_string == NULL) { |
|
printf("\t%"PRIu32"x Unknown (0x%08"PRIx32"\n", |
|
uarch_info->core_count, (uint32_t) uarch_info->uarch); |
|
} else { |
|
printf("\t%"PRIu32"x %s\n", uarch_info->core_count, uarch_string); |
|
} |
|
} |
|
printf("Cores:\n"); |
|
for (uint32_t i = 0; i < cpuinfo_get_cores_count(); i++) { |
|
const struct cpuinfo_core* core = cpuinfo_get_core(i); |
|
if (core->processor_count == 1) { |
|
printf("\t%"PRIu32": 1 processor (%"PRIu32")", i, core->processor_start); |
|
} else { |
|
printf("\t%"PRIu32": %"PRIu32" processors (%"PRIu32"-%"PRIu32")", |
|
i, core->processor_count, core->processor_start, core->processor_start + core->processor_count - 1); |
|
} |
|
const char* vendor_string = vendor_to_string(core->vendor); |
|
const char* uarch_string = uarch_to_string(core->uarch); |
|
if (vendor_string == NULL) { |
|
printf(", vendor 0x%08"PRIx32" uarch 0x%08"PRIx32"\n", |
|
(uint32_t) core->vendor, (uint32_t) core->uarch); |
|
} |
|
else if (uarch_string == NULL) { |
|
printf(", %s uarch 0x%08"PRIx32"\n", |
|
vendor_string, (uint32_t) core->uarch); |
|
} |
|
else { |
|
printf(", %s %s\n", vendor_string, uarch_string); |
|
} |
|
} |
|
printf("Logical processors"); |
|
#if defined(__linux__) |
|
printf(" (System ID)"); |
|
#endif |
|
printf(":\n"); |
|
for (uint32_t i = 0; i < cpuinfo_get_processors_count(); i++) { |
|
const struct cpuinfo_processor* processor = cpuinfo_get_processor(i); |
|
printf("\t%"PRIu32"", i); |
|
|
|
#if defined(__linux__) |
|
printf(" (%"PRId32")", processor->linux_id); |
|
#endif |
|
|
|
#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64 |
|
printf(": APIC ID 0x%08"PRIx32"\n", processor->apic_id); |
|
#else |
|
printf("\n"); |
|
#endif |
|
} |
|
} |
|
|