diff options
author | Borislav Petkov <bp@suse.de> | 2018-01-27 11:24:34 -0500 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2018-01-27 13:10:45 -0500 |
commit | 64e16720ea0879f8ab4547e3b9758936d483909b (patch) | |
tree | e8f8f39b1bfc79990ae218f451e035724d8e2d87 | |
parent | 1dde7415e99933bb7293d6b2843752cbdb43ec11 (diff) |
x86/speculation: Simplify indirect_branch_prediction_barrier()
Make it all a function which does the WRMSR instead of having a hairy
inline asm.
[dwmw2: export it, fix CONFIG_RETPOLINE issues]
Signed-off-by: Borislav Petkov <bp@suse.de>
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: ak@linux.intel.com
Cc: dave.hansen@intel.com
Cc: karahmed@amazon.de
Cc: arjan@linux.intel.com
Cc: torvalds@linux-foundation.org
Cc: peterz@infradead.org
Cc: bp@alien8.de
Cc: pbonzini@redhat.com
Cc: tim.c.chen@linux.intel.com
Cc: gregkh@linux-foundation.org
Link: https://lkml.kernel.org/r/1517070274-12128-4-git-send-email-dwmw@amazon.co.uk
-rw-r--r-- | arch/x86/include/asm/nospec-branch.h | 13 | ||||
-rw-r--r-- | arch/x86/include/asm/processor.h | 3 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/bugs.c | 6 |
3 files changed, 13 insertions, 9 deletions
diff --git a/arch/x86/include/asm/nospec-branch.h b/arch/x86/include/asm/nospec-branch.h index df4ececa6ebf..d15d471348b8 100644 --- a/arch/x86/include/asm/nospec-branch.h +++ b/arch/x86/include/asm/nospec-branch.h | |||
@@ -164,15 +164,10 @@ static inline void vmexit_fill_RSB(void) | |||
164 | 164 | ||
165 | static inline void indirect_branch_prediction_barrier(void) | 165 | static inline void indirect_branch_prediction_barrier(void) |
166 | { | 166 | { |
167 | asm volatile(ALTERNATIVE("", | 167 | alternative_input("", |
168 | "movl %[msr], %%ecx\n\t" | 168 | "call __ibp_barrier", |
169 | "movl %[val], %%eax\n\t" | 169 | X86_FEATURE_USE_IBPB, |
170 | "movl $0, %%edx\n\t" | 170 | ASM_NO_INPUT_CLOBBER("eax", "ecx", "edx", "memory")); |
171 | "wrmsr", | ||
172 | X86_FEATURE_USE_IBPB) | ||
173 | : : [msr] "i" (MSR_IA32_PRED_CMD), | ||
174 | [val] "i" (PRED_CMD_IBPB) | ||
175 | : "eax", "ecx", "edx", "memory"); | ||
176 | } | 171 | } |
177 | 172 | ||
178 | #endif /* __ASSEMBLY__ */ | 173 | #endif /* __ASSEMBLY__ */ |
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index 9c18da64daa9..881ca3b1d6d4 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h | |||
@@ -970,4 +970,7 @@ bool xen_set_default_idle(void); | |||
970 | 970 | ||
971 | void stop_this_cpu(void *dummy); | 971 | void stop_this_cpu(void *dummy); |
972 | void df_debug(struct pt_regs *regs, long error_code); | 972 | void df_debug(struct pt_regs *regs, long error_code); |
973 | |||
974 | void __ibp_barrier(void); | ||
975 | |||
973 | #endif /* _ASM_X86_PROCESSOR_H */ | 976 | #endif /* _ASM_X86_PROCESSOR_H */ |
diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c index 32d8e6cdc09e..3bfb2b23d79c 100644 --- a/arch/x86/kernel/cpu/bugs.c +++ b/arch/x86/kernel/cpu/bugs.c | |||
@@ -311,3 +311,9 @@ ssize_t cpu_show_spectre_v2(struct device *dev, | |||
311 | spectre_v2_module_string()); | 311 | spectre_v2_module_string()); |
312 | } | 312 | } |
313 | #endif | 313 | #endif |
314 | |||
315 | void __ibp_barrier(void) | ||
316 | { | ||
317 | __wrmsr(MSR_IA32_PRED_CMD, PRED_CMD_IBPB, 0); | ||
318 | } | ||
319 | EXPORT_SYMBOL_GPL(__ibp_barrier); | ||