diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2017-12-04 09:07:32 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2017-12-17 08:27:53 -0500 |
commit | 6cbd2171e89b13377261d15e64384df60ecb530e (patch) | |
tree | f25de1a75cd82b75fbaa6ae3ece6d241bee8369b | |
parent | 79cc74155218316b9a5d28577c7077b2adba8e58 (diff) |
x86/cpufeatures: Make CPU bugs sticky
There is currently no way to force CPU bug bits like CPU feature bits. That
makes it impossible to set a bug bit once at boot and have it stick for all
upcoming CPUs.
Extend the force set/clear arrays to handle bug bits as well.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Borislav Petkov <bp@suse.de>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Borislav Petkov <bpetkov@suse.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Dave Hansen <dave.hansen@intel.com>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: David Laight <David.Laight@aculab.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: Eduardo Valentin <eduval@amazon.com>
Cc: Greg KH <gregkh@linuxfoundation.org>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Juergen Gross <jgross@suse.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Rik van Riel <riel@redhat.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: aliguori@amazon.com
Cc: daniel.gruss@iaik.tugraz.at
Cc: hughd@google.com
Cc: keescook@google.com
Link: https://lkml.kernel.org/r/20171204150606.992156574@linutronix.de
Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r-- | arch/x86/include/asm/cpufeature.h | 2 | ||||
-rw-r--r-- | arch/x86/include/asm/processor.h | 4 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/common.c | 6 |
3 files changed, 7 insertions, 5 deletions
diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h index bf6a76202a77..ea9a7dde62e5 100644 --- a/arch/x86/include/asm/cpufeature.h +++ b/arch/x86/include/asm/cpufeature.h | |||
@@ -135,6 +135,8 @@ extern void clear_cpu_cap(struct cpuinfo_x86 *c, unsigned int bit); | |||
135 | set_bit(bit, (unsigned long *)cpu_caps_set); \ | 135 | set_bit(bit, (unsigned long *)cpu_caps_set); \ |
136 | } while (0) | 136 | } while (0) |
137 | 137 | ||
138 | #define setup_force_cpu_bug(bit) setup_force_cpu_cap(bit) | ||
139 | |||
138 | #if defined(CC_HAVE_ASM_GOTO) && defined(CONFIG_X86_FAST_FEATURE_TESTS) | 140 | #if defined(CC_HAVE_ASM_GOTO) && defined(CONFIG_X86_FAST_FEATURE_TESTS) |
139 | /* | 141 | /* |
140 | * Static testing of CPU features. Used the same as boot_cpu_has(). | 142 | * Static testing of CPU features. Used the same as boot_cpu_has(). |
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index e8991d7f7034..da943411d3d8 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h | |||
@@ -163,8 +163,8 @@ extern struct cpuinfo_x86 boot_cpu_data; | |||
163 | extern struct cpuinfo_x86 new_cpu_data; | 163 | extern struct cpuinfo_x86 new_cpu_data; |
164 | 164 | ||
165 | extern struct x86_hw_tss doublefault_tss; | 165 | extern struct x86_hw_tss doublefault_tss; |
166 | extern __u32 cpu_caps_cleared[NCAPINTS]; | 166 | extern __u32 cpu_caps_cleared[NCAPINTS + NBUGINTS]; |
167 | extern __u32 cpu_caps_set[NCAPINTS]; | 167 | extern __u32 cpu_caps_set[NCAPINTS + NBUGINTS]; |
168 | 168 | ||
169 | #ifdef CONFIG_SMP | 169 | #ifdef CONFIG_SMP |
170 | DECLARE_PER_CPU_READ_MOSTLY(struct cpuinfo_x86, cpu_info); | 170 | DECLARE_PER_CPU_READ_MOSTLY(struct cpuinfo_x86, cpu_info); |
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index c2eada1056de..034900623adf 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
@@ -452,8 +452,8 @@ static const char *table_lookup_model(struct cpuinfo_x86 *c) | |||
452 | return NULL; /* Not found */ | 452 | return NULL; /* Not found */ |
453 | } | 453 | } |
454 | 454 | ||
455 | __u32 cpu_caps_cleared[NCAPINTS]; | 455 | __u32 cpu_caps_cleared[NCAPINTS + NBUGINTS]; |
456 | __u32 cpu_caps_set[NCAPINTS]; | 456 | __u32 cpu_caps_set[NCAPINTS + NBUGINTS]; |
457 | 457 | ||
458 | void load_percpu_segment(int cpu) | 458 | void load_percpu_segment(int cpu) |
459 | { | 459 | { |
@@ -812,7 +812,7 @@ static void apply_forced_caps(struct cpuinfo_x86 *c) | |||
812 | { | 812 | { |
813 | int i; | 813 | int i; |
814 | 814 | ||
815 | for (i = 0; i < NCAPINTS; i++) { | 815 | for (i = 0; i < NCAPINTS + NBUGINTS; i++) { |
816 | c->x86_capability[i] &= ~cpu_caps_cleared[i]; | 816 | c->x86_capability[i] &= ~cpu_caps_cleared[i]; |
817 | c->x86_capability[i] |= cpu_caps_set[i]; | 817 | c->x86_capability[i] |= cpu_caps_set[i]; |
818 | } | 818 | } |