|
@@ -81,6 +81,39 @@ struct rt_sigframe_n32 {
|
|
#endif
|
|
#endif
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+extern void sigset_from_compat (sigset_t *set, compat_sigset_t *compat);
|
|
|
|
+
|
|
|
|
+save_static_function(sysn32_rt_sigsuspend);
|
|
|
|
+__attribute_used__ noinline static int
|
|
|
|
+_sysn32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
|
|
|
|
+{
|
|
|
|
+ compat_sigset_t __user *unewset, uset;
|
|
|
|
+ size_t sigsetsize;
|
|
|
|
+ sigset_t newset;
|
|
|
|
+
|
|
|
|
+ /* XXX Don't preclude handling different sized sigset_t's. */
|
|
|
|
+ sigsetsize = regs.regs[5];
|
|
|
|
+ if (sigsetsize != sizeof(sigset_t))
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
|
|
+ unewset = (compat_sigset_t __user *) regs.regs[4];
|
|
|
|
+ if (copy_from_user(&uset, unewset, sizeof(uset)))
|
|
|
|
+ return -EFAULT;
|
|
|
|
+ sigset_from_compat (&newset, &uset);
|
|
|
|
+ sigdelsetmask(&newset, ~_BLOCKABLE);
|
|
|
|
+
|
|
|
|
+ spin_lock_irq(¤t->sighand->siglock);
|
|
|
|
+ current->saved_sigmask = current->blocked;
|
|
|
|
+ current->blocked = newset;
|
|
|
|
+ recalc_sigpending();
|
|
|
|
+ spin_unlock_irq(¤t->sighand->siglock);
|
|
|
|
+
|
|
|
|
+ current->state = TASK_INTERRUPTIBLE;
|
|
|
|
+ schedule();
|
|
|
|
+ set_thread_flag(TIF_RESTORE_SIGMASK);
|
|
|
|
+ return -ERESTARTNOHAND;
|
|
|
|
+}
|
|
|
|
+
|
|
save_static_function(sysn32_rt_sigreturn);
|
|
save_static_function(sysn32_rt_sigreturn);
|
|
__attribute_used__ noinline static void
|
|
__attribute_used__ noinline static void
|
|
_sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
|
|
_sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
|