Merge git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6: [IA64] wire up pselect, ppoll [IA64] Add TIF_RESTORE_SIGMASK [IA64] unwind did not work for processes born with CLONE_STOPPED [IA64] Optional method to purge the TLB on SN systems [IA64] SPIN_LOCK_UNLOCKED macro cleanup in arch/ia64 [IA64-SN2][KJ] mmtimer.c-kzalloc [IA64] fix stack alignment for ia32 signal handlers [IA64] - Altix: hotplug after intr redirect can crash system [IA64] save and restore cpus_allowed in cpu_idle_wait [IA64] Removal of percpu TR cleanup in kexec code [IA64] Fix some section mismatch errors
This commit is contained in:
@@ -451,59 +451,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
|
||||
@@ -810,7 +771,11 @@ get_sigframe (struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
|
||||
}
|
||||
/* Legacy stack switching not supported */
|
||||
|
||||
return (void __user *)((esp - frame_size) & -8ul);
|
||||
esp -= frame_size;
|
||||
/* Align the stack pointer according to the i386 ABI,
|
||||
* i.e. so that on function entry ((sp + 4) & 15) == 0. */
|
||||
esp = ((esp + 4) & -16ul) - 4;
|
||||
return (void __user *) esp;
|
||||
}
|
||||
|
||||
static int
|
||||
|
Reference in New Issue
Block a user