Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86, cpu: Support the features flags in new CPUID leaf 7

Intel has defined CPUID leaf 7 as the next set of feature flags (see
the AVX specification, version 007). Add support for this new feature
flags word.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
LKML-Reference: <tip-*@vger.kernel.org>

+21 -4
+9 -4
arch/x86/include/asm/cpufeature.h
··· 6 6 7 7 #include <asm/required-features.h> 8 8 9 - #define NCAPINTS 9 /* N 32-bit words worth of info */ 9 + #define NCAPINTS 10 /* N 32-bit words worth of info */ 10 10 11 11 /* 12 12 * Note: If the comment begins with a quoted string, that string is used ··· 159 159 160 160 /* 161 161 * Auxiliary flags: Linux defined - For features scattered in various 162 - * CPUID levels like 0x6, 0xA etc 162 + * CPUID levels like 0x6, 0xA etc, word 7 163 163 */ 164 164 #define X86_FEATURE_IDA (7*32+ 0) /* Intel Dynamic Acceleration */ 165 165 #define X86_FEATURE_ARAT (7*32+ 1) /* Always Running APIC Timer */ 166 166 #define X86_FEATURE_CPB (7*32+ 2) /* AMD Core Performance Boost */ 167 167 #define X86_FEATURE_EPB (7*32+ 3) /* IA32_ENERGY_PERF_BIAS support */ 168 168 169 - /* Virtualization flags: Linux defined */ 169 + /* Virtualization flags: Linux defined, word 8 */ 170 170 #define X86_FEATURE_TPR_SHADOW (8*32+ 0) /* Intel TPR Shadow */ 171 171 #define X86_FEATURE_VNMI (8*32+ 1) /* Intel Virtual NMI */ 172 172 #define X86_FEATURE_FLEXPRIORITY (8*32+ 2) /* Intel FlexPriority */ ··· 176 176 #define X86_FEATURE_LBRV (8*32+6) /* AMD LBR Virtualization support */ 177 177 #define X86_FEATURE_SVML (8*32+7) /* "svm_lock" AMD SVM locking MSR */ 178 178 #define X86_FEATURE_NRIPS (8*32+8) /* "nrip_save" AMD SVM next_rip save */ 179 + 180 + /* Intel-defined CPU features, CPUID level 0x00000007:0 (ebx), word 9 */ 181 + #define X86_FEATURE_FSGSBASE (9*32+0) /* {RD/WR}{FS/GS}BASE instructions*/ 179 182 180 183 #if defined(__KERNEL__) && !defined(__ASSEMBLY__) 181 184 ··· 200 197 (((bit)>>5)==4 && (1UL<<((bit)&31) & REQUIRED_MASK4)) || \ 201 198 (((bit)>>5)==5 && (1UL<<((bit)&31) & REQUIRED_MASK5)) || \ 202 199 (((bit)>>5)==6 && (1UL<<((bit)&31) & REQUIRED_MASK6)) || \ 203 - (((bit)>>5)==7 && (1UL<<((bit)&31) & REQUIRED_MASK7)) ) \ 200 + (((bit)>>5)==7 && (1UL<<((bit)&31) & REQUIRED_MASK7)) || \ 201 + (((bit)>>5)==8 && (1UL<<((bit)&31) & REQUIRED_MASK8)) || \ 202 + (((bit)>>5)==9 && (1UL<<((bit)&31) & REQUIRED_MASK9)) ) \ 204 203 ? 1 : \ 205 204 test_cpu_cap(c, bit)) 206 205
+2
arch/x86/include/asm/required-features.h
··· 84 84 #define REQUIRED_MASK5 0 85 85 #define REQUIRED_MASK6 0 86 86 #define REQUIRED_MASK7 0 87 + #define REQUIRED_MASK8 0 88 + #define REQUIRED_MASK9 0 87 89 88 90 #endif /* _ASM_X86_REQUIRED_FEATURES_H */
+10
arch/x86/kernel/cpu/common.c
··· 551 551 c->x86_capability[4] = excap; 552 552 } 553 553 554 + /* Additional Intel-defined flags: level 0x00000007 */ 555 + if (c->cpuid_level >= 0x00000007) { 556 + u32 eax, ebx, ecx, edx; 557 + 558 + cpuid_count(0x00000007, 0, &eax, &ebx, &ecx, &edx); 559 + 560 + if (eax > 0) 561 + c->x86_capability[9] = ebx; 562 + } 563 + 554 564 /* AMD-defined flags: level 0x80000001 */ 555 565 xlvl = cpuid_eax(0x80000000); 556 566 c->extended_cpuid_level = xlvl;