projects
/
GitHub
/
LineageOS
/
G12
/
android_kernel_amlogic_linux-4.9.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
b1276c4
)
x86/fpu: Better document fpu__clear() state handling
author
Ingo Molnar
<mingo@kernel.org>
Wed, 29 Apr 2015 06:46:26 +0000
(08:46 +0200)
committer
Ingo Molnar
<mingo@kernel.org>
Tue, 19 May 2015 13:48:02 +0000
(15:48 +0200)
So prior to this fix:
c88d47480d30
("x86/fpu: Always restore_xinit_state() when use_eager_cpu()")
we leaked FPU state across execve() boundaries on eagerfpu systems:
$ /host/home/mingo/dump-xmm-regs-exec
# XMM state before execve():
XMM0 :
000000000000dede
XMM1 :
000000000000dedf
XMM2 :
000000000000dee0
XMM3 :
000000000000dee1
XMM4 :
000000000000dee2
XMM5 :
000000000000dee3
XMM6 :
000000000000dee4
XMM7 :
000000000000dee5
XMM8 :
000000000000dee6
XMM9 :
000000000000dee7
XMM10:
000000000000dee8
XMM11:
000000000000dee9
XMM12:
000000000000deea
XMM13:
000000000000deeb
XMM14:
000000000000deec
XMM15:
000000000000deed
# XMM state after execve(), in the new task context:
XMM0 :
0000000000000000
XMM1 :
2f2f2f2f2f2f2f2f
XMM2 :
0000000000000000
XMM3 :
0000000000000000
XMM4 :
00000000000000ff
XMM5 :
00000000ff000000
XMM6 :
000000000000dee4
XMM7 :
000000000000dee5
XMM8 :
0000000000000000
XMM9 :
0000000000000000
XMM10:
0000000000000000
XMM11:
0000000000000000
XMM12:
0000000000000000
XMM13:
000000000000deeb
XMM14:
000000000000deec
XMM15:
000000000000deed
Better explain what this function is supposed to do and why.
Reviewed-by: Borislav Petkov <bp@alien8.de>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
arch/x86/kernel/fpu/core.c
patch
|
blob
|
blame
|
history
diff --git
a/arch/x86/kernel/fpu/core.c
b/arch/x86/kernel/fpu/core.c
index 91b9935021c4dd379b25078781c92e8719458547..a2e2da2b08c5dd066036828d22eb5e74f75be110 100644
(file)
--- a/
arch/x86/kernel/fpu/core.c
+++ b/
arch/x86/kernel/fpu/core.c
@@
-348,6
+348,10
@@
void fpu__restore(void)
}
EXPORT_SYMBOL_GPL(fpu__restore);
+/*
+ * Called by sys_execve() to clear the FPU fpregs, so that FPU state
+ * of the previous binary does not leak over into the exec()ed binary:
+ */
void fpu__clear(struct task_struct *tsk)
{
struct fpu *fpu = &tsk->thread.fpu;