Start refactoring __fpu__restore_sig() by inlining
copy_user_to_fpregs_zeroing().

Signed-off-by: Sebastian Andrzej Siewior <bige...@linutronix.de>
---
 arch/x86/kernel/fpu/signal.c | 42 ++++++++++++++++--------------------
 1 file changed, 19 insertions(+), 23 deletions(-)

diff --git a/arch/x86/kernel/fpu/signal.c b/arch/x86/kernel/fpu/signal.c
index 6e516eeaea328..c66356b168b39 100644
--- a/arch/x86/kernel/fpu/signal.c
+++ b/arch/x86/kernel/fpu/signal.c
@@ -221,28 +221,6 @@ sanitize_restored_xstate(union fpregs_state *state,
        }
 }
 
-/*
- * Restore the extended state if present. Otherwise, restore the FP/SSE state.
- */
-static inline int copy_user_to_fpregs_zeroing(void __user *buf, u64 xbv, int 
fx_only)
-{
-       if (use_xsave()) {
-               if ((unsigned long)buf % 64 || fx_only) {
-                       u64 init_bv = xfeatures_mask & ~XFEATURE_MASK_FPSSE;
-                       copy_kernel_to_xregs(&init_fpstate.xsave, init_bv);
-                       return copy_user_to_fxregs(buf);
-               } else {
-                       u64 init_bv = xfeatures_mask & ~xbv;
-                       if (unlikely(init_bv))
-                               copy_kernel_to_xregs(&init_fpstate.xsave, 
init_bv);
-                       return copy_user_to_xregs(buf, xbv);
-               }
-       } else if (use_fxsr()) {
-               return copy_user_to_fxregs(buf);
-       } else
-               return copy_user_to_fregs(buf);
-}
-
 static int __fpu__restore_sig(void __user *buf, void __user *buf_fx, int size)
 {
        int ia32_fxstate = (buf != buf_fx);
@@ -321,11 +299,29 @@ static int __fpu__restore_sig(void __user *buf, void 
__user *buf_fx, int size)
                kfree(tmp);
                return err;
        } else {
+               int ret;
+
                /*
                 * For 64-bit frames and 32-bit fsave frames, restore the user
                 * state to the registers directly (with exceptions handled).
                 */
-               if (copy_user_to_fpregs_zeroing(buf_fx, xfeatures, fx_only)) {
+               if (use_xsave()) {
+                       if ((unsigned long)buf_fx % 64 || fx_only) {
+                               u64 init_bv = xfeatures_mask & 
~XFEATURE_MASK_FPSSE;
+                               copy_kernel_to_xregs(&init_fpstate.xsave, 
init_bv);
+                               ret = copy_user_to_fxregs(buf_fx);
+                       } else {
+                               u64 init_bv = xfeatures_mask & ~xfeatures;
+                               if (unlikely(init_bv))
+                                       
copy_kernel_to_xregs(&init_fpstate.xsave, init_bv);
+                               ret = copy_user_to_xregs(buf_fx, xfeatures);
+                       }
+               } else if (use_fxsr()) {
+                       ret = copy_user_to_fxregs(buf_fx);
+               } else
+                       ret = copy_user_to_fregs(buf_fx);
+
+               if (ret) {
                        fpu__clear(fpu);
                        return -1;
                }
-- 
2.20.0.rc1

Reply via email to