1/* Constants and data structures for x86 CPU features.
2 This file is part of the GNU C Library.
3 Copyright (C) 2008-2024 Free Software Foundation, Inc.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
18
19#ifndef _SYS_PLATFORM_X86_H
20# error "Never include <bits/platform/x86.h> directly; use <sys/platform/x86.h> instead."
21#endif
22
23enum
24{
25 CPUID_INDEX_1 = 0,
26 CPUID_INDEX_7,
27 CPUID_INDEX_80000001,
28 CPUID_INDEX_D_ECX_1,
29 CPUID_INDEX_80000007,
30 CPUID_INDEX_80000008,
31 CPUID_INDEX_7_ECX_1,
32 CPUID_INDEX_19,
33 CPUID_INDEX_14_ECX_0,
34 CPUID_INDEX_24_ECX_0
35};
36
37struct cpuid_feature
38{
39 unsigned int cpuid_array[4];
40 unsigned int active_array[4];
41};
42
43enum cpuid_register_index
44{
45 cpuid_register_index_eax = 0,
46 cpuid_register_index_ebx,
47 cpuid_register_index_ecx,
48 cpuid_register_index_edx
49};
50
51/* CPU features. */
52
53enum
54{
55 x86_cpu_index_1_ecx
56 = (CPUID_INDEX_1 * 8 * 4 * sizeof (unsigned int)
57 + cpuid_register_index_ecx * 8 * sizeof (unsigned int)),
58
59 x86_cpu_SSE3 = x86_cpu_index_1_ecx,
60 x86_cpu_PCLMULQDQ = x86_cpu_index_1_ecx + 1,
61 x86_cpu_DTES64 = x86_cpu_index_1_ecx + 2,
62 x86_cpu_MONITOR = x86_cpu_index_1_ecx + 3,
63 x86_cpu_DS_CPL = x86_cpu_index_1_ecx + 4,
64 x86_cpu_VMX = x86_cpu_index_1_ecx + 5,
65 x86_cpu_SMX = x86_cpu_index_1_ecx + 6,
66 x86_cpu_EIST = x86_cpu_index_1_ecx + 7,
67 x86_cpu_TM2 = x86_cpu_index_1_ecx + 8,
68 x86_cpu_SSSE3 = x86_cpu_index_1_ecx + 9,
69 x86_cpu_CNXT_ID = x86_cpu_index_1_ecx + 10,
70 x86_cpu_SDBG = x86_cpu_index_1_ecx + 11,
71 x86_cpu_FMA = x86_cpu_index_1_ecx + 12,
72 x86_cpu_CMPXCHG16B = x86_cpu_index_1_ecx + 13,
73 x86_cpu_XTPRUPDCTRL = x86_cpu_index_1_ecx + 14,
74 x86_cpu_PDCM = x86_cpu_index_1_ecx + 15,
75 x86_cpu_INDEX_1_ECX_16 = x86_cpu_index_1_ecx + 16,
76 x86_cpu_PCID = x86_cpu_index_1_ecx + 17,
77 x86_cpu_DCA = x86_cpu_index_1_ecx + 18,
78 x86_cpu_SSE4_1 = x86_cpu_index_1_ecx + 19,
79 x86_cpu_SSE4_2 = x86_cpu_index_1_ecx + 20,
80 x86_cpu_X2APIC = x86_cpu_index_1_ecx + 21,
81 x86_cpu_MOVBE = x86_cpu_index_1_ecx + 22,
82 x86_cpu_POPCNT = x86_cpu_index_1_ecx + 23,
83 x86_cpu_TSC_DEADLINE = x86_cpu_index_1_ecx + 24,
84 x86_cpu_AES = x86_cpu_index_1_ecx + 25,
85 x86_cpu_XSAVE = x86_cpu_index_1_ecx + 26,
86 x86_cpu_OSXSAVE = x86_cpu_index_1_ecx + 27,
87 x86_cpu_AVX = x86_cpu_index_1_ecx + 28,
88 x86_cpu_F16C = x86_cpu_index_1_ecx + 29,
89 x86_cpu_RDRAND = x86_cpu_index_1_ecx + 30,
90 x86_cpu_INDEX_1_ECX_31 = x86_cpu_index_1_ecx + 31,
91
92 x86_cpu_index_1_edx
93 = (CPUID_INDEX_1 * 8 * 4 * sizeof (unsigned int)
94 + cpuid_register_index_edx * 8 * sizeof (unsigned int)),
95
96 x86_cpu_FPU = x86_cpu_index_1_edx,
97 x86_cpu_VME = x86_cpu_index_1_edx + 1,
98 x86_cpu_DE = x86_cpu_index_1_edx + 2,
99 x86_cpu_PSE = x86_cpu_index_1_edx + 3,
100 x86_cpu_TSC = x86_cpu_index_1_edx + 4,
101 x86_cpu_MSR = x86_cpu_index_1_edx + 5,
102 x86_cpu_PAE = x86_cpu_index_1_edx + 6,
103 x86_cpu_MCE = x86_cpu_index_1_edx + 7,
104 x86_cpu_CX8 = x86_cpu_index_1_edx + 8,
105 x86_cpu_APIC = x86_cpu_index_1_edx + 9,
106 x86_cpu_INDEX_1_EDX_10 = x86_cpu_index_1_edx + 10,
107 x86_cpu_SEP = x86_cpu_index_1_edx + 11,
108 x86_cpu_MTRR = x86_cpu_index_1_edx + 12,
109 x86_cpu_PGE = x86_cpu_index_1_edx + 13,
110 x86_cpu_MCA = x86_cpu_index_1_edx + 14,
111 x86_cpu_CMOV = x86_cpu_index_1_edx + 15,
112 x86_cpu_PAT = x86_cpu_index_1_edx + 16,
113 x86_cpu_PSE_36 = x86_cpu_index_1_edx + 17,
114 x86_cpu_PSN = x86_cpu_index_1_edx + 18,
115 x86_cpu_CLFSH = x86_cpu_index_1_edx + 19,
116 x86_cpu_INDEX_1_EDX_20 = x86_cpu_index_1_edx + 20,
117 x86_cpu_DS = x86_cpu_index_1_edx + 21,
118 x86_cpu_ACPI = x86_cpu_index_1_edx + 22,
119 x86_cpu_MMX = x86_cpu_index_1_edx + 23,
120 x86_cpu_FXSR = x86_cpu_index_1_edx + 24,
121 x86_cpu_SSE = x86_cpu_index_1_edx + 25,
122 x86_cpu_SSE2 = x86_cpu_index_1_edx + 26,
123 x86_cpu_SS = x86_cpu_index_1_edx + 27,
124 x86_cpu_HTT = x86_cpu_index_1_edx + 28,
125 x86_cpu_TM = x86_cpu_index_1_edx + 29,
126 x86_cpu_INDEX_1_EDX_30 = x86_cpu_index_1_edx + 30,
127 x86_cpu_PBE = x86_cpu_index_1_edx + 31,
128
129 x86_cpu_index_7_ebx
130 = (CPUID_INDEX_7 * 8 * 4 * sizeof (unsigned int)
131 + cpuid_register_index_ebx * 8 * sizeof (unsigned int)),
132
133 x86_cpu_FSGSBASE = x86_cpu_index_7_ebx,
134 x86_cpu_TSC_ADJUST = x86_cpu_index_7_ebx + 1,
135 x86_cpu_SGX = x86_cpu_index_7_ebx + 2,
136 x86_cpu_BMI1 = x86_cpu_index_7_ebx + 3,
137 x86_cpu_HLE = x86_cpu_index_7_ebx + 4,
138 x86_cpu_AVX2 = x86_cpu_index_7_ebx + 5,
139 x86_cpu_INDEX_7_EBX_6 = x86_cpu_index_7_ebx + 6,
140 x86_cpu_SMEP = x86_cpu_index_7_ebx + 7,
141 x86_cpu_BMI2 = x86_cpu_index_7_ebx + 8,
142 x86_cpu_ERMS = x86_cpu_index_7_ebx + 9,
143 x86_cpu_INVPCID = x86_cpu_index_7_ebx + 10,
144 x86_cpu_RTM = x86_cpu_index_7_ebx + 11,
145 x86_cpu_RDT_M = x86_cpu_index_7_ebx + 12,
146 x86_cpu_DEPR_FPU_CS_DS = x86_cpu_index_7_ebx + 13,
147 x86_cpu_MPX = x86_cpu_index_7_ebx + 14,
148 x86_cpu_RDT_A = x86_cpu_index_7_ebx + 15,
149 x86_cpu_AVX512F = x86_cpu_index_7_ebx + 16,
150 x86_cpu_AVX512DQ = x86_cpu_index_7_ebx + 17,
151 x86_cpu_RDSEED = x86_cpu_index_7_ebx + 18,
152 x86_cpu_ADX = x86_cpu_index_7_ebx + 19,
153 x86_cpu_SMAP = x86_cpu_index_7_ebx + 20,
154 x86_cpu_AVX512_IFMA = x86_cpu_index_7_ebx + 21,
155 x86_cpu_INDEX_7_EBX_22 = x86_cpu_index_7_ebx + 22,
156 x86_cpu_CLFLUSHOPT = x86_cpu_index_7_ebx + 23,
157 x86_cpu_CLWB = x86_cpu_index_7_ebx + 24,
158 x86_cpu_TRACE = x86_cpu_index_7_ebx + 25,
159 x86_cpu_AVX512PF = x86_cpu_index_7_ebx + 26,
160 x86_cpu_AVX512ER = x86_cpu_index_7_ebx + 27,
161 x86_cpu_AVX512CD = x86_cpu_index_7_ebx + 28,
162 x86_cpu_SHA = x86_cpu_index_7_ebx + 29,
163 x86_cpu_AVX512BW = x86_cpu_index_7_ebx + 30,
164 x86_cpu_AVX512VL = x86_cpu_index_7_ebx + 31,
165
166 x86_cpu_index_7_ecx
167 = (CPUID_INDEX_7 * 8 * 4 * sizeof (unsigned int)
168 + cpuid_register_index_ecx * 8 * sizeof (unsigned int)),
169
170 x86_cpu_PREFETCHWT1 = x86_cpu_index_7_ecx,
171 x86_cpu_AVX512_VBMI = x86_cpu_index_7_ecx + 1,
172 x86_cpu_UMIP = x86_cpu_index_7_ecx + 2,
173 x86_cpu_PKU = x86_cpu_index_7_ecx + 3,
174 x86_cpu_OSPKE = x86_cpu_index_7_ecx + 4,
175 x86_cpu_WAITPKG = x86_cpu_index_7_ecx + 5,
176 x86_cpu_AVX512_VBMI2 = x86_cpu_index_7_ecx + 6,
177 x86_cpu_SHSTK = x86_cpu_index_7_ecx + 7,
178 x86_cpu_GFNI = x86_cpu_index_7_ecx + 8,
179 x86_cpu_VAES = x86_cpu_index_7_ecx + 9,
180 x86_cpu_VPCLMULQDQ = x86_cpu_index_7_ecx + 10,
181 x86_cpu_AVX512_VNNI = x86_cpu_index_7_ecx + 11,
182 x86_cpu_AVX512_BITALG = x86_cpu_index_7_ecx + 12,
183 x86_cpu_INDEX_7_ECX_13 = x86_cpu_index_7_ecx + 13,
184 x86_cpu_AVX512_VPOPCNTDQ = x86_cpu_index_7_ecx + 14,
185 x86_cpu_INDEX_7_ECX_15 = x86_cpu_index_7_ecx + 15,
186 x86_cpu_LA57 = x86_cpu_index_7_ecx + 16,
187/* Note: Bits 17-21: The value of MAWAU used by the BNDLDX and BNDSTX
188 instructions in 64-bit mode. */
189 x86_cpu_RDPID = x86_cpu_index_7_ecx + 22,
190 x86_cpu_KL = x86_cpu_index_7_ecx + 23,
191 x86_cpu_BUS_LOCK_DETECT = x86_cpu_index_7_ecx + 24,
192 x86_cpu_CLDEMOTE = x86_cpu_index_7_ecx + 25,
193 x86_cpu_INDEX_7_ECX_26 = x86_cpu_index_7_ecx + 26,
194 x86_cpu_MOVDIRI = x86_cpu_index_7_ecx + 27,
195 x86_cpu_MOVDIR64B = x86_cpu_index_7_ecx + 28,
196 x86_cpu_ENQCMD = x86_cpu_index_7_ecx + 29,
197 x86_cpu_SGX_LC = x86_cpu_index_7_ecx + 30,
198 x86_cpu_PKS = x86_cpu_index_7_ecx + 31,
199
200 x86_cpu_index_7_edx
201 = (CPUID_INDEX_7 * 8 * 4 * sizeof (unsigned int)
202 + cpuid_register_index_edx * 8 * sizeof (unsigned int)),
203
204 x86_cpu_INDEX_7_EDX_0 = x86_cpu_index_7_edx,
205 x86_cpu_SGX_KEYS = x86_cpu_index_7_edx + 1,
206 x86_cpu_AVX512_4VNNIW = x86_cpu_index_7_edx + 2,
207 x86_cpu_AVX512_4FMAPS = x86_cpu_index_7_edx + 3,
208 x86_cpu_FSRM = x86_cpu_index_7_edx + 4,
209 x86_cpu_UINTR = x86_cpu_index_7_edx + 5,
210 x86_cpu_INDEX_7_EDX_6 = x86_cpu_index_7_edx + 6,
211 x86_cpu_INDEX_7_EDX_7 = x86_cpu_index_7_edx + 7,
212 x86_cpu_AVX512_VP2INTERSECT = x86_cpu_index_7_edx + 8,
213 x86_cpu_INDEX_7_EDX_9 = x86_cpu_index_7_edx + 9,
214 x86_cpu_MD_CLEAR = x86_cpu_index_7_edx + 10,
215 x86_cpu_RTM_ALWAYS_ABORT = x86_cpu_index_7_edx + 11,
216 x86_cpu_INDEX_7_EDX_12 = x86_cpu_index_7_edx + 12,
217 x86_cpu_RTM_FORCE_ABORT = x86_cpu_index_7_edx + 13,
218 x86_cpu_SERIALIZE = x86_cpu_index_7_edx + 14,
219 x86_cpu_HYBRID = x86_cpu_index_7_edx + 15,
220 x86_cpu_TSXLDTRK = x86_cpu_index_7_edx + 16,
221 x86_cpu_INDEX_7_EDX_17 = x86_cpu_index_7_edx + 17,
222 x86_cpu_PCONFIG = x86_cpu_index_7_edx + 18,
223 x86_cpu_LBR = x86_cpu_index_7_edx + 19,
224 x86_cpu_IBT = x86_cpu_index_7_edx + 20,
225 x86_cpu_INDEX_7_EDX_21 = x86_cpu_index_7_edx + 21,
226 x86_cpu_AMX_BF16 = x86_cpu_index_7_edx + 22,
227 x86_cpu_AVX512_FP16 = x86_cpu_index_7_edx + 23,
228 x86_cpu_AMX_TILE = x86_cpu_index_7_edx + 24,
229 x86_cpu_AMX_INT8 = x86_cpu_index_7_edx + 25,
230 x86_cpu_IBRS_IBPB = x86_cpu_index_7_edx + 26,
231 x86_cpu_STIBP = x86_cpu_index_7_edx + 27,
232 x86_cpu_L1D_FLUSH = x86_cpu_index_7_edx + 28,
233 x86_cpu_ARCH_CAPABILITIES = x86_cpu_index_7_edx + 29,
234 x86_cpu_CORE_CAPABILITIES = x86_cpu_index_7_edx + 30,
235 x86_cpu_SSBD = x86_cpu_index_7_edx + 31,
236
237 x86_cpu_index_80000001_ecx
238 = (CPUID_INDEX_80000001 * 8 * 4 * sizeof (unsigned int)
239 + cpuid_register_index_ecx * 8 * sizeof (unsigned int)),
240
241 x86_cpu_LAHF64_SAHF64 = x86_cpu_index_80000001_ecx,
242 x86_cpu_SVM = x86_cpu_index_80000001_ecx + 2,
243 x86_cpu_LZCNT = x86_cpu_index_80000001_ecx + 5,
244 x86_cpu_SSE4A = x86_cpu_index_80000001_ecx + 6,
245 x86_cpu_PREFETCHW = x86_cpu_index_80000001_ecx + 8,
246 x86_cpu_XOP = x86_cpu_index_80000001_ecx + 11,
247 x86_cpu_LWP = x86_cpu_index_80000001_ecx + 15,
248 x86_cpu_FMA4 = x86_cpu_index_80000001_ecx + 16,
249 x86_cpu_TBM = x86_cpu_index_80000001_ecx + 21,
250
251 x86_cpu_index_80000001_edx
252 = (CPUID_INDEX_80000001 * 8 * 4 * sizeof (unsigned int)
253 + cpuid_register_index_edx * 8 * sizeof (unsigned int)),
254
255 x86_cpu_SYSCALL_SYSRET = x86_cpu_index_80000001_edx + 11,
256 x86_cpu_NX = x86_cpu_index_80000001_edx + 20,
257 x86_cpu_PAGE1GB = x86_cpu_index_80000001_edx + 26,
258 x86_cpu_RDTSCP = x86_cpu_index_80000001_edx + 27,
259 x86_cpu_LM = x86_cpu_index_80000001_edx + 29,
260
261 x86_cpu_index_d_ecx_1_eax
262 = (CPUID_INDEX_D_ECX_1 * 8 * 4 * sizeof (unsigned int)
263 + cpuid_register_index_eax * 8 * sizeof (unsigned int)),
264
265 x86_cpu_XSAVEOPT = x86_cpu_index_d_ecx_1_eax,
266 x86_cpu_XSAVEC = x86_cpu_index_d_ecx_1_eax + 1,
267 x86_cpu_XGETBV_ECX_1 = x86_cpu_index_d_ecx_1_eax + 2,
268 x86_cpu_XSAVES = x86_cpu_index_d_ecx_1_eax + 3,
269 x86_cpu_XFD = x86_cpu_index_d_ecx_1_eax + 4,
270
271 x86_cpu_index_80000007_edx
272 = (CPUID_INDEX_80000007 * 8 * 4 * sizeof (unsigned int)
273 + cpuid_register_index_edx * 8 * sizeof (unsigned int)),
274
275 x86_cpu_INVARIANT_TSC = x86_cpu_index_80000007_edx + 8,
276
277 x86_cpu_index_80000008_ebx
278 = (CPUID_INDEX_80000008 * 8 * 4 * sizeof (unsigned int)
279 + cpuid_register_index_ebx * 8 * sizeof (unsigned int)),
280
281 x86_cpu_WBNOINVD = x86_cpu_index_80000008_ebx + 9,
282 x86_cpu_AMD_IBPB = x86_cpu_index_80000008_ebx + 12,
283 x86_cpu_AMD_IBRS = x86_cpu_index_80000008_ebx + 14,
284 x86_cpu_AMD_STIBP = x86_cpu_index_80000008_ebx + 15,
285 x86_cpu_AMD_SSBD = x86_cpu_index_80000008_ebx + 24,
286 x86_cpu_AMD_VIRT_SSBD = x86_cpu_index_80000008_ebx + 25,
287
288 x86_cpu_index_7_ecx_1_eax
289 = (CPUID_INDEX_7_ECX_1 * 8 * 4 * sizeof (unsigned int)
290 + cpuid_register_index_eax * 8 * sizeof (unsigned int)),
291
292 x86_cpu_RAO_INT = x86_cpu_index_7_ecx_1_eax + 3,
293 x86_cpu_AVX_VNNI = x86_cpu_index_7_ecx_1_eax + 4,
294 x86_cpu_AVX512_BF16 = x86_cpu_index_7_ecx_1_eax + 5,
295 x86_cpu_LASS = x86_cpu_index_7_ecx_1_eax + 6,
296 x86_cpu_CMPCCXADD = x86_cpu_index_7_ecx_1_eax + 7,
297 x86_cpu_ArchPerfmonExt = x86_cpu_index_7_ecx_1_eax + 8,
298 x86_cpu_FZLRM = x86_cpu_index_7_ecx_1_eax + 10,
299 x86_cpu_FSRS = x86_cpu_index_7_ecx_1_eax + 11,
300 x86_cpu_FSRCS = x86_cpu_index_7_ecx_1_eax + 12,
301 x86_cpu_WRMSRNS = x86_cpu_index_7_ecx_1_eax + 19,
302 x86_cpu_AMX_FP16 = x86_cpu_index_7_ecx_1_eax + 21,
303 x86_cpu_HRESET = x86_cpu_index_7_ecx_1_eax + 22,
304 x86_cpu_AVX_IFMA = x86_cpu_index_7_ecx_1_eax + 23,
305 x86_cpu_LAM = x86_cpu_index_7_ecx_1_eax + 26,
306 x86_cpu_MSRLIST = x86_cpu_index_7_ecx_1_eax + 27,
307
308 x86_cpu_index_7_ecx_1_edx
309 = (CPUID_INDEX_7_ECX_1 * 8 * 4 * sizeof (unsigned int)
310 + cpuid_register_index_edx * 8 * sizeof (unsigned int)),
311
312 x86_cpu_AVX_VNNI_INT8 = x86_cpu_index_7_ecx_1_edx + 4,
313 x86_cpu_AVX_NE_CONVERT = x86_cpu_index_7_ecx_1_edx + 5,
314 x86_cpu_AMX_COMPLEX = x86_cpu_index_7_ecx_1_edx + 8,
315 x86_cpu_PREFETCHI = x86_cpu_index_7_ecx_1_edx + 14,
316 x86_cpu_AVX10 = x86_cpu_index_7_ecx_1_edx + 19,
317 x86_cpu_APX_F = x86_cpu_index_7_ecx_1_edx + 21,
318
319 x86_cpu_index_19_ebx
320 = (CPUID_INDEX_19 * 8 * 4 * sizeof (unsigned int)
321 + cpuid_register_index_ebx * 8 * sizeof (unsigned int)),
322
323 x86_cpu_AESKLE = x86_cpu_index_19_ebx,
324 x86_cpu_WIDE_KL = x86_cpu_index_19_ebx + 2,
325
326 x86_cpu_index_14_ecx_0_ebx
327 = (CPUID_INDEX_14_ECX_0 * 8 * 4 * sizeof (unsigned int)
328 + cpuid_register_index_ebx * 8 * sizeof (unsigned int)),
329
330 x86_cpu_PTWRITE = x86_cpu_index_14_ecx_0_ebx + 4,
331
332 x86_cpu_index_24_ecx_0_ebx
333 = (CPUID_INDEX_24_ECX_0 * 8 * 4 * sizeof (unsigned int)
334 + cpuid_register_index_ebx * 8 * sizeof (unsigned int)),
335
336 x86_cpu_AVX10_XMM = x86_cpu_index_24_ecx_0_ebx + 16,
337 x86_cpu_AVX10_YMM = x86_cpu_index_24_ecx_0_ebx + 17,
338 x86_cpu_AVX10_ZMM = x86_cpu_index_24_ecx_0_ebx + 18,
339};
340

source code of glibc/sysdeps/x86/bits/platform/x86.h