1/* Constants and data structures for x86 CPU features.
  2   This file is part of the GNU C Library.
  3   Copyright (C) 2008-2025 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};