From: Tim Chen <[email protected]>

Create macros to control Indirect Branch Speculation.

Name them so they reflect what they are actually doing. The Intel supplied
names are suggesting that they 'enable' something while in reality they
disable.

[ tglx: Changed macro names and rewrote changelog ]

Signed-off-by: Tim Chen <[email protected]>
Signed-off-by: Thomas Gleixner <[email protected]>
Cc: Andrea Arcangeli <[email protected]>
Cc: Andi Kleen <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Greg KH <[email protected]>
Cc: Dave Hansen <[email protected]>
Cc: Andy Lutomirski <[email protected]>
Cc: Paolo Bonzini <[email protected]>
Cc: Dan Williams <[email protected]>
Cc: Arjan Van De Ven <[email protected]>
Cc: Linus Torvalds <[email protected]>
Cc: David Woodhouse <[email protected]>
Cc: Ashok Raj <[email protected]>
---
 arch/x86/entry/calling.h |   73 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 73 insertions(+)

--- a/arch/x86/entry/calling.h
+++ b/arch/x86/entry/calling.h
@@ -6,6 +6,8 @@
 #include <asm/percpu.h>
 #include <asm/asm-offsets.h>
 #include <asm/processor-flags.h>
+#include <asm/msr-index.h>
+#include <asm/cpufeatures.h>
 
 /*
 
@@ -349,3 +351,74 @@ For 32-bit we have the following convent
 .Lafter_call_\@:
 #endif
 .endm
+
+/*
+ * IBRS related macros
+ */
+.macro PUSH_MSR_REGS
+       pushq   %rax
+       pushq   %rcx
+       pushq   %rdx
+.endm
+
+.macro POP_MSR_REGS
+       popq    %rdx
+       popq    %rcx
+       popq    %rax
+.endm
+
+.macro WRMSR_ASM msr_nr:req edx_val:req eax_val:req
+       movl    \msr_nr, %ecx
+       movl    \edx_val, %edx
+       movl    \eax_val, %eax
+       wrmsr
+.endm
+
+.macro STOP_IB_SPEC
+       ALTERNATIVE "jmp .Lskip_\@", "", X86_FEATURE_IBRS
+       PUSH_MSR_REGS
+       WRMSR_ASM $MSR_IA32_SPEC_CTRL, $0, $SPEC_CTRL_ENABLE_IBRS
+       POP_MSR_REGS
+.Lskip_\@:
+.endm
+
+.macro RESTART_IB_SPEC
+       ALTERNATIVE "jmp .Lskip_\@", "", X86_FEATURE_IBRS
+       PUSH_MSR_REGS
+       WRMSR_ASM $MSR_IA32_SPEC_CTRL, $0, $SPEC_CTRL_DISABLE_IBRS
+       POP_MSR_REGS
+.Lskip_\@:
+.endm
+
+.macro STOP_IB_SPEC_CLOBBER
+       ALTERNATIVE "jmp .Lskip_\@", "", X86_FEATURE_IBRS
+       WRMSR_ASM $MSR_IA32_SPEC_CTRL, $0, $SPEC_CTRL_ENABLE_IBRS
+.Lskip_\@:
+.endm
+
+.macro RESTART_IB_SPEC_CLOBBER
+       ALTERNATIVE "jmp .Lskip_\@", "", X86_FEATURE_IBRS
+       WRMSR_ASM $MSR_IA32_SPEC_CTRL, $0, $SPEC_CTRL_DISABLE_IBRS
+.Lskip_\@:
+.endm
+
+.macro STOP_IB_SPEC_SAVE_AND_CLOBBER save_reg:req
+       ALTERNATIVE "jmp .Lskip_\@", "", X86_FEATURE_IBRS
+       movl    $MSR_IA32_SPEC_CTRL, %ecx
+       rdmsr
+       movl    %eax, \save_reg
+       movl    $0, %edx
+       movl    $SPEC_CTRL_ENABLE_IBRS, %eax
+       wrmsr
+.Lskip_\@:
+.endm
+
+.macro RESTORE_IB_SPEC_CLOBBER save_reg:req
+       ALTERNATIVE "jmp .Lskip_\@", "", X86_FEATURE_IBRS
+       /* Set IBRS to the value saved in the save_reg */
+       movl    $MSR_IA32_SPEC_CTRL, %ecx
+       movl    $0, %edx
+       movl    \save_reg, %eax
+       wrmsr
+.Lskip_\@:
+.endm


Reply via email to