summaryrefslogtreecommitdiff
path: root/patches/x86-fpu-Don-t-cache-access-to-fpu_fpregs_owner_ctx.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/x86-fpu-Don-t-cache-access-to-fpu_fpregs_owner_ctx.patch')
-rw-r--r--patches/x86-fpu-Don-t-cache-access-to-fpu_fpregs_owner_ctx.patch107
1 files changed, 0 insertions, 107 deletions
diff --git a/patches/x86-fpu-Don-t-cache-access-to-fpu_fpregs_owner_ctx.patch b/patches/x86-fpu-Don-t-cache-access-to-fpu_fpregs_owner_ctx.patch
deleted file mode 100644
index 69d2ed870f76..000000000000
--- a/patches/x86-fpu-Don-t-cache-access-to-fpu_fpregs_owner_ctx.patch
+++ /dev/null
@@ -1,107 +0,0 @@
-From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
-Date: Thu, 28 Nov 2019 09:53:06 +0100
-Subject: [PATCH] x86/fpu: Don't cache access to fpu_fpregs_owner_ctx
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-The state/owner of the FPU is saved to fpu_fpregs_owner_ctx by pointing
-to the context that is currently loaded. It never changed during the
-lifetime of a task - it remained stable/constant.
-
-After deferred FPU registers loading until return to userland was
-implemented, the content of fpu_fpregs_owner_ctx may change during
-preemption and must not be cached.
-
-This went unnoticed for some time and was now noticed, in particular
-since gcc 9 is caching that load in copy_fpstate_to_sigframe() and
-reusing it in the retry loop:
-
- copy_fpstate_to_sigframe()
- load fpu_fpregs_owner_ctx and save on stack
- fpregs_lock()
- copy_fpregs_to_sigframe() /* failed */
- fpregs_unlock()
- *** PREEMPTION, another uses FPU, changes fpu_fpregs_owner_ctx ***
-
- fault_in_pages_writeable() /* succeed, retry */
-
- fpregs_lock()
- __fpregs_load_activate()
- fpregs_state_valid() /* uses fpu_fpregs_owner_ctx from stack */
- copy_fpregs_to_sigframe() /* succeeds, random FPU content */
-
-This is a comparison of the assembly produced by gcc 9, without vs with this
-patch:
-
-| # arch/x86/kernel/fpu/signal.c:173: if (!access_ok(buf, size))
-| cmpq %rdx, %rax # tmp183, _4
-| jb .L190 #,
-|-# arch/x86/include/asm/fpu/internal.h:512: return fpu == this_cpu_read_stable(fpu_fpregs_owner_ctx) && cpu == fpu->last_cpu;
-|-#APP
-|-# 512 "arch/x86/include/asm/fpu/internal.h" 1
-|- movq %gs:fpu_fpregs_owner_ctx,%rax #, pfo_ret__
-|-# 0 "" 2
-|-#NO_APP
-|- movq %rax, -88(%rbp) # pfo_ret__, %sfp
-…
-|-# arch/x86/include/asm/fpu/internal.h:512: return fpu == this_cpu_read_stable(fpu_fpregs_owner_ctx) && cpu == fpu->last_cpu;
-|- movq -88(%rbp), %rcx # %sfp, pfo_ret__
-|- cmpq %rcx, -64(%rbp) # pfo_ret__, %sfp
-|+# arch/x86/include/asm/fpu/internal.h:512: return fpu == this_cpu_read(fpu_fpregs_owner_ctx) && cpu == fpu->last_cpu;
-|+#APP
-|+# 512 "arch/x86/include/asm/fpu/internal.h" 1
-|+ movq %gs:fpu_fpregs_owner_ctx(%rip),%rax # fpu_fpregs_owner_ctx, pfo_ret__
-|+# 0 "" 2
-|+# arch/x86/include/asm/fpu/internal.h:512: return fpu == this_cpu_read(fpu_fpregs_owner_ctx) && cpu == fpu->last_cpu;
-|+#NO_APP
-|+ cmpq %rax, -64(%rbp) # pfo_ret__, %sfp
-
-Use this_cpu_read() instead this_cpu_read_stable() to avoid caching of
-fpu_fpregs_owner_ctx during preemption points.
-
-The Fixes: tag points to the commit where deferred FPU loading was
-added. Since this commit, the compiler is no longer allowed to move the
-load of fpu_fpregs_owner_ctx somewhere else / outside of the locked
-section. A task preemption will change its value and stale content will
-be observed.
-
- [ bp: Massage. ]
-
-Debugged-by: Austin Clements <austin@google.com>
-Debugged-by: David Chase <drchase@golang.org>
-Debugged-by: Ian Lance Taylor <ian@airs.com>
-Fixes: 5f409e20b7945 ("x86/fpu: Defer FPU state load until return to userspace")
-Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
-Signed-off-by: Borislav Petkov <bp@suse.de>
-Reviewed-by: Rik van Riel <riel@surriel.com>
-Tested-by: Borislav Petkov <bp@suse.de>
-Cc: Aubrey Li <aubrey.li@intel.com>
-Cc: Austin Clements <austin@google.com>
-Cc: Barret Rhoden <brho@google.com>
-Cc: Dave Hansen <dave.hansen@intel.com>
-Cc: David Chase <drchase@golang.org>
-Cc: "H. Peter Anvin" <hpa@zytor.com>
-Cc: ian@airs.com
-Cc: Ingo Molnar <mingo@redhat.com>
-Cc: Josh Bleecher Snyder <josharian@gmail.com>
-Cc: Thomas Gleixner <tglx@linutronix.de>
-Cc: x86-ml <x86@kernel.org>
-Cc: stable-rt@vger.kernel.org
-Link: https://lkml.kernel.org/r/20191128085306.hxfa2o3knqtu4wfn@linutronix.de
-Link: https://bugzilla.kernel.org/show_bug.cgi?id=205663
----
- arch/x86/include/asm/fpu/internal.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/arch/x86/include/asm/fpu/internal.h
-+++ b/arch/x86/include/asm/fpu/internal.h
-@@ -509,7 +509,7 @@ static inline void __fpu_invalidate_fpre
-
- static inline int fpregs_state_valid(struct fpu *fpu, unsigned int cpu)
- {
-- return fpu == this_cpu_read_stable(fpu_fpregs_owner_ctx) && cpu == fpu->last_cpu;
-+ return fpu == this_cpu_read(fpu_fpregs_owner_ctx) && cpu == fpu->last_cpu;
- }
-
- /*