patch-2.4.19 linux-2.4.19/arch/sparc/kernel/signal.c
Next file: linux-2.4.19/arch/sparc/kernel/sparc_ksyms.c
Previous file: linux-2.4.19/arch/sparc/kernel/setup.c
Back to the patch index
Back to the overall index
- Lines: 115
- Date:
Fri Aug 2 17:39:43 2002
- Orig file:
linux-2.4.18/arch/sparc/kernel/signal.c
- Orig date:
Wed Jan 24 15:18:06 2001
diff -urN linux-2.4.18/arch/sparc/kernel/signal.c linux-2.4.19/arch/sparc/kernel/signal.c
@@ -664,6 +664,7 @@
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;
@@ -747,6 +748,7 @@
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);
@@ -1172,9 +1174,22 @@
signr = dequeue_signal(¤t->blocked, &info);
spin_unlock_irq(¤t->sigmask_lock);
- if (!signr) break;
+ if (!signr)
+ break;
if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) {
+ /* Do the syscall restart before we let the debugger
+ * look at the child registers.
+ */
+ if (restart_syscall &&
+ (regs->u_regs[UREG_I0] == ERESTARTNOHAND ||
+ regs->u_regs[UREG_I0] == ERESTARTSYS ||
+ regs->u_regs[UREG_I0] == ERESTARTNOINTR)) {
+ regs->u_regs[UREG_I0] = orig_i0;
+ regs->pc -= 4;
+ regs->npc -= 4;
+ restart_syscall = 0;
+ }
current->exit_code = signr;
current->state = TASK_STOPPED;
@@ -1207,8 +1222,8 @@
ka = ¤t->sig->action[signr-1];
- if(ka->sa.sa_handler == SIG_IGN) {
- if(signr != SIGCHLD)
+ if (ka->sa.sa_handler == SIG_IGN) {
+ if (signr != SIGCHLD)
continue;
/* sys_wait4() grabs the master kernel lock, so
@@ -1216,16 +1231,16 @@
* threaded and would not be that difficult to
* do anyways.
*/
- while(sys_wait4(-1, NULL, WNOHANG, NULL) > 0)
+ while (sys_wait4(-1, NULL, WNOHANG, NULL) > 0)
;
continue;
}
- if(ka->sa.sa_handler == SIG_DFL) {
+ if (ka->sa.sa_handler == SIG_DFL) {
unsigned long exit_code = signr;
- if(current->pid == 1)
+ if (current->pid == 1)
continue;
- switch(signr) {
+ switch (signr) {
case SIGCONT: case SIGCHLD: case SIGWINCH:
continue;
@@ -1244,8 +1259,8 @@
current->exit_code = signr;
/* notify_parent() is SMP safe */
- if(!(current->p_pptr->sig->action[SIGCHLD-1].sa.sa_flags &
- SA_NOCLDSTOP))
+ if (!(current->p_pptr->sig->action[SIGCHLD-1].sa.sa_flags &
+ SA_NOCLDSTOP))
notify_parent(current, SIGCHLD);
schedule();
continue;
@@ -1264,8 +1279,8 @@
struct reg_window *rw = (struct reg_window *)regs->u_regs[UREG_FP];
unsigned int ins[8];
- while(rw &&
- !(((unsigned long) rw) & 0x3)) {
+ while (rw &&
+ !(((unsigned long) rw) & 0x3)) {
copy_from_user(ins, &rw->ins[0], sizeof(ins));
printk("Caller[%08x](%08x,%08x,%08x,%08x,%08x,%08x)\n", ins[7], ins[0], ins[1], ins[2], ins[3], ins[4], ins[5]);
rw = (struct reg_window *)(unsigned long)ins[6];
@@ -1286,15 +1301,15 @@
/* NOT REACHED */
}
}
- if(restart_syscall)
+ if (restart_syscall)
syscall_restart(orig_i0, regs, &ka->sa);
handle_signal(signr, ka, &info, oldset, regs, svr4_signal);
return 1;
}
- if(restart_syscall &&
- (regs->u_regs[UREG_I0] == ERESTARTNOHAND ||
- regs->u_regs[UREG_I0] == ERESTARTSYS ||
- regs->u_regs[UREG_I0] == ERESTARTNOINTR)) {
+ if (restart_syscall &&
+ (regs->u_regs[UREG_I0] == ERESTARTNOHAND ||
+ regs->u_regs[UREG_I0] == ERESTARTSYS ||
+ regs->u_regs[UREG_I0] == ERESTARTNOINTR)) {
/* replay the system call when we are done */
regs->u_regs[UREG_I0] = orig_i0;
regs->pc -= 4;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)