#pragma once #include #include #include #include struct cpuid_regs { uint32_t eax; uint32_t ebx; uint32_t ecx; uint32_t edx; }; struct cpuinfo_x86_cache { uint32_t size; uint32_t associativity; uint32_t sets; uint32_t partitions; uint32_t line_size; uint32_t flags; uint32_t apic_bits; }; struct cpuinfo_x86_caches { struct cpuinfo_trace_cache trace; struct cpuinfo_x86_cache l1i; struct cpuinfo_x86_cache l1d; struct cpuinfo_x86_cache l2; struct cpuinfo_x86_cache l3; struct cpuinfo_x86_cache l4; uint32_t prefetch_size; }; struct cpuinfo_x86_model_info { uint32_t model; uint32_t family; uint32_t base_model; uint32_t base_family; uint32_t stepping; uint32_t extended_model; uint32_t extended_family; uint32_t processor_type; }; struct cpuinfo_x86_topology { uint32_t apic_id; uint32_t thread_bits_offset; uint32_t thread_bits_length; uint32_t core_bits_offset; uint32_t core_bits_length; }; struct cpuinfo_x86_processor { uint32_t cpuid; enum cpuinfo_vendor vendor; enum cpuinfo_uarch uarch; #ifdef __linux__ int linux_id; #endif struct cpuinfo_x86_caches cache; struct { struct cpuinfo_tlb itlb_4KB; struct cpuinfo_tlb itlb_2MB; struct cpuinfo_tlb itlb_4MB; struct cpuinfo_tlb dtlb0_4KB; struct cpuinfo_tlb dtlb0_2MB; struct cpuinfo_tlb dtlb0_4MB; struct cpuinfo_tlb dtlb_4KB; struct cpuinfo_tlb dtlb_2MB; struct cpuinfo_tlb dtlb_4MB; struct cpuinfo_tlb dtlb_1GB; struct cpuinfo_tlb stlb2_4KB; struct cpuinfo_tlb stlb2_2MB; struct cpuinfo_tlb stlb2_1GB; } tlb; struct cpuinfo_x86_topology topology; char brand_string[CPUINFO_PACKAGE_NAME_MAX]; }; CPUINFO_INTERNAL void cpuinfo_x86_init_processor(struct cpuinfo_x86_processor* processor); CPUINFO_INTERNAL enum cpuinfo_vendor cpuinfo_x86_decode_vendor(uint32_t ebx, uint32_t ecx, uint32_t edx); CPUINFO_INTERNAL struct cpuinfo_x86_model_info cpuinfo_x86_decode_model_info(uint32_t eax); CPUINFO_INTERNAL enum cpuinfo_uarch cpuinfo_x86_decode_uarch( enum cpuinfo_vendor vendor, const struct cpuinfo_x86_model_info* model_info); CPUINFO_INTERNAL struct cpuinfo_x86_isa cpuinfo_x86_detect_isa( const struct cpuid_regs basic_info, const struct cpuid_regs extended_info, uint32_t max_base_index, uint32_t max_extended_index, enum cpuinfo_vendor vendor, enum cpuinfo_uarch uarch); CPUINFO_INTERNAL void cpuinfo_x86_detect_topology( uint32_t max_base_index, uint32_t max_extended_index, struct cpuid_regs leaf1, struct cpuinfo_x86_topology* topology); CPUINFO_INTERNAL void cpuinfo_x86_detect_cache( uint32_t max_base_index, uint32_t max_extended_index, bool amd_topology_extensions, enum cpuinfo_vendor vendor, const struct cpuinfo_x86_model_info* model_info, struct cpuinfo_x86_caches* cache, struct cpuinfo_tlb* itlb_4KB, struct cpuinfo_tlb* itlb_2MB, struct cpuinfo_tlb* itlb_4MB, struct cpuinfo_tlb* dtlb0_4KB, struct cpuinfo_tlb* dtlb0_2MB, struct cpuinfo_tlb* dtlb0_4MB, struct cpuinfo_tlb* dtlb_4KB, struct cpuinfo_tlb* dtlb_2MB, struct cpuinfo_tlb* dtlb_4MB, struct cpuinfo_tlb* dtlb_1GB, struct cpuinfo_tlb* stlb2_4KB, struct cpuinfo_tlb* stlb2_2MB, struct cpuinfo_tlb* stlb2_1GB, uint32_t* log2_package_cores_max); CPUINFO_INTERNAL void cpuinfo_x86_decode_cache_descriptor( uint8_t descriptor, enum cpuinfo_vendor vendor, const struct cpuinfo_x86_model_info* model_info, struct cpuinfo_x86_caches* cache, struct cpuinfo_tlb* itlb_4KB, struct cpuinfo_tlb* itlb_2MB, struct cpuinfo_tlb* itlb_4MB, struct cpuinfo_tlb* dtlb0_4KB, struct cpuinfo_tlb* dtlb0_2MB, struct cpuinfo_tlb* dtlb0_4MB, struct cpuinfo_tlb* dtlb_4KB, struct cpuinfo_tlb* dtlb_2MB, struct cpuinfo_tlb* dtlb_4MB, struct cpuinfo_tlb* dtlb_1GB, struct cpuinfo_tlb* stlb2_4KB, struct cpuinfo_tlb* stlb2_2MB, struct cpuinfo_tlb* stlb2_1GB, uint32_t* prefetch_size); CPUINFO_INTERNAL bool cpuinfo_x86_decode_deterministic_cache_parameters( struct cpuid_regs regs, struct cpuinfo_x86_caches* cache, uint32_t* package_cores_max); CPUINFO_INTERNAL bool cpuinfo_x86_decode_cache_properties( struct cpuid_regs regs, struct cpuinfo_x86_caches* cache); CPUINFO_INTERNAL uint32_t cpuinfo_x86_normalize_brand_string( const char raw_name[48], char normalized_name[48]); CPUINFO_INTERNAL uint32_t cpuinfo_x86_format_package_name( enum cpuinfo_vendor vendor, const char normalized_brand_string[48], char package_name[CPUINFO_PACKAGE_NAME_MAX]);