diff options
-rw-r--r-- | arch/x86/kernel/cpu/common.c | 6 | ||||
-rw-r--r-- | arch/x86/kernel/setup_64.c | 6 | ||||
-rw-r--r-- | include/asm-x86/cpufeature.h | 4 | ||||
-rw-r--r-- | include/asm-x86/processor.h | 1 |
4 files changed, 17 insertions, 0 deletions
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 4bd326d0322c..f0f29ddf33a2 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
@@ -57,6 +57,8 @@ DEFINE_PER_CPU(struct gdt_page, gdt_page) = { .gdt = { | |||
57 | } }; | 57 | } }; |
58 | EXPORT_PER_CPU_SYMBOL_GPL(gdt_page); | 58 | EXPORT_PER_CPU_SYMBOL_GPL(gdt_page); |
59 | 59 | ||
60 | __u32 cleared_cpu_caps[NCAPINTS] __cpuinitdata; | ||
61 | |||
60 | static int cachesize_override __cpuinitdata = -1; | 62 | static int cachesize_override __cpuinitdata = -1; |
61 | static int disable_x86_fxsr __cpuinitdata; | 63 | static int disable_x86_fxsr __cpuinitdata; |
62 | static int disable_x86_serial_nr __cpuinitdata = 1; | 64 | static int disable_x86_serial_nr __cpuinitdata = 1; |
@@ -497,6 +499,10 @@ void __cpuinit identify_cpu(struct cpuinfo_x86 *c) | |||
497 | boot_cpu_data.x86_capability[i] &= c->x86_capability[i]; | 499 | boot_cpu_data.x86_capability[i] &= c->x86_capability[i]; |
498 | } | 500 | } |
499 | 501 | ||
502 | /* Clear all flags overriden by options */ | ||
503 | for (i = 0; i < NCAPINTS; i++) | ||
504 | c->x86_capability[i] ^= cleared_cpu_caps[i]; | ||
505 | |||
500 | /* Init Machine Check Exception if available. */ | 506 | /* Init Machine Check Exception if available. */ |
501 | mcheck_init(c); | 507 | mcheck_init(c); |
502 | 508 | ||
diff --git a/arch/x86/kernel/setup_64.c b/arch/x86/kernel/setup_64.c index 7edb43f0b279..df159520bbd2 100644 --- a/arch/x86/kernel/setup_64.c +++ b/arch/x86/kernel/setup_64.c | |||
@@ -80,6 +80,8 @@ | |||
80 | struct cpuinfo_x86 boot_cpu_data __read_mostly; | 80 | struct cpuinfo_x86 boot_cpu_data __read_mostly; |
81 | EXPORT_SYMBOL(boot_cpu_data); | 81 | EXPORT_SYMBOL(boot_cpu_data); |
82 | 82 | ||
83 | __u32 cleared_cpu_caps[NCAPINTS] __cpuinitdata; | ||
84 | |||
83 | unsigned long mmu_cr4_features; | 85 | unsigned long mmu_cr4_features; |
84 | 86 | ||
85 | /* Boot loader ID as an integer, for the benefit of proc_dointvec */ | 87 | /* Boot loader ID as an integer, for the benefit of proc_dointvec */ |
@@ -1013,6 +1015,10 @@ void __cpuinit identify_cpu(struct cpuinfo_x86 *c) | |||
1013 | boot_cpu_data.x86_capability[i] &= c->x86_capability[i]; | 1015 | boot_cpu_data.x86_capability[i] &= c->x86_capability[i]; |
1014 | } | 1016 | } |
1015 | 1017 | ||
1018 | /* Clear all flags overriden by options */ | ||
1019 | for (i = 0; i < NCAPINTS; i++) | ||
1020 | c->x86_capability[i] ^= cleared_cpu_caps[i]; | ||
1021 | |||
1016 | #ifdef CONFIG_X86_MCE | 1022 | #ifdef CONFIG_X86_MCE |
1017 | mcheck_init(c); | 1023 | mcheck_init(c); |
1018 | #endif | 1024 | #endif |
diff --git a/include/asm-x86/cpufeature.h b/include/asm-x86/cpufeature.h index 29727bf0e177..b8f53f869e1f 100644 --- a/include/asm-x86/cpufeature.h +++ b/include/asm-x86/cpufeature.h | |||
@@ -131,6 +131,10 @@ | |||
131 | 131 | ||
132 | #define set_cpu_cap(c, bit) set_bit(bit, (unsigned long *)((c)->x86_capability)) | 132 | #define set_cpu_cap(c, bit) set_bit(bit, (unsigned long *)((c)->x86_capability)) |
133 | #define clear_cpu_cap(c, bit) clear_bit(bit, (unsigned long *)((c)->x86_capability)) | 133 | #define clear_cpu_cap(c, bit) clear_bit(bit, (unsigned long *)((c)->x86_capability)) |
134 | #define setup_clear_cpu_cap(bit) do { \ | ||
135 | clear_cpu_cap(&boot_cpu_data, bit); \ | ||
136 | set_bit(bit, cleared_cpu_caps); \ | ||
137 | } while (0) | ||
134 | 138 | ||
135 | #define cpu_has_fpu boot_cpu_has(X86_FEATURE_FPU) | 139 | #define cpu_has_fpu boot_cpu_has(X86_FEATURE_FPU) |
136 | #define cpu_has_vme boot_cpu_has(X86_FEATURE_VME) | 140 | #define cpu_has_vme boot_cpu_has(X86_FEATURE_VME) |
diff --git a/include/asm-x86/processor.h b/include/asm-x86/processor.h index 81ecfed83e47..ab4d0c2a3f8f 100644 --- a/include/asm-x86/processor.h +++ b/include/asm-x86/processor.h | |||
@@ -118,6 +118,7 @@ struct cpuinfo_x86 { | |||
118 | extern struct cpuinfo_x86 boot_cpu_data; | 118 | extern struct cpuinfo_x86 boot_cpu_data; |
119 | extern struct cpuinfo_x86 new_cpu_data; | 119 | extern struct cpuinfo_x86 new_cpu_data; |
120 | extern struct tss_struct doublefault_tss; | 120 | extern struct tss_struct doublefault_tss; |
121 | extern __u32 cleared_cpu_caps[NCAPINTS]; | ||
121 | 122 | ||
122 | #ifdef CONFIG_SMP | 123 | #ifdef CONFIG_SMP |
123 | DECLARE_PER_CPU(struct cpuinfo_x86, cpu_info); | 124 | DECLARE_PER_CPU(struct cpuinfo_x86, cpu_info); |