From: Ashok Raj <[email protected]>
Add some helper macros to save/restore MSR_IA32_SPEC_CTRL.
stop_indirect_branch_speculation_and_save() - saves the current
state and enables IBRS.
restore_indirect_branch_speculation() - restores the previously
saved IBRS state.
[peterz: renaming and folding of logic from the kvm patches]
Cc: Asit Mallick <[email protected]>
Cc: Dave Hansen <[email protected]>
Cc: Arjan Van De Ven <[email protected]>
Cc: Tim Chen <[email protected]>
Cc: Linus Torvalds <[email protected]>
Cc: Andrea Arcangeli <[email protected]>
Cc: Andi Kleen <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: Dan Williams <[email protected]>
Cc: Jun Nakajima <[email protected]>
Cc: Andy Lutomirski <[email protected]>
Cc: Greg KH <[email protected]>
Cc: David Woodhouse <[email protected]>
Cc: Paolo Bonzini <[email protected]>
Signed-off-by: Ashok Raj <[email protected]>
Signed-off-by: Peter Zijlstra (Intel) <[email protected]>
---
arch/x86/include/asm/nospec-branch.h | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
--- a/arch/x86/include/asm/nospec-branch.h
+++ b/arch/x86/include/asm/nospec-branch.h
@@ -232,6 +232,24 @@ static inline void restart_indirect_bran
native_wrmsrl(MSR_IA32_SPEC_CTRL, SPEC_CTRL_DISABLE_IBRS);
}
+static inline u64 stop_indirect_branch_speculation_and_save(void)
+{
+ u64 val = 0;
+
+ if (static_cpu_has(X86_FEATURE_IBRS)) {
+ val = native_rdmsrl(MSR_IA32_SPEC_CTRL);
+ native_wrmsrl(MSR_IA32_SPEC_CTRL, SPEC_CTRL_ENABLE_IBRS);
+ }
+
+ return val;
+}
+
+static inline void restore_indirect_branch_speculation(u64 val)
+{
+ if (static_cpu_has(X86_FEATURE_IBRS))
+ native_wrmsrl(MSR_IA32_SPEC_CTRL, val);
+}
+
void specctrl_init_ibpb(void);
static inline void indirect_branch_prediction_barrier(void)