]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - arch/arm64/kernel/signal32.c
Merge branch 'signal-cleanup' of git://git.kernel.org/pub/scm/linux/kernel/git/rw...
[mirror_ubuntu-artful-kernel.git] / arch / arm64 / kernel / signal32.c
index c5ee208321c3cf91ccbf81609cbbec00ae4b0663..1b9ad02837cfcafd4ecbc87f3e10aafe504ac0de 100644 (file)
@@ -407,19 +407,13 @@ badframe:
        return 0;
 }
 
-static void __user *compat_get_sigframe(struct k_sigaction *ka,
+static void __user *compat_get_sigframe(struct ksignal *ksig,
                                        struct pt_regs *regs,
                                        int framesize)
 {
-       compat_ulong_t sp = regs->compat_sp;
+       compat_ulong_t sp = sigsp(regs->compat_sp, ksig);
        void __user *frame;
 
-       /*
-        * This is the X/Open sanctioned signal stack switching.
-        */
-       if ((ka->sa.sa_flags & SA_ONSTACK) && !sas_ss_flags(sp))
-               sp = current->sas_ss_sp + current->sas_ss_size;
-
        /*
         * ATPCS B01 mandates 8-byte alignment
         */
@@ -520,18 +514,18 @@ static int compat_setup_sigframe(struct compat_sigframe __user *sf,
 /*
  * 32-bit signal handling routines called from signal.c
  */
-int compat_setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
+int compat_setup_rt_frame(int usig, struct ksignal *ksig,
                          sigset_t *set, struct pt_regs *regs)
 {
        struct compat_rt_sigframe __user *frame;
        int err = 0;
 
-       frame = compat_get_sigframe(ka, regs, sizeof(*frame));
+       frame = compat_get_sigframe(ksig, regs, sizeof(*frame));
 
        if (!frame)
                return 1;
 
-       err |= copy_siginfo_to_user32(&frame->info, info);
+       err |= copy_siginfo_to_user32(&frame->info, &ksig->info);
 
        __put_user_error(0, &frame->sig.uc.uc_flags, err);
        __put_user_error(0, &frame->sig.uc.uc_link, err);
@@ -541,7 +535,7 @@ int compat_setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
        err |= compat_setup_sigframe(&frame->sig, regs, set);
 
        if (err == 0) {
-               compat_setup_return(regs, ka, frame->sig.retcode, frame, usig);
+               compat_setup_return(regs, &ksig->ka, frame->sig.retcode, frame, usig);
                regs->regs[1] = (compat_ulong_t)(unsigned long)&frame->info;
                regs->regs[2] = (compat_ulong_t)(unsigned long)&frame->sig.uc;
        }
@@ -549,13 +543,13 @@ int compat_setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
        return err;
 }
 
-int compat_setup_frame(int usig, struct k_sigaction *ka, sigset_t *set,
+int compat_setup_frame(int usig, struct ksignal *ksig, sigset_t *set,
                       struct pt_regs *regs)
 {
        struct compat_sigframe __user *frame;
        int err = 0;
 
-       frame = compat_get_sigframe(ka, regs, sizeof(*frame));
+       frame = compat_get_sigframe(ksig, regs, sizeof(*frame));
 
        if (!frame)
                return 1;
@@ -564,7 +558,7 @@ int compat_setup_frame(int usig, struct k_sigaction *ka, sigset_t *set,
 
        err |= compat_setup_sigframe(frame, regs, set);
        if (err == 0)
-               compat_setup_return(regs, ka, frame->retcode, frame, usig);
+               compat_setup_return(regs, &ksig->ka, frame->retcode, frame, usig);
 
        return err;
 }