return;
segv_and_exit:
- do_exit(SIGSEGV);
+ force_sig(SIGSEGV, current);
}
asmlinkage void do_sigreturn(struct pt_regs *regs)
return;
segv_and_exit:
- send_sig(SIGSEGV, current, 1);
+ force_sig(SIGSEGV, current);
}
asmlinkage void do_rt_sigreturn(struct pt_regs *regs)
spin_unlock_irq(¤t->sighand->siglock);
return;
segv:
- send_sig(SIGSEGV, current, 1);
+ force_sig(SIGSEGV, current);
}
/* Checks if the fp is valid */
sigill_and_return:
do_exit(SIGILL);
sigsegv:
- do_exit(SIGSEGV);
+ force_sigsegv(signr, current);
}
regs->u_regs[UREG_FP] = (unsigned long) sf;
regs->u_regs[UREG_I0] = signo;
regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
+ regs->u_regs[UREG_I2] = (unsigned long) &sf->info;
/* 4. signal handler */
regs->pc = (unsigned long) ka->sa.sa_handler;
sigill_and_return:
do_exit(SIGILL);
sigsegv:
- do_exit(SIGSEGV);
+ force_sigsegv(signo, current);
}
static inline void
regs->u_regs[UREG_FP] = (unsigned long) sf;
regs->u_regs[UREG_I0] = signo;
regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
+ regs->u_regs[UREG_I2] = (unsigned long) &sf->regs;
regs->pc = (unsigned long) ka->sa.sa_handler;
regs->npc = (regs->pc + 4);
sigill:
do_exit(SIGILL);
sigsegv:
- do_exit(SIGSEGV);
+ force_sigsegv(signo, current);
}
/* Setup a Solaris stack frame */
sigill_and_return:
do_exit(SIGILL);
sigsegv:
- do_exit(SIGSEGV);
+ force_sigsegv(signr, current);
}
asmlinkage int svr4_getcontext(svr4_ucontext_t __user *uc, struct pt_regs *regs)
synchronize_user_stack();
if (current_thread_info()->w_saved)
- goto sigsegv_and_return;
+ return -EFAULT;
err = clear_user(uc, sizeof(*uc));
if (err)
* we have already stuffed all of it with sync_user_stack
*/
return (err ? -EFAULT : 0);
-
-sigsegv_and_return:
- do_exit(SIGSEGV);
}
/* Set the context for a svr4 application, this is Solaris way to sigreturn */
return (err ? -EFAULT : 0);
sigsegv_and_return:
- do_exit(SIGSEGV);
+ force_sig(SIGSEGV, current);
}
static inline void
else
setup_frame(&ka->sa, regs, signr, oldset, info);
}
- if (ka->sa.sa_flags & SA_ONESHOT)
- ka->sa.sa_handler = SIG_DFL;
if (!(ka->sa.sa_flags & SA_NOMASK)) {
spin_lock_irq(¤t->sighand->siglock);
sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
{
siginfo_t info;
struct sparc_deliver_cookie cookie;
+ struct k_sigaction ka;
int signr;
/*
if (!oldset)
oldset = ¤t->blocked;
- signr = get_signal_to_deliver(&info, regs, &cookie);
+ signr = get_signal_to_deliver(&info, &ka, regs, &cookie);
if (signr > 0) {
- struct k_sigaction *ka;
-
- ka = ¤t->sighand->action[signr-1];
-
if (cookie.restart_syscall)
- syscall_restart(cookie.orig_i0, regs, &ka->sa);
- handle_signal(signr, ka, &info, oldset, regs, svr4_signal);
+ syscall_restart(cookie.orig_i0, regs, &ka.sa);
+ handle_signal(signr, &ka, &info, oldset,
+ regs, svr4_signal);
return 1;
}
if (cookie.restart_syscall &&