|
@@ -41,46 +41,20 @@ static void do_signal(struct pt_regs *, struct switch_stack *,
|
|
|
/*
|
|
|
* The OSF/1 sigprocmask calling sequence is different from the
|
|
|
* C sigprocmask() sequence..
|
|
|
- *
|
|
|
- * how:
|
|
|
- * 1 - SIG_BLOCK
|
|
|
- * 2 - SIG_UNBLOCK
|
|
|
- * 3 - SIG_SETMASK
|
|
|
- *
|
|
|
- * We change the range to -1 .. 1 in order to let gcc easily
|
|
|
- * use the conditional move instructions.
|
|
|
- *
|
|
|
- * Note that we don't need to acquire the kernel lock for SMP
|
|
|
- * operation, as all of this is local to this thread.
|
|
|
*/
|
|
|
-SYSCALL_DEFINE3(osf_sigprocmask, int, how, unsigned long, newmask,
|
|
|
- struct pt_regs *, regs)
|
|
|
+SYSCALL_DEFINE2(osf_sigprocmask, int, how, unsigned long, newmask)
|
|
|
{
|
|
|
- unsigned long oldmask = -EINVAL;
|
|
|
-
|
|
|
- if ((unsigned long)how-1 <= 2) {
|
|
|
- long sign = how-2; /* -1 .. 1 */
|
|
|
- unsigned long block, unblock;
|
|
|
-
|
|
|
- newmask &= _BLOCKABLE;
|
|
|
- spin_lock_irq(¤t->sighand->siglock);
|
|
|
- oldmask = current->blocked.sig[0];
|
|
|
-
|
|
|
- unblock = oldmask & ~newmask;
|
|
|
- block = oldmask | newmask;
|
|
|
- if (!sign)
|
|
|
- block = unblock;
|
|
|
- if (sign <= 0)
|
|
|
- newmask = block;
|
|
|
- if (_NSIG_WORDS > 1 && sign > 0)
|
|
|
- sigemptyset(¤t->blocked);
|
|
|
- current->blocked.sig[0] = newmask;
|
|
|
- recalc_sigpending();
|
|
|
- spin_unlock_irq(¤t->sighand->siglock);
|
|
|
-
|
|
|
- regs->r0 = 0; /* special no error return */
|
|
|
+ sigset_t oldmask;
|
|
|
+ sigset_t mask;
|
|
|
+ unsigned long res;
|
|
|
+
|
|
|
+ siginitset(&mask, newmask & ~_BLOCKABLE);
|
|
|
+ res = siprocmask(how, &mask, &oldmask);
|
|
|
+ if (!res) {
|
|
|
+ force_successful_syscall_return();
|
|
|
+ res = oldmask->sig[0];
|
|
|
}
|
|
|
- return oldmask;
|
|
|
+ return res;
|
|
|
}
|
|
|
|
|
|
SYSCALL_DEFINE3(osf_sigaction, int, sig,
|