• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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