* 1997-11-28 Modified for POSIX.1b signals by Richard Henderson
* 2000-06-20 Pentium III FXSR, SSE support by Gareth Hughes
* 2000-12-* x86-64 compatibility mode signal handling by Andi Kleen
+ *
+ * $Id: ia32_signal.c,v 1.22 2002/07/29 10:34:03 ak Exp $
*/
#include <linux/sched.h>
}
asmlinkage long
-sys32_sigsuspend(int history0, int history1, old_sigset_t mask)
+sys32_sigsuspend(int history0, int history1, old_sigset_t mask,
+ struct pt_regs *regs)
{
+ sigset_t saveset;
+
mask &= _BLOCKABLE;
spin_lock_irq(¤t->sighand->siglock);
- current->saved_sigmask = current->blocked;
+ saveset = current->blocked;
siginitset(¤t->blocked, mask);
recalc_sigpending();
spin_unlock_irq(¤t->sighand->siglock);
- current->state = TASK_INTERRUPTIBLE;
- schedule();
- set_thread_flag(TIF_RESTORE_SIGMASK);
- return -ERESTARTNOHAND;
+ regs->rax = -EINTR;
+ while (1) {
+ current->state = TASK_INTERRUPTIBLE;
+ schedule();
+ if (do_signal(regs, &saveset))
+ return -EINTR;
+ }
}
asmlinkage long
current->comm, current->pid, frame, regs->rip, frame->pretcode);
#endif
- return 0;
+ return 1;
give_sigsegv:
force_sigsegv(sig, current);
- return -EFAULT;
+ return 0;
}
int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
current->comm, current->pid, frame, regs->rip, frame->pretcode);
#endif
- return 0;
+ return 1;
give_sigsegv:
force_sigsegv(sig, current);
- return -EFAULT;
+ return 0;
}