mirror of
https://github.com/WinampDesktop/winamp.git
synced 2025-05-07 06:05:42 -04:00
160 lines
4.3 KiB
C
160 lines
4.3 KiB
C
#pragma once
|
|
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
|
|
#include <cpuinfo.h>
|
|
#include <cpuinfo/common.h>
|
|
|
|
|
|
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]);
|