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