1 /* Constants and data structures for x86 CPU features. 2 This file is part of the GNU C Library. 3 Copyright (C) 2008-2022 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 23 enum 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 }; 35 36 struct cpuid_feature 37 { 38 unsigned int cpuid_array[4]; 39 unsigned int active_array[4]; 40 }; 41 42 enum cpuid_register_index 43 { 44 cpuid_register_index_eax = 0, 45 cpuid_register_index_ebx, 46 cpuid_register_index_ecx, 47 cpuid_register_index_edx 48 }; 49 50 /* CPU features. */ 51 52 enum 53 { 54 x86_cpu_index_1_ecx 55 = (CPUID_INDEX_1 * 8 * 4 * sizeof (unsigned int) 56 + cpuid_register_index_ecx * 8 * sizeof (unsigned int)), 57 58 x86_cpu_SSE3 = x86_cpu_index_1_ecx, 59 x86_cpu_PCLMULQDQ = x86_cpu_index_1_ecx + 1, 60 x86_cpu_DTES64 = x86_cpu_index_1_ecx + 2, 61 x86_cpu_MONITOR = x86_cpu_index_1_ecx + 3, 62 x86_cpu_DS_CPL = x86_cpu_index_1_ecx + 4, 63 x86_cpu_VMX = x86_cpu_index_1_ecx + 5, 64 x86_cpu_SMX = x86_cpu_index_1_ecx + 6, 65 x86_cpu_EIST = x86_cpu_index_1_ecx + 7, 66 x86_cpu_TM2 = x86_cpu_index_1_ecx + 8, 67 x86_cpu_SSSE3 = x86_cpu_index_1_ecx + 9, 68 x86_cpu_CNXT_ID = x86_cpu_index_1_ecx + 10, 69 x86_cpu_SDBG = x86_cpu_index_1_ecx + 11, 70 x86_cpu_FMA = x86_cpu_index_1_ecx + 12, 71 x86_cpu_CMPXCHG16B = x86_cpu_index_1_ecx + 13, 72 x86_cpu_XTPRUPDCTRL = x86_cpu_index_1_ecx + 14, 73 x86_cpu_PDCM = x86_cpu_index_1_ecx + 15, 74 x86_cpu_INDEX_1_ECX_16 = x86_cpu_index_1_ecx + 16, 75 x86_cpu_PCID = x86_cpu_index_1_ecx + 17, 76 x86_cpu_DCA = x86_cpu_index_1_ecx + 18, 77 x86_cpu_SSE4_1 = x86_cpu_index_1_ecx + 19, 78 x86_cpu_SSE4_2 = x86_cpu_index_1_ecx + 20, 79 x86_cpu_X2APIC = x86_cpu_index_1_ecx + 21, 80 x86_cpu_MOVBE = x86_cpu_index_1_ecx + 22, 81 x86_cpu_POPCNT = x86_cpu_index_1_ecx + 23, 82 x86_cpu_TSC_DEADLINE = x86_cpu_index_1_ecx + 24, 83 x86_cpu_AES = x86_cpu_index_1_ecx + 25, 84 x86_cpu_XSAVE = x86_cpu_index_1_ecx + 26, 85 x86_cpu_OSXSAVE = x86_cpu_index_1_ecx + 27, 86 x86_cpu_AVX = x86_cpu_index_1_ecx + 28, 87 x86_cpu_F16C = x86_cpu_index_1_ecx + 29, 88 x86_cpu_RDRAND = x86_cpu_index_1_ecx + 30, 89 x86_cpu_INDEX_1_ECX_31 = x86_cpu_index_1_ecx + 31, 90 91 x86_cpu_index_1_edx 92 = (CPUID_INDEX_1 * 8 * 4 * sizeof (unsigned int) 93 + cpuid_register_index_edx * 8 * sizeof (unsigned int)), 94 95 x86_cpu_FPU = x86_cpu_index_1_edx, 96 x86_cpu_VME = x86_cpu_index_1_edx + 1, 97 x86_cpu_DE = x86_cpu_index_1_edx + 2, 98 x86_cpu_PSE = x86_cpu_index_1_edx + 3, 99 x86_cpu_TSC = x86_cpu_index_1_edx + 4, 100 x86_cpu_MSR = x86_cpu_index_1_edx + 5, 101 x86_cpu_PAE = x86_cpu_index_1_edx + 6, 102 x86_cpu_MCE = x86_cpu_index_1_edx + 7, 103 x86_cpu_CX8 = x86_cpu_index_1_edx + 8, 104 x86_cpu_APIC = x86_cpu_index_1_edx + 9, 105 x86_cpu_INDEX_1_EDX_10 = x86_cpu_index_1_edx + 10, 106 x86_cpu_SEP = x86_cpu_index_1_edx + 11, 107 x86_cpu_MTRR = x86_cpu_index_1_edx + 12, 108 x86_cpu_PGE = x86_cpu_index_1_edx + 13, 109 x86_cpu_MCA = x86_cpu_index_1_edx + 14, 110 x86_cpu_CMOV = x86_cpu_index_1_edx + 15, 111 x86_cpu_PAT = x86_cpu_index_1_edx + 16, 112 x86_cpu_PSE_36 = x86_cpu_index_1_edx + 17, 113 x86_cpu_PSN = x86_cpu_index_1_edx + 18, 114 x86_cpu_CLFSH = x86_cpu_index_1_edx + 19, 115 x86_cpu_INDEX_1_EDX_20 = x86_cpu_index_1_edx + 20, 116 x86_cpu_DS = x86_cpu_index_1_edx + 21, 117 x86_cpu_ACPI = x86_cpu_index_1_edx + 22, 118 x86_cpu_MMX = x86_cpu_index_1_edx + 23, 119 x86_cpu_FXSR = x86_cpu_index_1_edx + 24, 120 x86_cpu_SSE = x86_cpu_index_1_edx + 25, 121 x86_cpu_SSE2 = x86_cpu_index_1_edx + 26, 122 x86_cpu_SS = x86_cpu_index_1_edx + 27, 123 x86_cpu_HTT = x86_cpu_index_1_edx + 28, 124 x86_cpu_TM = x86_cpu_index_1_edx + 29, 125 x86_cpu_INDEX_1_EDX_30 = x86_cpu_index_1_edx + 30, 126 x86_cpu_PBE = x86_cpu_index_1_edx + 31, 127 128 x86_cpu_index_7_ebx 129 = (CPUID_INDEX_7 * 8 * 4 * sizeof (unsigned int) 130 + cpuid_register_index_ebx * 8 * sizeof (unsigned int)), 131 132 x86_cpu_FSGSBASE = x86_cpu_index_7_ebx, 133 x86_cpu_TSC_ADJUST = x86_cpu_index_7_ebx + 1, 134 x86_cpu_SGX = x86_cpu_index_7_ebx + 2, 135 x86_cpu_BMI1 = x86_cpu_index_7_ebx + 3, 136 x86_cpu_HLE = x86_cpu_index_7_ebx + 4, 137 x86_cpu_AVX2 = x86_cpu_index_7_ebx + 5, 138 x86_cpu_INDEX_7_EBX_6 = x86_cpu_index_7_ebx + 6, 139 x86_cpu_SMEP = x86_cpu_index_7_ebx + 7, 140 x86_cpu_BMI2 = x86_cpu_index_7_ebx + 8, 141 x86_cpu_ERMS = x86_cpu_index_7_ebx + 9, 142 x86_cpu_INVPCID = x86_cpu_index_7_ebx + 10, 143 x86_cpu_RTM = x86_cpu_index_7_ebx + 11, 144 x86_cpu_RDT_M = x86_cpu_index_7_ebx + 12, 145 x86_cpu_DEPR_FPU_CS_DS = x86_cpu_index_7_ebx + 13, 146 x86_cpu_MPX = x86_cpu_index_7_ebx + 14, 147 x86_cpu_RDT_A = x86_cpu_index_7_ebx + 15, 148 x86_cpu_AVX512F = x86_cpu_index_7_ebx + 16, 149 x86_cpu_AVX512DQ = x86_cpu_index_7_ebx + 17, 150 x86_cpu_RDSEED = x86_cpu_index_7_ebx + 18, 151 x86_cpu_ADX = x86_cpu_index_7_ebx + 19, 152 x86_cpu_SMAP = x86_cpu_index_7_ebx + 20, 153 x86_cpu_AVX512_IFMA = x86_cpu_index_7_ebx + 21, 154 x86_cpu_INDEX_7_EBX_22 = x86_cpu_index_7_ebx + 22, 155 x86_cpu_CLFLUSHOPT = x86_cpu_index_7_ebx + 23, 156 x86_cpu_CLWB = x86_cpu_index_7_ebx + 24, 157 x86_cpu_TRACE = x86_cpu_index_7_ebx + 25, 158 x86_cpu_AVX512PF = x86_cpu_index_7_ebx + 26, 159 x86_cpu_AVX512ER = x86_cpu_index_7_ebx + 27, 160 x86_cpu_AVX512CD = x86_cpu_index_7_ebx + 28, 161 x86_cpu_SHA = x86_cpu_index_7_ebx + 29, 162 x86_cpu_AVX512BW = x86_cpu_index_7_ebx + 30, 163 x86_cpu_AVX512VL = x86_cpu_index_7_ebx + 31, 164 165 x86_cpu_index_7_ecx 166 = (CPUID_INDEX_7 * 8 * 4 * sizeof (unsigned int) 167 + cpuid_register_index_ecx * 8 * sizeof (unsigned int)), 168 169 x86_cpu_PREFETCHWT1 = x86_cpu_index_7_ecx, 170 x86_cpu_AVX512_VBMI = x86_cpu_index_7_ecx + 1, 171 x86_cpu_UMIP = x86_cpu_index_7_ecx + 2, 172 x86_cpu_PKU = x86_cpu_index_7_ecx + 3, 173 x86_cpu_OSPKE = x86_cpu_index_7_ecx + 4, 174 x86_cpu_WAITPKG = x86_cpu_index_7_ecx + 5, 175 x86_cpu_AVX512_VBMI2 = x86_cpu_index_7_ecx + 6, 176 x86_cpu_SHSTK = x86_cpu_index_7_ecx + 7, 177 x86_cpu_GFNI = x86_cpu_index_7_ecx + 8, 178 x86_cpu_VAES = x86_cpu_index_7_ecx + 9, 179 x86_cpu_VPCLMULQDQ = x86_cpu_index_7_ecx + 10, 180 x86_cpu_AVX512_VNNI = x86_cpu_index_7_ecx + 11, 181 x86_cpu_AVX512_BITALG = x86_cpu_index_7_ecx + 12, 182 x86_cpu_INDEX_7_ECX_13 = x86_cpu_index_7_ecx + 13, 183 x86_cpu_AVX512_VPOPCNTDQ = x86_cpu_index_7_ecx + 14, 184 x86_cpu_INDEX_7_ECX_1 = x86_cpu_index_7_ecx + 15, 185 x86_cpu_INDEX_7_ECX_16 = x86_cpu_index_7_ecx + 16, 186 /* Note: Bits 17-21: The value of MAWAU used by the BNDLDX and BNDSTX 187 instructions in 64-bit mode. */ 188 x86_cpu_RDPID = x86_cpu_index_7_ecx + 22, 189 x86_cpu_KL = x86_cpu_index_7_ecx + 23, 190 x86_cpu_INDEX_7_ECX_24 = x86_cpu_index_7_ecx + 24, 191 x86_cpu_CLDEMOTE = x86_cpu_index_7_ecx + 25, 192 x86_cpu_INDEX_7_ECX_26 = x86_cpu_index_7_ecx + 26, 193 x86_cpu_MOVDIRI = x86_cpu_index_7_ecx + 27, 194 x86_cpu_MOVDIR64B = x86_cpu_index_7_ecx + 28, 195 x86_cpu_ENQCMD = x86_cpu_index_7_ecx + 29, 196 x86_cpu_SGX_LC = x86_cpu_index_7_ecx + 30, 197 x86_cpu_PKS = x86_cpu_index_7_ecx + 31, 198 199 x86_cpu_index_7_edx 200 = (CPUID_INDEX_7 * 8 * 4 * sizeof (unsigned int) 201 + cpuid_register_index_edx * 8 * sizeof (unsigned int)), 202 203 x86_cpu_INDEX_7_EDX_0 = x86_cpu_index_7_edx, 204 x86_cpu_INDEX_7_EDX_1 = x86_cpu_index_7_edx + 1, 205 x86_cpu_AVX512_4VNNIW = x86_cpu_index_7_edx + 2, 206 x86_cpu_AVX512_4FMAPS = x86_cpu_index_7_edx + 3, 207 x86_cpu_FSRM = x86_cpu_index_7_edx + 4, 208 x86_cpu_UINTR = x86_cpu_index_7_edx + 5, 209 x86_cpu_INDEX_7_EDX_6 = x86_cpu_index_7_edx + 6, 210 x86_cpu_INDEX_7_EDX_7 = x86_cpu_index_7_edx + 7, 211 x86_cpu_AVX512_VP2INTERSECT = x86_cpu_index_7_edx + 8, 212 x86_cpu_INDEX_7_EDX_9 = x86_cpu_index_7_edx + 9, 213 x86_cpu_MD_CLEAR = x86_cpu_index_7_edx + 10, 214 x86_cpu_RTM_ALWAYS_ABORT = x86_cpu_index_7_edx + 11, 215 x86_cpu_INDEX_7_EDX_12 = x86_cpu_index_7_edx + 12, 216 x86_cpu_INDEX_7_EDX_13 = x86_cpu_index_7_edx + 13, 217 x86_cpu_SERIALIZE = x86_cpu_index_7_edx + 14, 218 x86_cpu_HYBRID = x86_cpu_index_7_edx + 15, 219 x86_cpu_TSXLDTRK = x86_cpu_index_7_edx + 16, 220 x86_cpu_INDEX_7_EDX_17 = x86_cpu_index_7_edx + 17, 221 x86_cpu_PCONFIG = x86_cpu_index_7_edx + 18, 222 x86_cpu_INDEX_7_EDX_19 = x86_cpu_index_7_edx + 19, 223 x86_cpu_IBT = x86_cpu_index_7_edx + 20, 224 x86_cpu_INDEX_7_EDX_21 = x86_cpu_index_7_edx + 21, 225 x86_cpu_AMX_BF16 = x86_cpu_index_7_edx + 22, 226 x86_cpu_AVX512_FP16 = x86_cpu_index_7_edx + 23, 227 x86_cpu_AMX_TILE = x86_cpu_index_7_edx + 24, 228 x86_cpu_AMX_INT8 = x86_cpu_index_7_edx + 25, 229 x86_cpu_IBRS_IBPB = x86_cpu_index_7_edx + 26, 230 x86_cpu_STIBP = x86_cpu_index_7_edx + 27, 231 x86_cpu_L1D_FLUSH = x86_cpu_index_7_edx + 28, 232 x86_cpu_ARCH_CAPABILITIES = x86_cpu_index_7_edx + 29, 233 x86_cpu_CORE_CAPABILITIES = x86_cpu_index_7_edx + 30, 234 x86_cpu_SSBD = x86_cpu_index_7_edx + 31, 235 236 x86_cpu_index_80000001_ecx 237 = (CPUID_INDEX_80000001 * 8 * 4 * sizeof (unsigned int) 238 + cpuid_register_index_ecx * 8 * sizeof (unsigned int)), 239 240 x86_cpu_LAHF64_SAHF64 = x86_cpu_index_80000001_ecx, 241 x86_cpu_SVM = x86_cpu_index_80000001_ecx + 2, 242 x86_cpu_LZCNT = x86_cpu_index_80000001_ecx + 5, 243 x86_cpu_SSE4A = x86_cpu_index_80000001_ecx + 6, 244 x86_cpu_PREFETCHW = x86_cpu_index_80000001_ecx + 8, 245 x86_cpu_XOP = x86_cpu_index_80000001_ecx + 11, 246 x86_cpu_LWP = x86_cpu_index_80000001_ecx + 15, 247 x86_cpu_FMA4 = x86_cpu_index_80000001_ecx + 16, 248 x86_cpu_TBM = x86_cpu_index_80000001_ecx + 21, 249 250 x86_cpu_index_80000001_edx 251 = (CPUID_INDEX_80000001 * 8 * 4 * sizeof (unsigned int) 252 + cpuid_register_index_edx * 8 * sizeof (unsigned int)), 253 254 x86_cpu_SYSCALL_SYSRET = x86_cpu_index_80000001_edx + 11, 255 x86_cpu_NX = x86_cpu_index_80000001_edx + 20, 256 x86_cpu_PAGE1GB = x86_cpu_index_80000001_edx + 26, 257 x86_cpu_RDTSCP = x86_cpu_index_80000001_edx + 27, 258 x86_cpu_LM = x86_cpu_index_80000001_edx + 29, 259 260 x86_cpu_index_d_ecx_1_eax 261 = (CPUID_INDEX_D_ECX_1 * 8 * 4 * sizeof (unsigned int) 262 + cpuid_register_index_eax * 8 * sizeof (unsigned int)), 263 264 x86_cpu_XSAVEOPT = x86_cpu_index_d_ecx_1_eax, 265 x86_cpu_XSAVEC = x86_cpu_index_d_ecx_1_eax + 1, 266 x86_cpu_XGETBV_ECX_1 = x86_cpu_index_d_ecx_1_eax + 2, 267 x86_cpu_XSAVES = x86_cpu_index_d_ecx_1_eax + 3, 268 x86_cpu_XFD = x86_cpu_index_d_ecx_1_eax + 4, 269 270 x86_cpu_index_80000007_edx 271 = (CPUID_INDEX_80000007 * 8 * 4 * sizeof (unsigned int) 272 + cpuid_register_index_edx * 8 * sizeof (unsigned int)), 273 274 x86_cpu_INVARIANT_TSC = x86_cpu_index_80000007_edx + 8, 275 276 x86_cpu_index_80000008_ebx 277 = (CPUID_INDEX_80000008 * 8 * 4 * sizeof (unsigned int) 278 + cpuid_register_index_ebx * 8 * sizeof (unsigned int)), 279 280 x86_cpu_WBNOINVD = x86_cpu_index_80000008_ebx + 9, 281 x86_cpu_AMD_IBPB = x86_cpu_index_80000008_ebx + 12, 282 x86_cpu_AMD_IBRS = x86_cpu_index_80000008_ebx + 14, 283 x86_cpu_AMD_STIBP = x86_cpu_index_80000008_ebx + 15, 284 x86_cpu_AMD_SSBD = x86_cpu_index_80000008_ebx + 24, 285 x86_cpu_AMD_VIRT_SSBD = x86_cpu_index_80000008_ebx + 25, 286 287 x86_cpu_index_7_ecx_1_eax 288 = (CPUID_INDEX_7_ECX_1 * 8 * 4 * sizeof (unsigned int) 289 + cpuid_register_index_eax * 8 * sizeof (unsigned int)), 290 291 x86_cpu_AVX_VNNI = x86_cpu_index_7_ecx_1_eax + 4, 292 x86_cpu_AVX512_BF16 = x86_cpu_index_7_ecx_1_eax + 5, 293 x86_cpu_FZLRM = x86_cpu_index_7_ecx_1_eax + 10, 294 x86_cpu_FSRS = x86_cpu_index_7_ecx_1_eax + 11, 295 x86_cpu_FSRCS = x86_cpu_index_7_ecx_1_eax + 12, 296 x86_cpu_HRESET = x86_cpu_index_7_ecx_1_eax + 22, 297 x86_cpu_LAM = x86_cpu_index_7_ecx_1_eax + 26, 298 299 x86_cpu_index_19_ebx 300 = (CPUID_INDEX_19 * 8 * 4 * sizeof (unsigned int) 301 + cpuid_register_index_ebx * 8 * sizeof (unsigned int)), 302 303 x86_cpu_AESKLE = x86_cpu_index_19_ebx, 304 x86_cpu_WIDE_KL = x86_cpu_index_19_ebx + 2, 305 306 x86_cpu_index_14_ecx_0_ebx 307 = (CPUID_INDEX_14_ECX_0 * 8 * 4 * sizeof (unsigned int) 308 + cpuid_register_index_ebx * 8 * sizeof (unsigned int)), 309 310 x86_cpu_PTWRITE = x86_cpu_index_14_ecx_0_ebx + 4 311 }; 312