[IA64] Add TIF_RESTORE_SIGMASK
Preparation for pselect and ppoll. ia32 compat code not tested. :-( Signed-off-by: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru> Signed-off-by: Alexey Dobriyan <adobriyan@openvz.org> Signed-off-by: Tony Luck <tony.luck@intel.com>
This commit is contained in:
committed by
Tony Luck
parent
690def2141
commit
4a177cbf84
@@ -452,59 +452,20 @@ sigact_set_handler (struct k_sigaction *sa, unsigned int handler, unsigned int r
|
||||
sa->sa.sa_handler = (__sighandler_t) (((unsigned long) restorer << 32) | handler);
|
||||
}
|
||||
|
||||
long
|
||||
__ia32_rt_sigsuspend (compat_sigset_t *sset, unsigned int sigsetsize, struct sigscratch *scr)
|
||||
asmlinkage long
|
||||
sys32_sigsuspend (int history0, int history1, old_sigset_t mask)
|
||||
{
|
||||
extern long ia64_do_signal (sigset_t *oldset, struct sigscratch *scr, long in_syscall);
|
||||
sigset_t oldset, set;
|
||||
|
||||
scr->scratch_unat = 0; /* avoid leaking kernel bits to user level */
|
||||
memset(&set, 0, sizeof(set));
|
||||
|
||||
memcpy(&set.sig, &sset->sig, sigsetsize);
|
||||
|
||||
sigdelsetmask(&set, ~_BLOCKABLE);
|
||||
|
||||
mask &= _BLOCKABLE;
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
{
|
||||
oldset = current->blocked;
|
||||
current->blocked = set;
|
||||
recalc_sigpending();
|
||||
}
|
||||
current->saved_sigmask = current->blocked;
|
||||
siginitset(¤t->blocked, mask);
|
||||
recalc_sigpending();
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
|
||||
/*
|
||||
* The return below usually returns to the signal handler. We need to pre-set the
|
||||
* correct error code here to ensure that the right values get saved in sigcontext
|
||||
* by ia64_do_signal.
|
||||
*/
|
||||
scr->pt.r8 = -EINTR;
|
||||
while (1) {
|
||||
current->state = TASK_INTERRUPTIBLE;
|
||||
schedule();
|
||||
if (ia64_do_signal(&oldset, scr, 1))
|
||||
return -EINTR;
|
||||
}
|
||||
}
|
||||
|
||||
asmlinkage long
|
||||
ia32_rt_sigsuspend (compat_sigset_t __user *uset, unsigned int sigsetsize, struct sigscratch *scr)
|
||||
{
|
||||
compat_sigset_t set;
|
||||
|
||||
if (sigsetsize > sizeof(compat_sigset_t))
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_from_user(&set.sig, &uset->sig, sigsetsize))
|
||||
return -EFAULT;
|
||||
|
||||
return __ia32_rt_sigsuspend(&set, sigsetsize, scr);
|
||||
}
|
||||
|
||||
asmlinkage long
|
||||
ia32_sigsuspend (unsigned int mask, struct sigscratch *scr)
|
||||
{
|
||||
return __ia32_rt_sigsuspend((compat_sigset_t *) &mask, sizeof(mask), scr);
|
||||
current->state = TASK_INTERRUPTIBLE;
|
||||
schedule();
|
||||
set_thread_flag(TIF_RESTORE_SIGMASK);
|
||||
return -ERESTARTNOHAND;
|
||||
}
|
||||
|
||||
asmlinkage long
|
||||
|
Reference in New Issue
Block a user