blob: 806c6177ff575e3de2f697cc53641da83bc65fe2 [file] [log] [blame]
Marat Dukhan547fa362017-03-03 02:47:26 -05001#include <stdio.h>
Marat Dukhan12c8e072017-09-21 15:50:41 -07002#include <stdint.h>
Marat Dukhan53556512018-02-25 09:01:27 +01003#include <stdlib.h>
Marat Dukhan12c8e072017-09-21 15:50:41 -07004#include <inttypes.h>
Marat Dukhan547fa362017-03-03 02:47:26 -05005
6#include <cpuinfo.h>
7
Marat Dukhan12c8e072017-09-21 15:50:41 -07008
9static const char* vendor_to_string(enum cpuinfo_vendor vendor) {
Marat Dukhan2d37dc42017-09-25 01:32:37 -070010 switch (vendor) {
Marat Dukhan547fa362017-03-03 02:47:26 -050011 case cpuinfo_vendor_unknown:
Marat Dukhan12c8e072017-09-21 15:50:41 -070012 return "unknown";
Marat Dukhan547fa362017-03-03 02:47:26 -050013 case cpuinfo_vendor_intel:
Marat Dukhan12c8e072017-09-21 15:50:41 -070014 return "Intel";
Marat Dukhan547fa362017-03-03 02:47:26 -050015 case cpuinfo_vendor_amd:
Marat Dukhan12c8e072017-09-21 15:50:41 -070016 return "AMD";
Marat Dukhan547fa362017-03-03 02:47:26 -050017 case cpuinfo_vendor_arm:
Marat Dukhan12c8e072017-09-21 15:50:41 -070018 return "ARM";
Marat Dukhan547fa362017-03-03 02:47:26 -050019 case cpuinfo_vendor_qualcomm:
Marat Dukhan12c8e072017-09-21 15:50:41 -070020 return "Qualcomm";
Marat Dukhan547fa362017-03-03 02:47:26 -050021 case cpuinfo_vendor_apple:
Marat Dukhan12c8e072017-09-21 15:50:41 -070022 return "Apple";
Marat Dukhan547fa362017-03-03 02:47:26 -050023 case cpuinfo_vendor_samsung:
Marat Dukhan12c8e072017-09-21 15:50:41 -070024 return "Samsung";
Marat Dukhan547fa362017-03-03 02:47:26 -050025 case cpuinfo_vendor_nvidia:
Marat Dukhan93982f22017-10-20 13:10:23 -070026 return "Nvidia";
Marat Dukhan547fa362017-03-03 02:47:26 -050027 case cpuinfo_vendor_mips:
Marat Dukhan12c8e072017-09-21 15:50:41 -070028 return "MIPS";
Marat Dukhan547fa362017-03-03 02:47:26 -050029 case cpuinfo_vendor_ibm:
Marat Dukhan12c8e072017-09-21 15:50:41 -070030 return "IBM";
Marat Dukhan547fa362017-03-03 02:47:26 -050031 case cpuinfo_vendor_ingenic:
Marat Dukhan12c8e072017-09-21 15:50:41 -070032 return "Ingenic";
Marat Dukhan547fa362017-03-03 02:47:26 -050033 case cpuinfo_vendor_via:
Marat Dukhan12c8e072017-09-21 15:50:41 -070034 return "VIA";
Marat Dukhan92dae312017-05-09 14:10:17 +000035 case cpuinfo_vendor_cavium:
Marat Dukhan12c8e072017-09-21 15:50:41 -070036 return "Cavium";
Marat Dukhan1ae7ff82018-05-13 19:30:58 -070037 case cpuinfo_vendor_broadcom:
38 return "Broadcom";
Marat Dukhan547fa362017-03-03 02:47:26 -050039 default:
Marat Dukhan12c8e072017-09-21 15:50:41 -070040 return NULL;
Marat Dukhan547fa362017-03-03 02:47:26 -050041 }
Marat Dukhan12c8e072017-09-21 15:50:41 -070042}
43
44static const char* uarch_to_string(enum cpuinfo_uarch uarch) {
45 switch (uarch) {
Marat Dukhan547fa362017-03-03 02:47:26 -050046 case cpuinfo_uarch_unknown:
Marat Dukhan12c8e072017-09-21 15:50:41 -070047 return "unknown";
Marat Dukhan547fa362017-03-03 02:47:26 -050048 case cpuinfo_uarch_p5:
Marat Dukhan12c8e072017-09-21 15:50:41 -070049 return "P5";
Marat Dukhan547fa362017-03-03 02:47:26 -050050 case cpuinfo_uarch_quark:
Marat Dukhan12c8e072017-09-21 15:50:41 -070051 return "Quark";
Marat Dukhan547fa362017-03-03 02:47:26 -050052 case cpuinfo_uarch_p6:
Marat Dukhan12c8e072017-09-21 15:50:41 -070053 return "P6";
Marat Dukhan547fa362017-03-03 02:47:26 -050054 case cpuinfo_uarch_dothan:
Marat Dukhan12c8e072017-09-21 15:50:41 -070055 return "Dothan";
Marat Dukhan547fa362017-03-03 02:47:26 -050056 case cpuinfo_uarch_yonah:
Marat Dukhan12c8e072017-09-21 15:50:41 -070057 return "Yonah";
Marat Dukhan547fa362017-03-03 02:47:26 -050058 case cpuinfo_uarch_conroe:
Marat Dukhan12c8e072017-09-21 15:50:41 -070059 return "Conroe";
Marat Dukhan547fa362017-03-03 02:47:26 -050060 case cpuinfo_uarch_penryn:
Marat Dukhan12c8e072017-09-21 15:50:41 -070061 return "Penryn";
Marat Dukhan547fa362017-03-03 02:47:26 -050062 case cpuinfo_uarch_nehalem:
Marat Dukhan12c8e072017-09-21 15:50:41 -070063 return "Nehalem";
Marat Dukhan547fa362017-03-03 02:47:26 -050064 case cpuinfo_uarch_sandy_bridge:
Marat Dukhan12c8e072017-09-21 15:50:41 -070065 return "Sandy Bridge";
Marat Dukhan547fa362017-03-03 02:47:26 -050066 case cpuinfo_uarch_ivy_bridge:
Marat Dukhan12c8e072017-09-21 15:50:41 -070067 return "Ivy Bridge";
Marat Dukhan547fa362017-03-03 02:47:26 -050068 case cpuinfo_uarch_haswell:
Marat Dukhan12c8e072017-09-21 15:50:41 -070069 return "Haswell";
Marat Dukhan547fa362017-03-03 02:47:26 -050070 case cpuinfo_uarch_broadwell:
Marat Dukhan12c8e072017-09-21 15:50:41 -070071 return "Broadwell";
Marat Dukhan547fa362017-03-03 02:47:26 -050072 case cpuinfo_uarch_sky_lake:
Marat Dukhan12c8e072017-09-21 15:50:41 -070073 return "Sky Lake";
Marat Dukhan547fa362017-03-03 02:47:26 -050074 case cpuinfo_uarch_kaby_lake:
Marat Dukhan12c8e072017-09-21 15:50:41 -070075 return "Kaby Lake";
Marat Dukhan547fa362017-03-03 02:47:26 -050076 case cpuinfo_uarch_willamette:
Marat Dukhan12c8e072017-09-21 15:50:41 -070077 return "Willamette";
Marat Dukhan547fa362017-03-03 02:47:26 -050078 case cpuinfo_uarch_prescott:
Marat Dukhan12c8e072017-09-21 15:50:41 -070079 return "Prescott";
Marat Dukhan547fa362017-03-03 02:47:26 -050080 case cpuinfo_uarch_bonnell:
Marat Dukhan12c8e072017-09-21 15:50:41 -070081 return "Bonnell";
Marat Dukhan547fa362017-03-03 02:47:26 -050082 case cpuinfo_uarch_saltwell:
Marat Dukhan12c8e072017-09-21 15:50:41 -070083 return "Saltwell";
Marat Dukhan547fa362017-03-03 02:47:26 -050084 case cpuinfo_uarch_silvermont:
Marat Dukhan12c8e072017-09-21 15:50:41 -070085 return "Silvermont";
Marat Dukhan547fa362017-03-03 02:47:26 -050086 case cpuinfo_uarch_airmont:
Marat Dukhan12c8e072017-09-21 15:50:41 -070087 return "Airmont";
Marat Dukhan547fa362017-03-03 02:47:26 -050088 case cpuinfo_uarch_knights_ferry:
Marat Dukhan12c8e072017-09-21 15:50:41 -070089 return "Knights Ferry";
Marat Dukhan547fa362017-03-03 02:47:26 -050090 case cpuinfo_uarch_knights_corner:
Marat Dukhan12c8e072017-09-21 15:50:41 -070091 return "Knights Corner";
Marat Dukhan547fa362017-03-03 02:47:26 -050092 case cpuinfo_uarch_knights_landing:
Marat Dukhan12c8e072017-09-21 15:50:41 -070093 return "Knights Landing";
Marat Dukhan547fa362017-03-03 02:47:26 -050094 case cpuinfo_uarch_knights_hill:
Marat Dukhan12c8e072017-09-21 15:50:41 -070095 return "Knights Hill";
Marat Dukhan547fa362017-03-03 02:47:26 -050096 case cpuinfo_uarch_knights_mill:
Marat Dukhan12c8e072017-09-21 15:50:41 -070097 return "Knights Mill";
Marat Dukhan547fa362017-03-03 02:47:26 -050098 case cpuinfo_uarch_k5:
Marat Dukhan12c8e072017-09-21 15:50:41 -070099 return "K5";
Marat Dukhan547fa362017-03-03 02:47:26 -0500100 case cpuinfo_uarch_k6:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700101 return "K6";
Marat Dukhan547fa362017-03-03 02:47:26 -0500102 case cpuinfo_uarch_k7:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700103 return "K7";
Marat Dukhan547fa362017-03-03 02:47:26 -0500104 case cpuinfo_uarch_k8:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700105 return "K8";
Marat Dukhan547fa362017-03-03 02:47:26 -0500106 case cpuinfo_uarch_k10:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700107 return "K10";
Marat Dukhan547fa362017-03-03 02:47:26 -0500108 case cpuinfo_uarch_bulldozer:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700109 return "Bulldozer";
Marat Dukhan547fa362017-03-03 02:47:26 -0500110 case cpuinfo_uarch_piledriver:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700111 return "Piledriver";
Marat Dukhan547fa362017-03-03 02:47:26 -0500112 case cpuinfo_uarch_steamroller:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700113 return "Steamroller";
Marat Dukhan547fa362017-03-03 02:47:26 -0500114 case cpuinfo_uarch_excavator:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700115 return "Excavator";
Marat Dukhan547fa362017-03-03 02:47:26 -0500116 case cpuinfo_uarch_zen:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700117 return "Zen";
Marat Dukhane25187d2017-04-16 05:03:07 -0400118 case cpuinfo_uarch_geode:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700119 return "Geode";
Marat Dukhan547fa362017-03-03 02:47:26 -0500120 case cpuinfo_uarch_bobcat:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700121 return "Bobcat";
Marat Dukhan547fa362017-03-03 02:47:26 -0500122 case cpuinfo_uarch_jaguar:
Marat Dukhan818e1992018-02-24 15:39:18 +0100123 return "Jaguar";
124 case cpuinfo_uarch_puma:
125 return "Puma";
Marat Dukhan3c982762017-05-08 06:16:45 +0000126 case cpuinfo_uarch_xscale:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700127 return "XScale";
Marat Dukhan547fa362017-03-03 02:47:26 -0500128 case cpuinfo_uarch_arm7:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700129 return "ARM7";
Marat Dukhan547fa362017-03-03 02:47:26 -0500130 case cpuinfo_uarch_arm9:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700131 return "ARM9";
Marat Dukhan547fa362017-03-03 02:47:26 -0500132 case cpuinfo_uarch_arm11:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700133 return "ARM11";
Marat Dukhan547fa362017-03-03 02:47:26 -0500134 case cpuinfo_uarch_cortex_a5:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700135 return "Cortex-A5";
Marat Dukhan547fa362017-03-03 02:47:26 -0500136 case cpuinfo_uarch_cortex_a7:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700137 return "Cortex-A7";
Marat Dukhan547fa362017-03-03 02:47:26 -0500138 case cpuinfo_uarch_cortex_a8:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700139 return "Cortex-A8";
Marat Dukhan547fa362017-03-03 02:47:26 -0500140 case cpuinfo_uarch_cortex_a9:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700141 return "Cortex-A9";
Marat Dukhan547fa362017-03-03 02:47:26 -0500142 case cpuinfo_uarch_cortex_a12:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700143 return "Cortex-A12";
Marat Dukhan547fa362017-03-03 02:47:26 -0500144 case cpuinfo_uarch_cortex_a15:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700145 return "Cortex-A15";
Marat Dukhan547fa362017-03-03 02:47:26 -0500146 case cpuinfo_uarch_cortex_a17:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700147 return "Cortex-A17";
Marat Dukhan547fa362017-03-03 02:47:26 -0500148 case cpuinfo_uarch_cortex_a32:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700149 return "Cortex-A32";
Marat Dukhan547fa362017-03-03 02:47:26 -0500150 case cpuinfo_uarch_cortex_a35:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700151 return "Cortex-A35";
Marat Dukhan547fa362017-03-03 02:47:26 -0500152 case cpuinfo_uarch_cortex_a53:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700153 return "Cortex-A53";
Marat Dukhan547fa362017-03-03 02:47:26 -0500154 case cpuinfo_uarch_cortex_a57:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700155 return "Cortex-A57";
Marat Dukhan547fa362017-03-03 02:47:26 -0500156 case cpuinfo_uarch_cortex_a72:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700157 return "Cortex-A72";
Marat Dukhan547fa362017-03-03 02:47:26 -0500158 case cpuinfo_uarch_cortex_a73:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700159 return "Cortex-A73";
Marat Dukhan547fa362017-03-03 02:47:26 -0500160 case cpuinfo_uarch_scorpion:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700161 return "Scorpion";
Marat Dukhan547fa362017-03-03 02:47:26 -0500162 case cpuinfo_uarch_krait:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700163 return "Krait";
Marat Dukhan547fa362017-03-03 02:47:26 -0500164 case cpuinfo_uarch_kryo:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700165 return "Kryo";
Marat Dukhan3c982762017-05-08 06:16:45 +0000166 case cpuinfo_uarch_denver:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700167 return "Denver";
Marat Dukhana750f2a2018-03-07 11:07:48 -0800168 case cpuinfo_uarch_mongoose_m1:
169 return "Mongoose M1";
170 case cpuinfo_uarch_mongoose_m2:
171 return "Mongoose M2";
Marat Dukhan10eae002018-03-29 18:36:31 -0700172 case cpuinfo_uarch_meerkat_m3:
173 return "Meerkat M3";
Marat Dukhan547fa362017-03-03 02:47:26 -0500174 case cpuinfo_uarch_swift:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700175 return "Swift";
Marat Dukhan547fa362017-03-03 02:47:26 -0500176 case cpuinfo_uarch_cyclone:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700177 return "Cyclone";
Marat Dukhan547fa362017-03-03 02:47:26 -0500178 case cpuinfo_uarch_typhoon:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700179 return "Typhoon";
Marat Dukhan547fa362017-03-03 02:47:26 -0500180 case cpuinfo_uarch_twister:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700181 return "Twister";
Marat Dukhan547fa362017-03-03 02:47:26 -0500182 case cpuinfo_uarch_hurricane:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700183 return "Hurricane";
Marat Dukhan92dae312017-05-09 14:10:17 +0000184 case cpuinfo_uarch_thunderx:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700185 return "ThunderX";
Marat Dukhan88718322017-08-24 10:12:20 -0700186 case cpuinfo_uarch_pj4:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700187 return "PJ4";
Marat Dukhan1ae7ff82018-05-13 19:30:58 -0700188 case cpuinfo_uarch_brahma_b15:
189 return "Brahma B15";
190 case cpuinfo_uarch_brahma_b53:
191 return "Brahma B53";
Marat Dukhan547fa362017-03-03 02:47:26 -0500192 default:
Marat Dukhan12c8e072017-09-21 15:50:41 -0700193 return NULL;
194 }
195}
196
197int main(int argc, char** argv) {
Marat Dukhan53556512018-02-25 09:01:27 +0100198 if (!cpuinfo_initialize()) {
199 fprintf(stderr, "failed to initialize CPU information\n");
200 exit(EXIT_FAILURE);
201 }
Marat Dukhan12c8e072017-09-21 15:50:41 -0700202 #ifdef __ANDROID__
Marat Dukhan30401972017-09-26 18:35:52 -0700203 printf("SoC name: %s\n", cpuinfo_get_package(0)->name);
204 printf("GPU name: %s\n", cpuinfo_get_package(0)->gpu_name);
Marat Dukhan12c8e072017-09-21 15:50:41 -0700205 #else
206 printf("Packages:\n");
Marat Dukhan30401972017-09-26 18:35:52 -0700207 for (uint32_t i = 0; i < cpuinfo_get_packages_count(); i++) {
208 printf("\t%"PRIu32": %s\n", i, cpuinfo_get_package(i)->name);
Marat Dukhan12c8e072017-09-21 15:50:41 -0700209 }
210 #endif
Marat Dukhan2d37dc42017-09-25 01:32:37 -0700211 printf("Cores:\n");
Marat Dukhan30401972017-09-26 18:35:52 -0700212 for (uint32_t i = 0; i < cpuinfo_get_cores_count(); i++) {
213 const struct cpuinfo_core* core = cpuinfo_get_core(i);
214 if (core->processor_count == 1) {
Marat Dukhanb2fc4ab2018-02-19 22:43:26 -0800215 printf("\t%"PRIu32": 1 processor (%"PRIu32")", i, core->processor_start);
Marat Dukhan2d37dc42017-09-25 01:32:37 -0700216 } else {
Marat Dukhanb2fc4ab2018-02-19 22:43:26 -0800217 printf("\t%"PRIu32": %"PRIu32" processors (%"PRIu32"-%"PRIu32")",
Marat Dukhan30401972017-09-26 18:35:52 -0700218 i, core->processor_count, core->processor_start, core->processor_start + core->processor_count - 1);
Marat Dukhan2d37dc42017-09-25 01:32:37 -0700219 }
Marat Dukhanb2fc4ab2018-02-19 22:43:26 -0800220 const char* vendor_string = vendor_to_string(core->vendor);
221 const char* uarch_string = uarch_to_string(core->uarch);
222 if (vendor_string == NULL) {
223 printf(", vendor 0x%08"PRIx32" uarch 0x%08"PRIx32"\n",
224 (uint32_t) core->vendor, (uint32_t) core->uarch);
225 }
226 else if (uarch_string == NULL) {
227 printf(", %s uarch 0x%08"PRIx32"\n",
228 vendor_string, (uint32_t) core->uarch);
229 }
230 else {
231 printf(", %s %s\n", vendor_string, uarch_string);
232 }
Marat Dukhan2d37dc42017-09-25 01:32:37 -0700233 }
Marat Dukhan12c8e072017-09-21 15:50:41 -0700234 printf("Logical processors:\n");
Marat Dukhan30401972017-09-26 18:35:52 -0700235 for (uint32_t i = 0; i < cpuinfo_get_processors_count(); i++) {
236 const struct cpuinfo_processor* processor = cpuinfo_get_processor(i);
Marat Dukhanb2fc4ab2018-02-19 22:43:26 -0800237 #if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
238 printf("\t%"PRIu32": APIC ID 0x%08"PRIx32"\n", i, processor->apic_id);
239 #else
240 printf("\t%"PRIu32"\n", i);
241 #endif
Marat Dukhan547fa362017-03-03 02:47:26 -0500242 }
243}