diff options
Diffstat (limited to 'libre-testing/linux-libre/0001-x86-fpu-Fix-invalid-FPU-ptrace-state-after-execve.patch')
-rw-r--r-- | libre-testing/linux-libre/0001-x86-fpu-Fix-invalid-FPU-ptrace-state-after-execve.patch | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/libre-testing/linux-libre/0001-x86-fpu-Fix-invalid-FPU-ptrace-state-after-execve.patch b/libre-testing/linux-libre/0001-x86-fpu-Fix-invalid-FPU-ptrace-state-after-execve.patch new file mode 100644 index 000000000..8cef84635 --- /dev/null +++ b/libre-testing/linux-libre/0001-x86-fpu-Fix-invalid-FPU-ptrace-state-after-execve.patch @@ -0,0 +1,65 @@ +From 885bad1e5f32bbf30787ead9578f8174047e6904 Mon Sep 17 00:00:00 2001 +From: Yu-cheng Yu <yu-cheng.yu@intel.com> +Date: Thu, 17 Nov 2016 09:11:35 -0800 +Subject: [PATCH] x86/fpu: Fix invalid FPU ptrace state after execve() + +commit b22cbe404a9cc3c7949e380fa1861e31934c8978 upstream. + +Robert O'Callahan reported that after an execve PTRACE_GETREGSET +NT_X86_XSTATE continues to return the pre-exec register values +until the exec'ed task modifies FPU state. + +The test code is at: + + https://bugzilla.redhat.com/attachment.cgi?id=1164286. + +What is happening is fpu__clear() does not properly clear fpstate. +Fix it by doing just that. + +Reported-by: Robert O'Callahan <robert@ocallahan.org> +Signed-off-by: Yu-cheng Yu <yu-cheng.yu@intel.com> +Cc: Andy Lutomirski <luto@kernel.org> +Cc: Borislav Petkov <bp@suse.de> +Cc: David Hansen <dave.hansen@linux.intel.com> +Cc: Fenghua Yu <fenghua.yu@intel.com> +Cc: Linus Torvalds <torvalds@linux-foundation.org> +Cc: Peter Zijlstra <peterz@infradead.org> +Cc: Ravi V. Shankar <ravi.v.shankar@intel.com> +Cc: Thomas Gleixner <tglx@linutronix.de> +Link: http://lkml.kernel.org/r/1479402695-6553-1-git-send-email-yu-cheng.yu@intel.com +Signed-off-by: Ingo Molnar <mingo@kernel.org> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +--- + arch/x86/kernel/fpu/core.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +diff --git a/arch/x86/kernel/fpu/core.c b/arch/x86/kernel/fpu/core.c +index 3fc03a09a93b1710..c289e2f4a6e5b464 100644 +--- a/arch/x86/kernel/fpu/core.c ++++ b/arch/x86/kernel/fpu/core.c +@@ -517,14 +517,14 @@ void fpu__clear(struct fpu *fpu) + { + WARN_ON_FPU(fpu != ¤t->thread.fpu); /* Almost certainly an anomaly */ + +- if (!use_eager_fpu() || !static_cpu_has(X86_FEATURE_FPU)) { +- /* FPU state will be reallocated lazily at the first use. */ +- fpu__drop(fpu); +- } else { +- if (!fpu->fpstate_active) { +- fpu__activate_curr(fpu); +- user_fpu_begin(); +- } ++ fpu__drop(fpu); ++ ++ /* ++ * Make sure fpstate is cleared and initialized. ++ */ ++ if (static_cpu_has(X86_FEATURE_FPU)) { ++ fpu__activate_curr(fpu); ++ user_fpu_begin(); + copy_init_fpstate_to_fpregs(); + } + } +-- +2.10.2 + |