[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20210618143451.442467526@linutronix.de>
Date: Fri, 18 Jun 2021 16:19:25 +0200
From: Thomas Gleixner <tglx@...utronix.de>
To: LKML <linux-kernel@...r.kernel.org>
Cc: Andy Lutomirski <luto@...nel.org>,
Dave Hansen <dave.hansen@...ux.intel.com>,
Fenghua Yu <fenghua.yu@...el.com>,
Tony Luck <tony.luck@...el.com>,
Yu-cheng Yu <yu-cheng.yu@...el.com>,
Sebastian Andrzej Siewior <bigeasy@...utronix.de>,
Borislav Petkov <bp@...e.de>,
Peter Zijlstra <peterz@...radead.org>,
Kan Liang <kan.liang@...ux.intel.com>
Subject: [patch V3 62/66] x86/fpu/signal: Sanitize copy_user_to_fpregs_zeroing()
Now that user_xfeatures is correctly set when xsave is enabled, remove the
duplicated initialization of components.
Rename the function while at it.
Signed-off-by: Thomas Gleixner <tglx@...utronix.de>
---
arch/x86/kernel/fpu/signal.c | 36 +++++++++++++++---------------------
1 file changed, 15 insertions(+), 21 deletions(-)
--- a/arch/x86/kernel/fpu/signal.c
+++ b/arch/x86/kernel/fpu/signal.c
@@ -250,33 +250,27 @@ sanitize_restored_user_xstate(union fpre
}
/*
- * Restore the extended state if present. Otherwise, restore the FP/SSE state.
+ * Restore the FPU state directly from the userspace signal frame.
*/
-static int copy_user_to_fpregs_zeroing(void __user *buf, u64 xbv, int fx_only)
+static int restore_fpregs_from_user(void __user *buf, u64 xrestore, bool fx_only)
{
- u64 init_bv;
- int r;
-
if (use_xsave()) {
- if (fx_only) {
- init_bv = xfeatures_mask_uabi() & ~XFEATURE_MASK_FPSSE;
+ u64 init_bv = xfeatures_mask_uabi() & ~xrestore;
+ int ret;
- r = fxrstor_from_user_sigframe(buf);
- if (!r)
- os_xrstor(&init_fpstate.xsave, init_bv);
- return r;
- } else {
- init_bv = xfeatures_mask_uabi() & ~xbv;
-
- r = xrstor_from_user_sigframe(buf, xbv);
- if (!r && unlikely(init_bv))
- os_xrstor(&init_fpstate.xsave, init_bv);
- return r;
- }
+ if (likely(!fx_only))
+ ret = xrstor_from_user_sigframe(buf, xrestore);
+ else
+ ret = fxrstor_from_user_sigframe(buf);
+
+ if (!ret && unlikely(init_bv))
+ os_xrstor(&init_fpstate.xsave, init_bv);
+ return ret;
} else if (use_fxsr()) {
return fxrstor_from_user_sigframe(buf);
- } else
+ } else {
return frstor_from_user_sigframe(buf);
+ }
}
static int __fpu_restore_sig(void __user *buf, void __user *buf_fx,
@@ -313,7 +307,7 @@ static int __fpu_restore_sig(void __user
*/
fpregs_lock();
pagefault_disable();
- ret = copy_user_to_fpregs_zeroing(buf_fx, user_xfeatures, fx_only);
+ ret = restore_fpregs_from_user(buf_fx, user_xfeatures, fx_only);
pagefault_enable();
if (!ret) {
Powered by blists - more mailing lists