From: Thomas Gleixner <tglx@linutronix.de>
To: speck@linutronix.de
Subject: [patch 2/8] MDS basics 2
Date: Tue, 19 Feb 2019 13:44:08 +0100 [thread overview]
Message-ID: <20190219125345.964363293@linutronix.de> (raw)
In-Reply-To: 20190219124406.449727187@linutronix.de
Subject: [patch 2/8] x86/speculation/mds: Add mds_clear_cpu_buffer()
From: Thomas Gleixner <tglx@linutronix.de>
The Microarchitectural Data Sampling (MDS) vulernabilities are mitigated by
clearing the affected CPU buffers. The mechanism for clearing the buffers
uses the unused and obsolete VERW instruction in combination with a
microcode update which triggers a CPU buffer clear when VERW is executed.
Provide a inline function with the assembly magic. The argument of the VERW
instruction must be a memory operand.
The function takes a pointer to a static key, so different call sites can
depend on different static keys for controlling the invocation. This avoids
the conditionals at the call sites and allows for fine grained control,
e.g. the SMT only CPU buffer clearing on idle entry can be enabled
independent of the exit to user space clear.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
arch/x86/include/asm/nospec-branch.h | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
--- a/arch/x86/include/asm/nospec-branch.h
+++ b/arch/x86/include/asm/nospec-branch.h
@@ -314,6 +314,25 @@ do { \
preempt_enable(); \
} while (0)
+#include <asm/segment.h>
+
+/**
+ * mds_clear_cpu_buffers - Mitigation for MDS vulnerability
+ *
+ * This uses the otherwise unused and obsolete VERW instruction in
+ * combination with microcode which triggers a CPU buffer flush when the
+ * instruction is executed.
+ */
+static inline void mds_clear_cpu_buffers(struct static_key_false *key)
+{
+ if (static_branch_likely(key)) {
+ static const u16 ds = __KERNEL_DS;
+
+ /* Has to be memory form, don't modify to use a register */
+ asm volatile("verw %[ds]" : : "i" (0), [ds] "m" (ds));
+ }
+}
+
DECLARE_STATIC_KEY_FALSE(switch_to_cond_stibp);
DECLARE_STATIC_KEY_FALSE(switch_mm_cond_ibpb);
DECLARE_STATIC_KEY_FALSE(switch_mm_always_ibpb);
next prev parent reply other threads:[~2019-02-19 13:38 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-02-19 12:44 [patch 0/8] MDS basics 0 Thomas Gleixner
2019-02-19 12:44 ` [patch 1/8] MDS basics 1 Thomas Gleixner
2019-02-19 14:00 ` [MODERATED] " Borislav Petkov
2019-02-19 12:44 ` Thomas Gleixner [this message]
2019-02-19 12:44 ` [patch 3/8] MDS basics 3 Thomas Gleixner
2019-02-19 16:04 ` [MODERATED] " Andi Kleen
2019-02-19 21:44 ` Thomas Gleixner
2019-02-19 22:13 ` Thomas Gleixner
2019-02-20 16:59 ` [MODERATED] " Andi Kleen
2019-02-20 21:28 ` Thomas Gleixner
2019-02-19 12:44 ` [patch 4/8] MDS basics 4 Thomas Gleixner
2019-02-19 13:54 ` [MODERATED] " Andrew Cooper
2019-02-19 14:02 ` Thomas Gleixner
2019-02-19 14:07 ` Thomas Gleixner
2019-02-19 16:09 ` [MODERATED] " Andi Kleen
2019-02-19 16:17 ` Peter Zijlstra
2019-02-19 17:16 ` Thomas Gleixner
2019-02-19 16:08 ` [MODERATED] " Andi Kleen
2019-02-19 16:23 ` Andrew Cooper
2019-02-19 16:07 ` Andi Kleen
2019-02-19 18:29 ` Thomas Gleixner
2019-02-19 12:44 ` [patch 5/8] MDS basics 5 Thomas Gleixner
2019-02-19 15:07 ` Thomas Gleixner
2019-02-19 16:13 ` [MODERATED] " Andi Kleen
2019-02-19 17:37 ` Thomas Gleixner
2019-02-20 0:05 ` Thomas Gleixner
2019-02-19 16:03 ` [MODERATED] " Andi Kleen
2019-02-19 17:40 ` Thomas Gleixner
2019-02-19 17:44 ` [MODERATED] " Andrew Cooper
2019-02-19 17:52 ` Thomas Gleixner
2019-02-19 12:44 ` [patch 6/8] MDS basics 6 Thomas Gleixner
2019-02-19 12:44 ` [patch 7/8] MDS basics 7 Thomas Gleixner
2019-02-19 12:44 ` [patch 8/8] MDS basics 8 Thomas Gleixner
2019-02-19 14:17 ` [MODERATED] " Greg KH
2019-02-19 14:22 ` Thomas Gleixner
2019-02-19 17:27 ` [MODERATED] " Andrew Cooper
2019-02-19 14:03 ` [MODERATED] Re: [patch 0/8] MDS basics 0 Andrew Cooper
2019-02-19 14:09 ` Thomas Gleixner
2019-02-19 14:10 ` [MODERATED] " Tyler Hicks
2019-02-19 15:56 ` Andi Kleen
2019-02-19 17:42 ` Thomas Gleixner
2019-02-21 16:14 ` [MODERATED] Encrypted Message Jon Masters
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190219125345.964363293@linutronix.de \
--to=tglx@linutronix.de \
--cc=speck@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.