From: Ashok Raj <ashok....@intel.com>

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 <asit.k.mall...@intel.com>
Cc: Dave Hansen <dave.han...@intel.com>
Cc: Arjan Van De Ven <arjan.van.de....@intel.com>
Cc: Tim Chen <tim.c.c...@linux.intel.com>
Cc: Linus Torvalds <torva...@linux-foundation.org>
Cc: Andrea Arcangeli <aarca...@redhat.com>
Cc: Andi Kleen <a...@linux.intel.com>
Cc: Thomas Gleixner <t...@linutronix.de>
Cc: Dan Williams <dan.j.willi...@intel.com>
Cc: Jun Nakajima <jun.nakaj...@intel.com>
Cc: Andy Lutomirski <l...@kernel.org>
Cc: Greg KH <gre...@linuxfoundation.org>
Cc: David Woodhouse <d...@amazon.co.uk>
Cc: Paolo Bonzini <pbonz...@redhat.com>
Signed-off-by: Ashok Raj <ashok....@intel.com>
Signed-off-by: Peter Zijlstra (Intel) <pet...@infradead.org>
---
 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)


Reply via email to