1*2b54f0dbSXin Li #pragma once 2*2b54f0dbSXin Li 3*2b54f0dbSXin Li #include <stdbool.h> 4*2b54f0dbSXin Li #include <stdint.h> 5*2b54f0dbSXin Li 6*2b54f0dbSXin Li #include <cpuinfo.h> 7*2b54f0dbSXin Li #include <cpuinfo/common.h> 8*2b54f0dbSXin Li 9*2b54f0dbSXin Li 10*2b54f0dbSXin Li struct cpuid_regs { 11*2b54f0dbSXin Li uint32_t eax; 12*2b54f0dbSXin Li uint32_t ebx; 13*2b54f0dbSXin Li uint32_t ecx; 14*2b54f0dbSXin Li uint32_t edx; 15*2b54f0dbSXin Li }; 16*2b54f0dbSXin Li 17*2b54f0dbSXin Li struct cpuinfo_x86_cache { 18*2b54f0dbSXin Li uint32_t size; 19*2b54f0dbSXin Li uint32_t associativity; 20*2b54f0dbSXin Li uint32_t sets; 21*2b54f0dbSXin Li uint32_t partitions; 22*2b54f0dbSXin Li uint32_t line_size; 23*2b54f0dbSXin Li uint32_t flags; 24*2b54f0dbSXin Li uint32_t apic_bits; 25*2b54f0dbSXin Li }; 26*2b54f0dbSXin Li 27*2b54f0dbSXin Li struct cpuinfo_x86_caches { 28*2b54f0dbSXin Li struct cpuinfo_trace_cache trace; 29*2b54f0dbSXin Li struct cpuinfo_x86_cache l1i; 30*2b54f0dbSXin Li struct cpuinfo_x86_cache l1d; 31*2b54f0dbSXin Li struct cpuinfo_x86_cache l2; 32*2b54f0dbSXin Li struct cpuinfo_x86_cache l3; 33*2b54f0dbSXin Li struct cpuinfo_x86_cache l4; 34*2b54f0dbSXin Li uint32_t prefetch_size; 35*2b54f0dbSXin Li }; 36*2b54f0dbSXin Li 37*2b54f0dbSXin Li struct cpuinfo_x86_model_info { 38*2b54f0dbSXin Li uint32_t model; 39*2b54f0dbSXin Li uint32_t family; 40*2b54f0dbSXin Li 41*2b54f0dbSXin Li uint32_t base_model; 42*2b54f0dbSXin Li uint32_t base_family; 43*2b54f0dbSXin Li uint32_t stepping; 44*2b54f0dbSXin Li uint32_t extended_model; 45*2b54f0dbSXin Li uint32_t extended_family; 46*2b54f0dbSXin Li uint32_t processor_type; 47*2b54f0dbSXin Li }; 48*2b54f0dbSXin Li 49*2b54f0dbSXin Li struct cpuinfo_x86_topology { 50*2b54f0dbSXin Li uint32_t apic_id; 51*2b54f0dbSXin Li uint32_t thread_bits_offset; 52*2b54f0dbSXin Li uint32_t thread_bits_length; 53*2b54f0dbSXin Li uint32_t core_bits_offset; 54*2b54f0dbSXin Li uint32_t core_bits_length; 55*2b54f0dbSXin Li }; 56*2b54f0dbSXin Li 57*2b54f0dbSXin Li struct cpuinfo_x86_processor { 58*2b54f0dbSXin Li uint32_t cpuid; 59*2b54f0dbSXin Li enum cpuinfo_vendor vendor; 60*2b54f0dbSXin Li enum cpuinfo_uarch uarch; 61*2b54f0dbSXin Li #ifdef __linux__ 62*2b54f0dbSXin Li int linux_id; 63*2b54f0dbSXin Li #endif 64*2b54f0dbSXin Li struct cpuinfo_x86_caches cache; 65*2b54f0dbSXin Li struct { 66*2b54f0dbSXin Li struct cpuinfo_tlb itlb_4KB; 67*2b54f0dbSXin Li struct cpuinfo_tlb itlb_2MB; 68*2b54f0dbSXin Li struct cpuinfo_tlb itlb_4MB; 69*2b54f0dbSXin Li struct cpuinfo_tlb dtlb0_4KB; 70*2b54f0dbSXin Li struct cpuinfo_tlb dtlb0_2MB; 71*2b54f0dbSXin Li struct cpuinfo_tlb dtlb0_4MB; 72*2b54f0dbSXin Li struct cpuinfo_tlb dtlb_4KB; 73*2b54f0dbSXin Li struct cpuinfo_tlb dtlb_2MB; 74*2b54f0dbSXin Li struct cpuinfo_tlb dtlb_4MB; 75*2b54f0dbSXin Li struct cpuinfo_tlb dtlb_1GB; 76*2b54f0dbSXin Li struct cpuinfo_tlb stlb2_4KB; 77*2b54f0dbSXin Li struct cpuinfo_tlb stlb2_2MB; 78*2b54f0dbSXin Li struct cpuinfo_tlb stlb2_1GB; 79*2b54f0dbSXin Li } tlb; 80*2b54f0dbSXin Li struct cpuinfo_x86_topology topology; 81*2b54f0dbSXin Li char brand_string[CPUINFO_PACKAGE_NAME_MAX]; 82*2b54f0dbSXin Li }; 83*2b54f0dbSXin Li 84*2b54f0dbSXin Li CPUINFO_INTERNAL void cpuinfo_x86_init_processor(struct cpuinfo_x86_processor* processor); 85*2b54f0dbSXin Li 86*2b54f0dbSXin Li CPUINFO_INTERNAL enum cpuinfo_vendor cpuinfo_x86_decode_vendor(uint32_t ebx, uint32_t ecx, uint32_t edx); 87*2b54f0dbSXin Li CPUINFO_INTERNAL struct cpuinfo_x86_model_info cpuinfo_x86_decode_model_info(uint32_t eax); 88*2b54f0dbSXin Li CPUINFO_INTERNAL enum cpuinfo_uarch cpuinfo_x86_decode_uarch( 89*2b54f0dbSXin Li enum cpuinfo_vendor vendor, 90*2b54f0dbSXin Li const struct cpuinfo_x86_model_info* model_info); 91*2b54f0dbSXin Li 92*2b54f0dbSXin Li CPUINFO_INTERNAL struct cpuinfo_x86_isa cpuinfo_x86_detect_isa( 93*2b54f0dbSXin Li const struct cpuid_regs basic_info, const struct cpuid_regs extended_info, 94*2b54f0dbSXin Li uint32_t max_base_index, uint32_t max_extended_index, 95*2b54f0dbSXin Li enum cpuinfo_vendor vendor, enum cpuinfo_uarch uarch); 96*2b54f0dbSXin Li 97*2b54f0dbSXin Li CPUINFO_INTERNAL void cpuinfo_x86_detect_topology( 98*2b54f0dbSXin Li uint32_t max_base_index, 99*2b54f0dbSXin Li uint32_t max_extended_index, 100*2b54f0dbSXin Li struct cpuid_regs leaf1, 101*2b54f0dbSXin Li struct cpuinfo_x86_topology* topology); 102*2b54f0dbSXin Li 103*2b54f0dbSXin Li CPUINFO_INTERNAL void cpuinfo_x86_detect_cache( 104*2b54f0dbSXin Li uint32_t max_base_index, uint32_t max_extended_index, 105*2b54f0dbSXin Li bool amd_topology_extensions, 106*2b54f0dbSXin Li enum cpuinfo_vendor vendor, 107*2b54f0dbSXin Li const struct cpuinfo_x86_model_info* model_info, 108*2b54f0dbSXin Li struct cpuinfo_x86_caches* cache, 109*2b54f0dbSXin Li struct cpuinfo_tlb* itlb_4KB, 110*2b54f0dbSXin Li struct cpuinfo_tlb* itlb_2MB, 111*2b54f0dbSXin Li struct cpuinfo_tlb* itlb_4MB, 112*2b54f0dbSXin Li struct cpuinfo_tlb* dtlb0_4KB, 113*2b54f0dbSXin Li struct cpuinfo_tlb* dtlb0_2MB, 114*2b54f0dbSXin Li struct cpuinfo_tlb* dtlb0_4MB, 115*2b54f0dbSXin Li struct cpuinfo_tlb* dtlb_4KB, 116*2b54f0dbSXin Li struct cpuinfo_tlb* dtlb_2MB, 117*2b54f0dbSXin Li struct cpuinfo_tlb* dtlb_4MB, 118*2b54f0dbSXin Li struct cpuinfo_tlb* dtlb_1GB, 119*2b54f0dbSXin Li struct cpuinfo_tlb* stlb2_4KB, 120*2b54f0dbSXin Li struct cpuinfo_tlb* stlb2_2MB, 121*2b54f0dbSXin Li struct cpuinfo_tlb* stlb2_1GB, 122*2b54f0dbSXin Li uint32_t* log2_package_cores_max); 123*2b54f0dbSXin Li 124*2b54f0dbSXin Li CPUINFO_INTERNAL void cpuinfo_x86_decode_cache_descriptor( 125*2b54f0dbSXin Li uint8_t descriptor, enum cpuinfo_vendor vendor, 126*2b54f0dbSXin Li const struct cpuinfo_x86_model_info* model_info, 127*2b54f0dbSXin Li struct cpuinfo_x86_caches* cache, 128*2b54f0dbSXin Li struct cpuinfo_tlb* itlb_4KB, 129*2b54f0dbSXin Li struct cpuinfo_tlb* itlb_2MB, 130*2b54f0dbSXin Li struct cpuinfo_tlb* itlb_4MB, 131*2b54f0dbSXin Li struct cpuinfo_tlb* dtlb0_4KB, 132*2b54f0dbSXin Li struct cpuinfo_tlb* dtlb0_2MB, 133*2b54f0dbSXin Li struct cpuinfo_tlb* dtlb0_4MB, 134*2b54f0dbSXin Li struct cpuinfo_tlb* dtlb_4KB, 135*2b54f0dbSXin Li struct cpuinfo_tlb* dtlb_2MB, 136*2b54f0dbSXin Li struct cpuinfo_tlb* dtlb_4MB, 137*2b54f0dbSXin Li struct cpuinfo_tlb* dtlb_1GB, 138*2b54f0dbSXin Li struct cpuinfo_tlb* stlb2_4KB, 139*2b54f0dbSXin Li struct cpuinfo_tlb* stlb2_2MB, 140*2b54f0dbSXin Li struct cpuinfo_tlb* stlb2_1GB, 141*2b54f0dbSXin Li uint32_t* prefetch_size); 142*2b54f0dbSXin Li 143*2b54f0dbSXin Li CPUINFO_INTERNAL bool cpuinfo_x86_decode_deterministic_cache_parameters( 144*2b54f0dbSXin Li struct cpuid_regs regs, 145*2b54f0dbSXin Li struct cpuinfo_x86_caches* cache, 146*2b54f0dbSXin Li uint32_t* package_cores_max); 147*2b54f0dbSXin Li 148*2b54f0dbSXin Li CPUINFO_INTERNAL bool cpuinfo_x86_decode_cache_properties( 149*2b54f0dbSXin Li struct cpuid_regs regs, 150*2b54f0dbSXin Li struct cpuinfo_x86_caches* cache); 151*2b54f0dbSXin Li 152*2b54f0dbSXin Li CPUINFO_INTERNAL uint32_t cpuinfo_x86_normalize_brand_string( 153*2b54f0dbSXin Li const char raw_name[48], 154*2b54f0dbSXin Li char normalized_name[48]); 155*2b54f0dbSXin Li 156*2b54f0dbSXin Li CPUINFO_INTERNAL uint32_t cpuinfo_x86_format_package_name( 157*2b54f0dbSXin Li enum cpuinfo_vendor vendor, 158*2b54f0dbSXin Li const char normalized_brand_string[48], 159*2b54f0dbSXin Li char package_name[CPUINFO_PACKAGE_NAME_MAX]); 160