diff options
author | Dave Hansen <dave.hansen@linux.intel.com> | 2014-09-11 17:15:24 -0400 |
---|---|---|
committer | H. Peter Anvin <hpa@linux.intel.com> | 2014-09-11 17:30:17 -0400 |
commit | 9298b815efe500b272e4084ed05eeae7a92b5340 (patch) | |
tree | 7ea33c7d7576125749453b793ccb2143140d14a8 | |
parent | 381aa07a9b4e1f82969203e9e4863da2a157781d (diff) |
x86: Add more disabled features
The original motivation for these patches was for an Intel CPU
feature called MPX. The patch to add a disabled feature for it
will go in with the other parts of the support.
But, in the meantime, there are a few other features than MPX
that we can make assumptions about at compile-time based on
compile options. Add them to disabled-features.h and check them
with cpu_feature_enabled().
Note that this gets rid of the last things that needed an #ifdef
CONFIG_X86_64 in cpufeature.h. Yay!
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Link: http://lkml.kernel.org/r/20140911211524.C0EC332A@viggo.jf.intel.com
Acked-by: Borislav Petkov <bp@suse.de>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
-rw-r--r-- | arch/x86/include/asm/cpufeature.h | 20 | ||||
-rw-r--r-- | arch/x86/include/asm/disabled-features.h | 16 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/common.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/mtrr/main.c | 6 |
4 files changed, 18 insertions, 26 deletions
diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h index 1492041b8a68..42db503b61fb 100644 --- a/arch/x86/include/asm/cpufeature.h +++ b/arch/x86/include/asm/cpufeature.h | |||
@@ -324,7 +324,6 @@ extern const char * const x86_bug_flags[NBUGINTS*32]; | |||
324 | } while (0) | 324 | } while (0) |
325 | 325 | ||
326 | #define cpu_has_fpu boot_cpu_has(X86_FEATURE_FPU) | 326 | #define cpu_has_fpu boot_cpu_has(X86_FEATURE_FPU) |
327 | #define cpu_has_vme boot_cpu_has(X86_FEATURE_VME) | ||
328 | #define cpu_has_de boot_cpu_has(X86_FEATURE_DE) | 327 | #define cpu_has_de boot_cpu_has(X86_FEATURE_DE) |
329 | #define cpu_has_pse boot_cpu_has(X86_FEATURE_PSE) | 328 | #define cpu_has_pse boot_cpu_has(X86_FEATURE_PSE) |
330 | #define cpu_has_tsc boot_cpu_has(X86_FEATURE_TSC) | 329 | #define cpu_has_tsc boot_cpu_has(X86_FEATURE_TSC) |
@@ -343,9 +342,6 @@ extern const char * const x86_bug_flags[NBUGINTS*32]; | |||
343 | #define cpu_has_avx2 boot_cpu_has(X86_FEATURE_AVX2) | 342 | #define cpu_has_avx2 boot_cpu_has(X86_FEATURE_AVX2) |
344 | #define cpu_has_ht boot_cpu_has(X86_FEATURE_HT) | 343 | #define cpu_has_ht boot_cpu_has(X86_FEATURE_HT) |
345 | #define cpu_has_nx boot_cpu_has(X86_FEATURE_NX) | 344 | #define cpu_has_nx boot_cpu_has(X86_FEATURE_NX) |
346 | #define cpu_has_k6_mtrr boot_cpu_has(X86_FEATURE_K6_MTRR) | ||
347 | #define cpu_has_cyrix_arr boot_cpu_has(X86_FEATURE_CYRIX_ARR) | ||
348 | #define cpu_has_centaur_mcr boot_cpu_has(X86_FEATURE_CENTAUR_MCR) | ||
349 | #define cpu_has_xstore boot_cpu_has(X86_FEATURE_XSTORE) | 345 | #define cpu_has_xstore boot_cpu_has(X86_FEATURE_XSTORE) |
350 | #define cpu_has_xstore_enabled boot_cpu_has(X86_FEATURE_XSTORE_EN) | 346 | #define cpu_has_xstore_enabled boot_cpu_has(X86_FEATURE_XSTORE_EN) |
351 | #define cpu_has_xcrypt boot_cpu_has(X86_FEATURE_XCRYPT) | 347 | #define cpu_has_xcrypt boot_cpu_has(X86_FEATURE_XCRYPT) |
@@ -380,22 +376,6 @@ extern const char * const x86_bug_flags[NBUGINTS*32]; | |||
380 | #define cpu_has_eager_fpu boot_cpu_has(X86_FEATURE_EAGER_FPU) | 376 | #define cpu_has_eager_fpu boot_cpu_has(X86_FEATURE_EAGER_FPU) |
381 | #define cpu_has_topoext boot_cpu_has(X86_FEATURE_TOPOEXT) | 377 | #define cpu_has_topoext boot_cpu_has(X86_FEATURE_TOPOEXT) |
382 | 378 | ||
383 | #ifdef CONFIG_X86_64 | ||
384 | |||
385 | #undef cpu_has_vme | ||
386 | #define cpu_has_vme 0 | ||
387 | |||
388 | #undef cpu_has_k6_mtrr | ||
389 | #define cpu_has_k6_mtrr 0 | ||
390 | |||
391 | #undef cpu_has_cyrix_arr | ||
392 | #define cpu_has_cyrix_arr 0 | ||
393 | |||
394 | #undef cpu_has_centaur_mcr | ||
395 | #define cpu_has_centaur_mcr 0 | ||
396 | |||
397 | #endif /* CONFIG_X86_64 */ | ||
398 | |||
399 | #if __GNUC__ >= 4 | 379 | #if __GNUC__ >= 4 |
400 | extern void warn_pre_alternatives(void); | 380 | extern void warn_pre_alternatives(void); |
401 | extern bool __static_cpu_has_safe(u16 bit); | 381 | extern bool __static_cpu_has_safe(u16 bit); |
diff --git a/arch/x86/include/asm/disabled-features.h b/arch/x86/include/asm/disabled-features.h index 1a9955dbf0a0..97534a7d38e3 100644 --- a/arch/x86/include/asm/disabled-features.h +++ b/arch/x86/include/asm/disabled-features.h | |||
@@ -10,13 +10,25 @@ | |||
10 | * cpu_feature_enabled(). | 10 | * cpu_feature_enabled(). |
11 | */ | 11 | */ |
12 | 12 | ||
13 | #ifdef CONFIG_X86_64 | ||
14 | # define DISABLE_VME (1<<(X86_FEATURE_VME & 31)) | ||
15 | # define DISABLE_K6_MTRR (1<<(X86_FEATURE_K6_MTRR & 31)) | ||
16 | # define DISABLE_CYRIX_ARR (1<<(X86_FEATURE_CYRIX_ARR & 31)) | ||
17 | # define DISABLE_CENTAUR_MCR (1<<(X86_FEATURE_CENTAUR_MCR & 31)) | ||
18 | #else | ||
19 | # define DISABLE_VME 0 | ||
20 | # define DISABLE_K6_MTRR 0 | ||
21 | # define DISABLE_CYRIX_ARR 0 | ||
22 | # define DISABLE_CENTAUR_MCR 0 | ||
23 | #endif /* CONFIG_X86_64 */ | ||
24 | |||
13 | /* | 25 | /* |
14 | * Make sure to add features to the correct mask | 26 | * Make sure to add features to the correct mask |
15 | */ | 27 | */ |
16 | #define DISABLED_MASK0 0 | 28 | #define DISABLED_MASK0 (DISABLE_VME) |
17 | #define DISABLED_MASK1 0 | 29 | #define DISABLED_MASK1 0 |
18 | #define DISABLED_MASK2 0 | 30 | #define DISABLED_MASK2 0 |
19 | #define DISABLED_MASK3 0 | 31 | #define DISABLED_MASK3 (DISABLE_CYRIX_ARR|DISABLE_CENTAUR_MCR|DISABLE_K6_MTRR) |
20 | #define DISABLED_MASK4 0 | 32 | #define DISABLED_MASK4 0 |
21 | #define DISABLED_MASK5 0 | 33 | #define DISABLED_MASK5 0 |
22 | #define DISABLED_MASK6 0 | 34 | #define DISABLED_MASK6 0 |
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index e4ab2b42bd6f..724d221107eb 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
@@ -1391,7 +1391,7 @@ void cpu_init(void) | |||
1391 | 1391 | ||
1392 | printk(KERN_INFO "Initializing CPU#%d\n", cpu); | 1392 | printk(KERN_INFO "Initializing CPU#%d\n", cpu); |
1393 | 1393 | ||
1394 | if (cpu_has_vme || cpu_has_tsc || cpu_has_de) | 1394 | if (cpu_feature_enabled(X86_FEATURE_VME) || cpu_has_tsc || cpu_has_de) |
1395 | clear_in_cr4(X86_CR4_VME|X86_CR4_PVI|X86_CR4_TSD|X86_CR4_DE); | 1395 | clear_in_cr4(X86_CR4_VME|X86_CR4_PVI|X86_CR4_TSD|X86_CR4_DE); |
1396 | 1396 | ||
1397 | load_current_idt(); | 1397 | load_current_idt(); |
diff --git a/arch/x86/kernel/cpu/mtrr/main.c b/arch/x86/kernel/cpu/mtrr/main.c index f961de9964c7..ea5f363a1948 100644 --- a/arch/x86/kernel/cpu/mtrr/main.c +++ b/arch/x86/kernel/cpu/mtrr/main.c | |||
@@ -707,7 +707,7 @@ void __init mtrr_bp_init(void) | |||
707 | } else { | 707 | } else { |
708 | switch (boot_cpu_data.x86_vendor) { | 708 | switch (boot_cpu_data.x86_vendor) { |
709 | case X86_VENDOR_AMD: | 709 | case X86_VENDOR_AMD: |
710 | if (cpu_has_k6_mtrr) { | 710 | if (cpu_feature_enabled(X86_FEATURE_K6_MTRR)) { |
711 | /* Pre-Athlon (K6) AMD CPU MTRRs */ | 711 | /* Pre-Athlon (K6) AMD CPU MTRRs */ |
712 | mtrr_if = mtrr_ops[X86_VENDOR_AMD]; | 712 | mtrr_if = mtrr_ops[X86_VENDOR_AMD]; |
713 | size_or_mask = SIZE_OR_MASK_BITS(32); | 713 | size_or_mask = SIZE_OR_MASK_BITS(32); |
@@ -715,14 +715,14 @@ void __init mtrr_bp_init(void) | |||
715 | } | 715 | } |
716 | break; | 716 | break; |
717 | case X86_VENDOR_CENTAUR: | 717 | case X86_VENDOR_CENTAUR: |
718 | if (cpu_has_centaur_mcr) { | 718 | if (cpu_feature_enabled(X86_FEATURE_CENTAUR_MCR)) { |
719 | mtrr_if = mtrr_ops[X86_VENDOR_CENTAUR]; | 719 | mtrr_if = mtrr_ops[X86_VENDOR_CENTAUR]; |
720 | size_or_mask = SIZE_OR_MASK_BITS(32); | 720 | size_or_mask = SIZE_OR_MASK_BITS(32); |
721 | size_and_mask = 0; | 721 | size_and_mask = 0; |
722 | } | 722 | } |
723 | break; | 723 | break; |
724 | case X86_VENDOR_CYRIX: | 724 | case X86_VENDOR_CYRIX: |
725 | if (cpu_has_cyrix_arr) { | 725 | if (cpu_feature_enabled(X86_FEATURE_CYRIX_ARR)) { |
726 | mtrr_if = mtrr_ops[X86_VENDOR_CYRIX]; | 726 | mtrr_if = mtrr_ops[X86_VENDOR_CYRIX]; |
727 | size_or_mask = SIZE_OR_MASK_BITS(32); | 727 | size_or_mask = SIZE_OR_MASK_BITS(32); |
728 | size_and_mask = 0; | 728 | size_and_mask = 0; |