1 #pragma once 2 3 #include <stdbool.h> 4 #include <stdint.h> 5 6 #if defined(_WIN32) || defined(__CYGWIN__) 7 #include <windows.h> 8 #endif 9 10 #include <cpuinfo.h> 11 #include <cpuinfo/common.h> 12 13 enum cpuinfo_cache_level { 14 cpuinfo_cache_level_1i = 0, 15 cpuinfo_cache_level_1d = 1, 16 cpuinfo_cache_level_2 = 2, 17 cpuinfo_cache_level_3 = 3, 18 cpuinfo_cache_level_4 = 4, 19 cpuinfo_cache_level_max = 5, 20 }; 21 22 extern CPUINFO_INTERNAL bool cpuinfo_is_initialized; 23 24 extern CPUINFO_INTERNAL struct cpuinfo_processor* cpuinfo_processors; 25 extern CPUINFO_INTERNAL struct cpuinfo_core* cpuinfo_cores; 26 extern CPUINFO_INTERNAL struct cpuinfo_cluster* cpuinfo_clusters; 27 extern CPUINFO_INTERNAL struct cpuinfo_package* cpuinfo_packages; 28 extern CPUINFO_INTERNAL struct cpuinfo_cache* cpuinfo_cache[cpuinfo_cache_level_max]; 29 30 extern CPUINFO_INTERNAL uint32_t cpuinfo_processors_count; 31 extern CPUINFO_INTERNAL uint32_t cpuinfo_cores_count; 32 extern CPUINFO_INTERNAL uint32_t cpuinfo_clusters_count; 33 extern CPUINFO_INTERNAL uint32_t cpuinfo_packages_count; 34 extern CPUINFO_INTERNAL uint32_t cpuinfo_cache_count[cpuinfo_cache_level_max]; 35 extern CPUINFO_INTERNAL uint32_t cpuinfo_max_cache_size; 36 37 #if CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64 || CPUINFO_ARCH_RISCV32 || CPUINFO_ARCH_RISCV64 38 extern CPUINFO_INTERNAL struct cpuinfo_uarch_info* cpuinfo_uarchs; 39 extern CPUINFO_INTERNAL uint32_t cpuinfo_uarchs_count; 40 #else 41 extern CPUINFO_INTERNAL struct cpuinfo_uarch_info cpuinfo_global_uarch; 42 #endif 43 44 #ifdef __linux__ 45 extern CPUINFO_INTERNAL uint32_t cpuinfo_linux_cpu_max; 46 extern CPUINFO_INTERNAL const struct cpuinfo_processor** cpuinfo_linux_cpu_to_processor_map; 47 extern CPUINFO_INTERNAL const struct cpuinfo_core** cpuinfo_linux_cpu_to_core_map; 48 #endif 49 50 CPUINFO_PRIVATE void cpuinfo_x86_mach_init(void); 51 CPUINFO_PRIVATE void cpuinfo_x86_linux_init(void); 52 CPUINFO_PRIVATE void cpuinfo_x86_freebsd_init(void); 53 #if defined(_WIN32) || defined(__CYGWIN__) 54 #if CPUINFO_ARCH_ARM64 55 CPUINFO_PRIVATE BOOL CALLBACK cpuinfo_arm_windows_init(PINIT_ONCE init_once, PVOID parameter, PVOID* context); 56 #else 57 CPUINFO_PRIVATE BOOL CALLBACK cpuinfo_x86_windows_init(PINIT_ONCE init_once, PVOID parameter, PVOID* context); 58 #endif 59 #endif 60 CPUINFO_PRIVATE void cpuinfo_arm_mach_init(void); 61 CPUINFO_PRIVATE void cpuinfo_arm_linux_init(void); 62 CPUINFO_PRIVATE void cpuinfo_riscv_linux_init(void); 63 CPUINFO_PRIVATE void cpuinfo_emscripten_init(void); 64 65 CPUINFO_PRIVATE uint32_t cpuinfo_compute_max_cache_size(const struct cpuinfo_processor* processor); 66 67 typedef void (*cpuinfo_processor_callback)(uint32_t); 68