diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.9.21/0075-x86-retpoline-Fill-return-stack-buffer-on-vmexit.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.9.21/0075-x86-retpoline-Fill-return-stack-buffer-on-vmexit.patch | 195 |
1 files changed, 0 insertions, 195 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.9.21/0075-x86-retpoline-Fill-return-stack-buffer-on-vmexit.patch b/common/recipes-kernel/linux/linux-yocto-4.9.21/0075-x86-retpoline-Fill-return-stack-buffer-on-vmexit.patch deleted file mode 100644 index 40c846fc..00000000 --- a/common/recipes-kernel/linux/linux-yocto-4.9.21/0075-x86-retpoline-Fill-return-stack-buffer-on-vmexit.patch +++ /dev/null @@ -1,195 +0,0 @@ -From 718349fea3d22ecec829ef448f45f6eab4e5e2fa Mon Sep 17 00:00:00 2001 -From: David Woodhouse <dwmw@amazon.co.uk> -Date: Fri, 12 Jan 2018 11:11:27 +0000 -Subject: [PATCH 075/103] x86/retpoline: Fill return stack buffer on vmexit - -commit 117cc7a908c83697b0b737d15ae1eb5943afe35b upstream. - -In accordance with the Intel and AMD documentation, we need to overwrite -all entries in the RSB on exiting a guest, to prevent malicious branch -target predictions from affecting the host kernel. This is needed both -for retpoline and for IBRS. - -[ak: numbers again for the RSB stuffing labels] - -Signed-off-by: David Woodhouse <dwmw@amazon.co.uk> -Signed-off-by: Thomas Gleixner <tglx@linutronix.de> -Tested-by: Peter Zijlstra (Intel) <peterz@infradead.org> -Cc: gnomes@lxorguk.ukuu.org.uk -Cc: Rik van Riel <riel@redhat.com> -Cc: Andi Kleen <ak@linux.intel.com> -Cc: Josh Poimboeuf <jpoimboe@redhat.com> -Cc: thomas.lendacky@amd.com -Cc: Linus Torvalds <torvalds@linux-foundation.org> -Cc: Jiri Kosina <jikos@kernel.org> -Cc: Andy Lutomirski <luto@amacapital.net> -Cc: Dave Hansen <dave.hansen@intel.com> -Cc: Kees Cook <keescook@google.com> -Cc: Tim Chen <tim.c.chen@linux.intel.com> -Cc: Greg Kroah-Hartman <gregkh@linux-foundation.org> -Cc: Paul Turner <pjt@google.com> -Link: https://lkml.kernel.org/r/1515755487-8524-1-git-send-email-dwmw@amazon.co.uk -Signed-off-by: David Woodhouse <dwmw@amazon.co.uk> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> ---- - arch/x86/include/asm/nospec-branch.h | 78 +++++++++++++++++++++++++++++++++++- - arch/x86/kvm/svm.c | 4 ++ - arch/x86/kvm/vmx.c | 4 ++ - 3 files changed, 85 insertions(+), 1 deletion(-) - -diff --git a/arch/x86/include/asm/nospec-branch.h b/arch/x86/include/asm/nospec-branch.h -index ea034fa..402a11c 100644 ---- a/arch/x86/include/asm/nospec-branch.h -+++ b/arch/x86/include/asm/nospec-branch.h -@@ -7,6 +7,48 @@ - #include <asm/alternative-asm.h> - #include <asm/cpufeatures.h> - -+/* -+ * Fill the CPU return stack buffer. -+ * -+ * Each entry in the RSB, if used for a speculative 'ret', contains an -+ * infinite 'pause; jmp' loop to capture speculative execution. -+ * -+ * This is required in various cases for retpoline and IBRS-based -+ * mitigations for the Spectre variant 2 vulnerability. Sometimes to -+ * eliminate potentially bogus entries from the RSB, and sometimes -+ * purely to ensure that it doesn't get empty, which on some CPUs would -+ * allow predictions from other (unwanted!) sources to be used. -+ * -+ * We define a CPP macro such that it can be used from both .S files and -+ * inline assembly. It's possible to do a .macro and then include that -+ * from C via asm(".include <asm/nospec-branch.h>") but let's not go there. -+ */ -+ -+#define RSB_CLEAR_LOOPS 32 /* To forcibly overwrite all entries */ -+#define RSB_FILL_LOOPS 16 /* To avoid underflow */ -+ -+/* -+ * Google experimented with loop-unrolling and this turned out to be -+ * the optimal version — two calls, each with their own speculation -+ * trap should their return address end up getting used, in a loop. -+ */ -+#define __FILL_RETURN_BUFFER(reg, nr, sp) \ -+ mov $(nr/2), reg; \ -+771: \ -+ call 772f; \ -+773: /* speculation trap */ \ -+ pause; \ -+ jmp 773b; \ -+772: \ -+ call 774f; \ -+775: /* speculation trap */ \ -+ pause; \ -+ jmp 775b; \ -+774: \ -+ dec reg; \ -+ jnz 771b; \ -+ add $(BITS_PER_LONG/8) * nr, sp; -+ - #ifdef __ASSEMBLY__ - - /* -@@ -76,6 +118,20 @@ - #endif - .endm - -+ /* -+ * A simpler FILL_RETURN_BUFFER macro. Don't make people use the CPP -+ * monstrosity above, manually. -+ */ -+.macro FILL_RETURN_BUFFER reg:req nr:req ftr:req -+#ifdef CONFIG_RETPOLINE -+ ANNOTATE_NOSPEC_ALTERNATIVE -+ ALTERNATIVE "jmp .Lskip_rsb_\@", \ -+ __stringify(__FILL_RETURN_BUFFER(\reg,\nr,%_ASM_SP)) \ -+ \ftr -+.Lskip_rsb_\@: -+#endif -+.endm -+ - #else /* __ASSEMBLY__ */ - - #define ANNOTATE_NOSPEC_ALTERNATIVE \ -@@ -119,7 +175,7 @@ - X86_FEATURE_RETPOLINE) - - # define THUNK_TARGET(addr) [thunk_target] "rm" (addr) --#else /* No retpoline */ -+#else /* No retpoline for C / inline asm */ - # define CALL_NOSPEC "call *%[thunk_target]\n" - # define THUNK_TARGET(addr) [thunk_target] "rm" (addr) - #endif -@@ -134,5 +190,25 @@ enum spectre_v2_mitigation { - SPECTRE_V2_IBRS, - }; - -+/* -+ * On VMEXIT we must ensure that no RSB predictions learned in the guest -+ * can be followed in the host, by overwriting the RSB completely. Both -+ * retpoline and IBRS mitigations for Spectre v2 need this; only on future -+ * CPUs with IBRS_ATT *might* it be avoided. -+ */ -+static inline void vmexit_fill_RSB(void) -+{ -+#ifdef CONFIG_RETPOLINE -+ unsigned long loops = RSB_CLEAR_LOOPS / 2; -+ -+ asm volatile (ANNOTATE_NOSPEC_ALTERNATIVE -+ ALTERNATIVE("jmp 910f", -+ __stringify(__FILL_RETURN_BUFFER(%0, RSB_CLEAR_LOOPS, %1)), -+ X86_FEATURE_RETPOLINE) -+ "910:" -+ : "=&r" (loops), ASM_CALL_CONSTRAINT -+ : "r" (loops) : "memory" ); -+#endif -+} - #endif /* __ASSEMBLY__ */ - #endif /* __NOSPEC_BRANCH_H__ */ -diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c -index 8ca1eca..975ea99 100644 ---- a/arch/x86/kvm/svm.c -+++ b/arch/x86/kvm/svm.c -@@ -44,6 +44,7 @@ - #include <asm/debugreg.h> - #include <asm/kvm_para.h> - #include <asm/irq_remapping.h> -+#include <asm/nospec-branch.h> - - #include <asm/virtext.h> - #include "trace.h" -@@ -4886,6 +4887,9 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu) - #endif - ); - -+ /* Eliminate branch target predictions from guest mode */ -+ vmexit_fill_RSB(); -+ - #ifdef CONFIG_X86_64 - wrmsrl(MSR_GS_BASE, svm->host.gs_base); - #else -diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c -index 69b8f8a..4ead27f 100644 ---- a/arch/x86/kvm/vmx.c -+++ b/arch/x86/kvm/vmx.c -@@ -48,6 +48,7 @@ - #include <asm/kexec.h> - #include <asm/apic.h> - #include <asm/irq_remapping.h> -+#include <asm/nospec-branch.h> - - #include "trace.h" - #include "pmu.h" -@@ -8989,6 +8990,9 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu) - #endif - ); - -+ /* Eliminate branch target predictions from guest mode */ -+ vmexit_fill_RSB(); -+ - /* MSR_IA32_DEBUGCTLMSR is zeroed on vmexit. Restore it if needed */ - if (debugctlmsr) - update_debugctlmsr(debugctlmsr); --- -2.7.4 - |