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