static long
 setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, 
-                struct switch_stack *sw, unsigned long mask, unsigned long sp)
+                unsigned long mask, unsigned long sp)
 {
+       struct switch_stack *sw = (struct switch_stack *)regs - 1;
        long i, err = 0;
 
        err |= __put_user(on_sig_stack((unsigned long)sc), &sc->sc_onstack);
 
 static int
 setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
-           struct pt_regs *regs, struct switch_stack * sw)
+           struct pt_regs *regs)
 {
        unsigned long oldsp, r26, err = 0;
        struct sigframe __user *frame;
        if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
                return -EFAULT;
 
-       err |= setup_sigcontext(&frame->sc, regs, sw, set->sig[0], oldsp);
+       err |= setup_sigcontext(&frame->sc, regs, set->sig[0], oldsp);
        if (err)
                return -EFAULT;
 
 
 static int
 setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
-              sigset_t *set, struct pt_regs *regs, struct switch_stack * sw)
+              sigset_t *set, struct pt_regs *regs)
 {
        unsigned long oldsp, r26, err = 0;
        struct rt_sigframe __user *frame;
        err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
        err |= __put_user(sas_ss_flags(oldsp), &frame->uc.uc_stack.ss_flags);
        err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
-       err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, sw,
+       err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, 
                                set->sig[0], oldsp);
        err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
        if (err)
  */
 static inline void
 handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info,
-             struct pt_regs * regs, struct switch_stack *sw)
+             struct pt_regs * regs)
 {
        sigset_t *oldset = sigmask_to_save();
        int ret;
 
        if (ka->sa.sa_flags & SA_SIGINFO)
-               ret = setup_rt_frame(sig, ka, info, oldset, regs, sw);
+               ret = setup_rt_frame(sig, ka, info, oldset, regs);
        else
-               ret = setup_frame(sig, ka, oldset, regs, sw);
+               ret = setup_frame(sig, ka, oldset, regs);
 
        if (ret) {
                force_sigsegv(sig, current);
  * all (if we get here from anything but a syscall return, it will be 0)
  */
 static void
-do_signal(struct pt_regs * regs, struct switch_stack * sw,
-         unsigned long r0, unsigned long r19)
+do_signal(struct pt_regs *regs, unsigned long r0, unsigned long r19)
 {
        siginfo_t info;
        int signr;
                /* Whee!  Actually deliver the signal.  */
                if (r0)
                        syscall_restart(r0, r19, regs, &ka);
-               handle_signal(signr, &ka, &info, regs, sw);
+               handle_signal(signr, &ka, &info, regs);
                if (single_stepping) 
                        ptrace_set_bpt(current); /* re-set bpt */
                return;
 }
 
 void
-do_work_pending(struct pt_regs *regs, struct switch_stack *sw,
+do_work_pending(struct pt_regs *regs, struct switch_stack *unused,
                 unsigned long thread_flags,
                 unsigned long r0, unsigned long r19)
 {
                } else {
                        local_irq_enable();
                        if (thread_flags & _TIF_SIGPENDING) {
-                               do_signal(regs, sw, r0, r19);
+                               do_signal(regs, r0, r19);
                                r0 = 0;
                        } else {
                                clear_thread_flag(TIF_NOTIFY_RESUME);