blob: b0fec2406d9fabcc8faebef167266f99113ddfd5 [file] [log] [blame]
#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.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_e1:
return "Neoverse E1";
case cpuinfo_uarch_neoverse_v1:
return "Neoverse V1";
case cpuinfo_uarch_neoverse_n2:
return "Neoverse N2";
case cpuinfo_uarch_neoverse_v2:
return "Neoverse V2";
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("Clusters:\n");
for (uint32_t i = 0; i < cpuinfo_get_clusters_count(); i++) {
const struct cpuinfo_cluster* cluster = cpuinfo_get_cluster(i);
if (cluster->processor_count == 1) {
printf("\t%" PRIu32 ": 1 processor (%" PRIu32 ")", i, cluster->processor_start);
} else {
printf("\t%" PRIu32 ": %" PRIu32 " processors (%" PRIu32 "-%" PRIu32 ")",
i,
cluster->processor_count,
cluster->processor_start,
cluster->processor_start + cluster->processor_count - 1);
}
if (cluster->core_count == 1) {
printf(",\t%" PRIu32 ": 1 core (%" PRIu32 ")", i, cluster->core_start);
} else {
printf(",\t%" PRIu32 ": %" PRIu32 " cores (%" PRIu32 "-%" PRIu32 ")",
i,
cluster->core_count,
cluster->core_start,
cluster->core_start + cluster->core_count - 1);
}
const char* vendor_string = vendor_to_string(cluster->vendor);
const char* uarch_string = uarch_to_string(cluster->uarch);
if (vendor_string == NULL) {
printf(", vendor 0x%08" PRIx32 " uarch 0x%08" PRIx32 "\n",
(uint32_t)cluster->vendor,
(uint32_t)cluster->uarch);
} else if (uarch_string == NULL) {
printf(", %s uarch 0x%08" PRIx32 "\n", vendor_string, (uint32_t)cluster->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
}
}