140 lines
4.8 KiB
Diff
140 lines
4.8 KiB
Diff
From foo@baz Mon May 21 21:56:07 CEST 2018
|
|
From: Borislav Petkov <bp@suse.de>
|
|
Date: Sat, 12 May 2018 00:14:51 +0200
|
|
Subject: x86/bugs: Unify x86_spec_ctrl_{set_guest,restore_host}
|
|
|
|
From: Borislav Petkov <bp@suse.de>
|
|
|
|
commit cc69b34989210f067b2c51d5539b5f96ebcc3a01 upstream
|
|
|
|
Function bodies are very similar and are going to grow more almost
|
|
identical code. Add a bool arg to determine whether SPEC_CTRL is being set
|
|
for the guest or restored to the host.
|
|
|
|
No functional changes.
|
|
|
|
Signed-off-by: Borislav Petkov <bp@suse.de>
|
|
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|
Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|
---
|
|
arch/x86/include/asm/spec-ctrl.h | 33 ++++++++++++++++++---
|
|
arch/x86/kernel/cpu/bugs.c | 60 +++++++++------------------------------
|
|
2 files changed, 44 insertions(+), 49 deletions(-)
|
|
|
|
--- a/arch/x86/include/asm/spec-ctrl.h
|
|
+++ b/arch/x86/include/asm/spec-ctrl.h
|
|
@@ -13,10 +13,35 @@
|
|
* Takes the guest view of SPEC_CTRL MSR as a parameter and also
|
|
* the guest's version of VIRT_SPEC_CTRL, if emulated.
|
|
*/
|
|
-extern void x86_spec_ctrl_set_guest(u64 guest_spec_ctrl,
|
|
- u64 guest_virt_spec_ctrl);
|
|
-extern void x86_spec_ctrl_restore_host(u64 guest_spec_ctrl,
|
|
- u64 guest_virt_spec_ctrl);
|
|
+extern void x86_virt_spec_ctrl(u64 guest_spec_ctrl, u64 guest_virt_spec_ctrl, bool guest);
|
|
+
|
|
+/**
|
|
+ * x86_spec_ctrl_set_guest - Set speculation control registers for the guest
|
|
+ * @guest_spec_ctrl: The guest content of MSR_SPEC_CTRL
|
|
+ * @guest_virt_spec_ctrl: The guest controlled bits of MSR_VIRT_SPEC_CTRL
|
|
+ * (may get translated to MSR_AMD64_LS_CFG bits)
|
|
+ *
|
|
+ * Avoids writing to the MSR if the content/bits are the same
|
|
+ */
|
|
+static inline
|
|
+void x86_spec_ctrl_set_guest(u64 guest_spec_ctrl, u64 guest_virt_spec_ctrl)
|
|
+{
|
|
+ x86_virt_spec_ctrl(guest_spec_ctrl, guest_virt_spec_ctrl, true);
|
|
+}
|
|
+
|
|
+/**
|
|
+ * x86_spec_ctrl_restore_host - Restore host speculation control registers
|
|
+ * @guest_spec_ctrl: The guest content of MSR_SPEC_CTRL
|
|
+ * @guest_virt_spec_ctrl: The guest controlled bits of MSR_VIRT_SPEC_CTRL
|
|
+ * (may get translated to MSR_AMD64_LS_CFG bits)
|
|
+ *
|
|
+ * Avoids writing to the MSR if the content/bits are the same
|
|
+ */
|
|
+static inline
|
|
+void x86_spec_ctrl_restore_host(u64 guest_spec_ctrl, u64 guest_virt_spec_ctrl)
|
|
+{
|
|
+ x86_virt_spec_ctrl(guest_spec_ctrl, guest_virt_spec_ctrl, false);
|
|
+}
|
|
|
|
/* AMD specific Speculative Store Bypass MSR data */
|
|
extern u64 x86_amd_ls_cfg_base;
|
|
--- a/arch/x86/kernel/cpu/bugs.c
|
|
+++ b/arch/x86/kernel/cpu/bugs.c
|
|
@@ -151,55 +151,25 @@ u64 x86_spec_ctrl_get_default(void)
|
|
}
|
|
EXPORT_SYMBOL_GPL(x86_spec_ctrl_get_default);
|
|
|
|
-/**
|
|
- * x86_spec_ctrl_set_guest - Set speculation control registers for the guest
|
|
- * @guest_spec_ctrl: The guest content of MSR_SPEC_CTRL
|
|
- * @guest_virt_spec_ctrl: The guest controlled bits of MSR_VIRT_SPEC_CTRL
|
|
- * (may get translated to MSR_AMD64_LS_CFG bits)
|
|
- *
|
|
- * Avoids writing to the MSR if the content/bits are the same
|
|
- */
|
|
-void x86_spec_ctrl_set_guest(u64 guest_spec_ctrl, u64 guest_virt_spec_ctrl)
|
|
+void
|
|
+x86_virt_spec_ctrl(u64 guest_spec_ctrl, u64 guest_virt_spec_ctrl, bool setguest)
|
|
{
|
|
- u64 host = x86_spec_ctrl_base;
|
|
+ struct thread_info *ti = current_thread_info();
|
|
+ u64 msr, host = x86_spec_ctrl_base;
|
|
|
|
/* Is MSR_SPEC_CTRL implemented ? */
|
|
- if (!static_cpu_has(X86_FEATURE_MSR_SPEC_CTRL))
|
|
- return;
|
|
-
|
|
- /* SSBD controlled in MSR_SPEC_CTRL */
|
|
- if (static_cpu_has(X86_FEATURE_SPEC_CTRL_SSBD))
|
|
- host |= ssbd_tif_to_spec_ctrl(current_thread_info()->flags);
|
|
-
|
|
- if (host != guest_spec_ctrl)
|
|
- wrmsrl(MSR_IA32_SPEC_CTRL, guest_spec_ctrl);
|
|
-}
|
|
-EXPORT_SYMBOL_GPL(x86_spec_ctrl_set_guest);
|
|
-
|
|
-/**
|
|
- * x86_spec_ctrl_restore_host - Restore host speculation control registers
|
|
- * @guest_spec_ctrl: The guest content of MSR_SPEC_CTRL
|
|
- * @guest_virt_spec_ctrl: The guest controlled bits of MSR_VIRT_SPEC_CTRL
|
|
- * (may get translated to MSR_AMD64_LS_CFG bits)
|
|
- *
|
|
- * Avoids writing to the MSR if the content/bits are the same
|
|
- */
|
|
-void x86_spec_ctrl_restore_host(u64 guest_spec_ctrl, u64 guest_virt_spec_ctrl)
|
|
-{
|
|
- u64 host = x86_spec_ctrl_base;
|
|
-
|
|
- /* Is MSR_SPEC_CTRL implemented ? */
|
|
- if (!static_cpu_has(X86_FEATURE_MSR_SPEC_CTRL))
|
|
- return;
|
|
-
|
|
- /* SSBD controlled in MSR_SPEC_CTRL */
|
|
- if (static_cpu_has(X86_FEATURE_SPEC_CTRL_SSBD))
|
|
- host |= ssbd_tif_to_spec_ctrl(current_thread_info()->flags);
|
|
-
|
|
- if (host != guest_spec_ctrl)
|
|
- wrmsrl(MSR_IA32_SPEC_CTRL, host);
|
|
+ if (static_cpu_has(X86_FEATURE_MSR_SPEC_CTRL)) {
|
|
+ /* SSBD controlled in MSR_SPEC_CTRL */
|
|
+ if (static_cpu_has(X86_FEATURE_SPEC_CTRL_SSBD))
|
|
+ host |= ssbd_tif_to_spec_ctrl(ti->flags);
|
|
+
|
|
+ if (host != guest_spec_ctrl) {
|
|
+ msr = setguest ? guest_spec_ctrl : host;
|
|
+ wrmsrl(MSR_IA32_SPEC_CTRL, msr);
|
|
+ }
|
|
+ }
|
|
}
|
|
-EXPORT_SYMBOL_GPL(x86_spec_ctrl_restore_host);
|
|
+EXPORT_SYMBOL_GPL(x86_virt_spec_ctrl);
|
|
|
|
static void x86_amd_ssb_disable(void)
|
|
{
|