x86, smap: Reduce the SMAP overhead for signal handling
[deliverable/linux.git] / arch / x86 / ia32 / ia32_signal.c
index 673ac9b63d6bf51ca36e2a0f18c4ca0d125d4fde..05e62a312bd9d371677dd3af2f28dee9d9e7b02d 100644 (file)
@@ -250,11 +250,12 @@ static int ia32_restore_sigcontext(struct pt_regs *regs,
 
                get_user_ex(tmp, &sc->fpstate);
                buf = compat_ptr(tmp);
-               err |= restore_i387_xstate_ia32(buf);
 
                get_user_ex(*pax, &sc->ax);
        } get_user_catch(err);
 
+       err |= restore_i387_xstate_ia32(buf);
+
        return err;
 }
 
@@ -502,7 +503,6 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
                put_user_ex(sig, &frame->sig);
                put_user_ex(ptr_to_compat(&frame->info), &frame->pinfo);
                put_user_ex(ptr_to_compat(&frame->uc), &frame->puc);
-               err |= copy_siginfo_to_user32(&frame->info, info);
 
                /* Create the ucontext.  */
                if (cpu_has_xsave)
@@ -514,9 +514,6 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
                put_user_ex(sas_ss_flags(regs->sp),
                            &frame->uc.uc_stack.ss_flags);
                put_user_ex(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
-               err |= ia32_setup_sigcontext(&frame->uc.uc_mcontext, fpstate,
-                                            regs, set->sig[0]);
-               err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
 
                if (ka->sa.sa_flags & SA_RESTORER)
                        restorer = ka->sa.sa_restorer;
@@ -532,6 +529,11 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
                put_user_ex(*((u64 *)&code), (u64 *)frame->retcode);
        } put_user_catch(err);
 
+       err |= copy_siginfo_to_user32(&frame->info, info);
+       err |= ia32_setup_sigcontext(&frame->uc.uc_mcontext, fpstate,
+                                    regs, set->sig[0]);
+       err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
+
        if (err)
                return -EFAULT;
 
This page took 0.02801 seconds and 5 git commands to generate.