2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
6 * Copyright (C) 1991, 1992 Linus Torvalds
7 * Copyright (C) 1994 - 2000, 2006 Ralf Baechle
8 * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
10 #include <linux/cache.h>
11 #include <linux/sched.h>
13 #include <linux/smp.h>
14 #include <linux/smp_lock.h>
15 #include <linux/kernel.h>
16 #include <linux/signal.h>
17 #include <linux/syscalls.h>
18 #include <linux/errno.h>
19 #include <linux/wait.h>
20 #include <linux/ptrace.h>
21 #include <linux/compat.h>
22 #include <linux/suspend.h>
23 #include <linux/compiler.h>
27 #include <linux/bitops.h>
28 #include <asm/cacheflush.h>
30 #include <asm/uaccess.h>
31 #include <asm/ucontext.h>
32 #include <asm/system.h>
36 #include "signal-common.h"
38 #define SI_PAD_SIZE32 ((SI_MAX_SIZE/sizeof(int)) - 3)
40 typedef struct compat_siginfo {
46 int _pad[SI_PAD_SIZE32];
50 compat_pid_t _pid; /* sender's pid */
51 compat_uid_t _uid; /* sender's uid */
56 compat_pid_t _pid; /* which child */
57 compat_uid_t _uid; /* sender's uid */
58 int _status; /* exit code */
59 compat_clock_t _utime;
60 compat_clock_t _stime;
65 compat_pid_t _pid; /* which child */
66 compat_clock_t _utime;
67 int _status; /* exit code */
68 compat_clock_t _stime;
71 /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
73 s32 _addr; /* faulting insn/memory ref. */
76 /* SIGPOLL, SIGXFSZ (To do ...) */
78 int _band; /* POLL_IN, POLL_OUT, POLL_MSG */
84 timer_t _tid; /* timer id */
85 int _overrun; /* overrun count */
86 compat_sigval_t _sigval;/* same as below */
87 int _sys_private; /* not to be passed to user */
90 /* POSIX.1b signals */
92 compat_pid_t _pid; /* sender's pid */
93 compat_uid_t _uid; /* sender's uid */
94 compat_sigval_t _sigval;
101 * Including <asm/unistd.h> would give use the 64-bit syscall numbers ...
103 #define __NR_O32_sigreturn 4119
104 #define __NR_O32_rt_sigreturn 4193
105 #define __NR_O32_restart_syscall 4253
107 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
109 /* 32-bit compatibility types */
111 #define _NSIG_BPW32 32
112 #define _NSIG_WORDS32 (_NSIG / _NSIG_BPW32)
115 unsigned int sig[_NSIG_WORDS32];
118 typedef unsigned int __sighandler32_t;
119 typedef void (*vfptr_t)(void);
122 unsigned int sa_flags;
123 __sighandler32_t sa_handler;
124 compat_sigset_t sa_mask;
127 /* IRIX compatible stack_t */
128 typedef struct sigaltstack32 {
130 compat_size_t ss_size;
138 struct sigcontext32 uc_mcontext;
139 sigset_t32 uc_sigmask; /* mask last for extensibility */
142 #if ICACHE_REFILLS_WORKAROUND_WAR == 0
144 struct rt_sigframe32 {
145 u32 rs_ass[4]; /* argument save space for o32 */
146 u32 rs_code[2]; /* signal trampoline */
147 compat_siginfo_t rs_info;
148 struct ucontext32 rs_uc;
151 #else /* ICACHE_REFILLS_WORKAROUND_WAR */
153 struct rt_sigframe32 {
154 u32 rs_ass[4]; /* argument save space for o32 */
156 compat_siginfo_t rs_info;
157 struct ucontext32 rs_uc;
158 u32 rs_code[8] __attribute__((aligned(32))); /* signal trampoline */
161 #endif /* !ICACHE_REFILLS_WORKAROUND_WAR */
164 * sigcontext handlers
166 static int setup_sigcontext32(struct pt_regs *regs,
167 struct sigcontext32 __user *sc)
172 err |= __put_user(regs->cp0_epc, &sc->sc_pc);
173 err |= __put_user(regs->cp0_status, &sc->sc_status);
175 err |= __put_user(0, &sc->sc_regs[0]);
176 for (i = 1; i < 32; i++)
177 err |= __put_user(regs->regs[i], &sc->sc_regs[i]);
179 err |= __put_user(regs->hi, &sc->sc_mdhi);
180 err |= __put_user(regs->lo, &sc->sc_mdlo);
182 err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
183 err |= __put_user(mfhi1(), &sc->sc_hi1);
184 err |= __put_user(mflo1(), &sc->sc_lo1);
185 err |= __put_user(mfhi2(), &sc->sc_hi2);
186 err |= __put_user(mflo2(), &sc->sc_lo2);
187 err |= __put_user(mfhi3(), &sc->sc_hi3);
188 err |= __put_user(mflo3(), &sc->sc_lo3);
191 err |= __put_user(!!used_math(), &sc->sc_used_math);
195 * Save FPU state to signal context. Signal handler
196 * will "inherit" current FPU state.
200 if (!is_fpu_owner()) {
204 err |= save_fp_context32(sc);
211 static int restore_sigcontext32(struct pt_regs *regs,
212 struct sigcontext32 __user *sc)
219 /* Always make any pending restarted system calls return -EINTR */
220 current_thread_info()->restart_block.fn = do_no_restart_syscall;
222 err |= __get_user(regs->cp0_epc, &sc->sc_pc);
223 err |= __get_user(regs->hi, &sc->sc_mdhi);
224 err |= __get_user(regs->lo, &sc->sc_mdlo);
226 err |= __get_user(treg, &sc->sc_hi1); mthi1(treg);
227 err |= __get_user(treg, &sc->sc_lo1); mtlo1(treg);
228 err |= __get_user(treg, &sc->sc_hi2); mthi2(treg);
229 err |= __get_user(treg, &sc->sc_lo2); mtlo2(treg);
230 err |= __get_user(treg, &sc->sc_hi3); mthi3(treg);
231 err |= __get_user(treg, &sc->sc_lo3); mtlo3(treg);
232 err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
235 for (i = 1; i < 32; i++)
236 err |= __get_user(regs->regs[i], &sc->sc_regs[i]);
238 err |= __get_user(used_math, &sc->sc_used_math);
239 conditional_used_math(used_math);
244 /* restore fpu context if we have used it before */
246 err |= restore_fp_context32(sc);
248 /* signal handler may have used FPU. Give it up. */
260 extern void __put_sigset_unknown_nsig(void);
261 extern void __get_sigset_unknown_nsig(void);
263 static inline int put_sigset(const sigset_t *kbuf, compat_sigset_t __user *ubuf)
267 if (!access_ok(VERIFY_WRITE, ubuf, sizeof(*ubuf)))
270 switch (_NSIG_WORDS) {
272 __put_sigset_unknown_nsig();
274 err |= __put_user (kbuf->sig[1] >> 32, &ubuf->sig[3]);
275 err |= __put_user (kbuf->sig[1] & 0xffffffff, &ubuf->sig[2]);
277 err |= __put_user (kbuf->sig[0] >> 32, &ubuf->sig[1]);
278 err |= __put_user (kbuf->sig[0] & 0xffffffff, &ubuf->sig[0]);
284 static inline int get_sigset(sigset_t *kbuf, const compat_sigset_t __user *ubuf)
287 unsigned long sig[4];
289 if (!access_ok(VERIFY_READ, ubuf, sizeof(*ubuf)))
292 switch (_NSIG_WORDS) {
294 __get_sigset_unknown_nsig();
296 err |= __get_user (sig[3], &ubuf->sig[3]);
297 err |= __get_user (sig[2], &ubuf->sig[2]);
298 kbuf->sig[1] = sig[2] | (sig[3] << 32);
300 err |= __get_user (sig[1], &ubuf->sig[1]);
301 err |= __get_user (sig[0], &ubuf->sig[0]);
302 kbuf->sig[0] = sig[0] | (sig[1] << 32);
309 * Atomically swap in the new signal mask, and wait for a signal.
312 save_static_function(sys32_sigsuspend);
313 __attribute_used__ noinline static int
314 _sys32_sigsuspend(nabi_no_regargs struct pt_regs regs)
316 compat_sigset_t __user *uset;
319 uset = (compat_sigset_t __user *) regs.regs[4];
320 if (get_sigset(&newset, uset))
322 sigdelsetmask(&newset, ~_BLOCKABLE);
324 spin_lock_irq(¤t->sighand->siglock);
325 current->saved_sigmask = current->blocked;
326 current->blocked = newset;
328 spin_unlock_irq(¤t->sighand->siglock);
330 current->state = TASK_INTERRUPTIBLE;
332 set_thread_flag(TIF_RESTORE_SIGMASK);
333 return -ERESTARTNOHAND;
336 save_static_function(sys32_rt_sigsuspend);
337 __attribute_used__ noinline static int
338 _sys32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
340 compat_sigset_t __user *uset;
344 /* XXX Don't preclude handling different sized sigset_t's. */
345 sigsetsize = regs.regs[5];
346 if (sigsetsize != sizeof(compat_sigset_t))
349 uset = (compat_sigset_t __user *) regs.regs[4];
350 if (get_sigset(&newset, uset))
352 sigdelsetmask(&newset, ~_BLOCKABLE);
354 spin_lock_irq(¤t->sighand->siglock);
355 current->saved_sigmask = current->blocked;
356 current->blocked = newset;
358 spin_unlock_irq(¤t->sighand->siglock);
360 current->state = TASK_INTERRUPTIBLE;
362 set_thread_flag(TIF_RESTORE_SIGMASK);
363 return -ERESTARTNOHAND;
366 asmlinkage int sys32_sigaction(int sig, const struct sigaction32 __user *act,
367 struct sigaction32 __user *oact)
369 struct k_sigaction new_ka, old_ka;
377 if (!access_ok(VERIFY_READ, act, sizeof(*act)))
379 err |= __get_user(handler, &act->sa_handler);
380 new_ka.sa.sa_handler = (void __user *)(s64)handler;
381 err |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
382 err |= __get_user(mask, &act->sa_mask.sig[0]);
386 siginitset(&new_ka.sa.sa_mask, mask);
389 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
392 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)))
394 err |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
395 err |= __put_user((u32)(u64)old_ka.sa.sa_handler,
397 err |= __put_user(old_ka.sa.sa_mask.sig[0], oact->sa_mask.sig);
398 err |= __put_user(0, &oact->sa_mask.sig[1]);
399 err |= __put_user(0, &oact->sa_mask.sig[2]);
400 err |= __put_user(0, &oact->sa_mask.sig[3]);
408 asmlinkage int sys32_sigaltstack(nabi_no_regargs struct pt_regs regs)
410 const stack32_t __user *uss = (const stack32_t __user *) regs.regs[4];
411 stack32_t __user *uoss = (stack32_t __user *) regs.regs[5];
412 unsigned long usp = regs.regs[29];
415 mm_segment_t old_fs = get_fs();
419 if (!access_ok(VERIFY_READ, uss, sizeof(*uss)))
421 err |= __get_user(sp, &uss->ss_sp);
422 kss.ss_sp = (void __user *) (long) sp;
423 err |= __get_user(kss.ss_size, &uss->ss_size);
424 err |= __get_user(kss.ss_flags, &uss->ss_flags);
430 ret = do_sigaltstack(uss ? (stack_t __user *)&kss : NULL,
431 uoss ? (stack_t __user *)&koss : NULL, usp);
435 if (!access_ok(VERIFY_WRITE, uoss, sizeof(*uoss)))
437 sp = (int) (unsigned long) koss.ss_sp;
438 err |= __put_user(sp, &uoss->ss_sp);
439 err |= __put_user(koss.ss_size, &uoss->ss_size);
440 err |= __put_user(koss.ss_flags, &uoss->ss_flags);
447 int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
451 if (!access_ok (VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
454 /* If you change siginfo_t structure, please be sure
455 this code is fixed accordingly.
456 It should never copy any pad contained in the structure
457 to avoid security leaks, but must copy the generic
458 3 ints plus the relevant union member.
459 This routine must convert siginfo from 64bit to 32bit as well
461 err = __put_user(from->si_signo, &to->si_signo);
462 err |= __put_user(from->si_errno, &to->si_errno);
463 err |= __put_user((short)from->si_code, &to->si_code);
464 if (from->si_code < 0)
465 err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
467 switch (from->si_code >> 16) {
468 case __SI_TIMER >> 16:
469 err |= __put_user(from->si_tid, &to->si_tid);
470 err |= __put_user(from->si_overrun, &to->si_overrun);
471 err |= __put_user(from->si_int, &to->si_int);
473 case __SI_CHLD >> 16:
474 err |= __put_user(from->si_utime, &to->si_utime);
475 err |= __put_user(from->si_stime, &to->si_stime);
476 err |= __put_user(from->si_status, &to->si_status);
478 err |= __put_user(from->si_pid, &to->si_pid);
479 err |= __put_user(from->si_uid, &to->si_uid);
481 case __SI_FAULT >> 16:
482 err |= __put_user((unsigned long)from->si_addr, &to->si_addr);
484 case __SI_POLL >> 16:
485 err |= __put_user(from->si_band, &to->si_band);
486 err |= __put_user(from->si_fd, &to->si_fd);
488 case __SI_RT >> 16: /* This is not generated by the kernel as of now. */
489 case __SI_MESGQ >> 16:
490 err |= __put_user(from->si_pid, &to->si_pid);
491 err |= __put_user(from->si_uid, &to->si_uid);
492 err |= __put_user(from->si_int, &to->si_int);
499 save_static_function(sys32_sigreturn);
500 __attribute_used__ noinline static void
501 _sys32_sigreturn(nabi_no_regargs struct pt_regs regs)
503 struct sigframe __user *frame;
506 frame = (struct sigframe __user *) regs.regs[29];
507 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
509 if (__copy_from_user(&blocked, &frame->sf_mask, sizeof(blocked)))
512 sigdelsetmask(&blocked, ~_BLOCKABLE);
513 spin_lock_irq(¤t->sighand->siglock);
514 current->blocked = blocked;
516 spin_unlock_irq(¤t->sighand->siglock);
518 if (restore_sigcontext32(®s, &frame->sf_sc))
522 * Don't let your children do this ...
524 __asm__ __volatile__(
532 force_sig(SIGSEGV, current);
535 save_static_function(sys32_rt_sigreturn);
536 __attribute_used__ noinline static void
537 _sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
539 struct rt_sigframe32 __user *frame;
545 frame = (struct rt_sigframe32 __user *) regs.regs[29];
546 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
548 if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set)))
551 sigdelsetmask(&set, ~_BLOCKABLE);
552 spin_lock_irq(¤t->sighand->siglock);
553 current->blocked = set;
555 spin_unlock_irq(¤t->sighand->siglock);
557 if (restore_sigcontext32(®s, &frame->rs_uc.uc_mcontext))
560 /* The ucontext contains a stack32_t, so we must convert! */
561 if (__get_user(sp, &frame->rs_uc.uc_stack.ss_sp))
563 st.ss_sp = (void __user *)(long) sp;
564 if (__get_user(st.ss_size, &frame->rs_uc.uc_stack.ss_size))
566 if (__get_user(st.ss_flags, &frame->rs_uc.uc_stack.ss_flags))
569 /* It is more difficult to avoid calling this function than to
570 call it and ignore errors. */
573 do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]);
577 * Don't let your children do this ...
579 __asm__ __volatile__(
587 force_sig(SIGSEGV, current);
590 int setup_frame_32(struct k_sigaction * ka, struct pt_regs *regs,
591 int signr, sigset_t *set)
593 struct sigframe __user *frame;
596 frame = get_sigframe(ka, regs, sizeof(*frame));
597 if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
600 err |= install_sigtramp(frame->sf_code, __NR_O32_sigreturn);
602 err |= setup_sigcontext32(regs, &frame->sf_sc);
603 err |= __copy_to_user(&frame->sf_mask, set, sizeof(*set));
608 * Arguments to signal handler:
611 * a1 = 0 (should be cause)
612 * a2 = pointer to struct sigcontext
614 * $25 and c0_epc point to the signal handler, $29 points to the
617 regs->regs[ 4] = signr;
619 regs->regs[ 6] = (unsigned long) &frame->sf_sc;
620 regs->regs[29] = (unsigned long) frame;
621 regs->regs[31] = (unsigned long) frame->sf_code;
622 regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
624 DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
625 current->comm, current->pid,
626 frame, regs->cp0_epc, regs->regs[31]);
631 force_sigsegv(signr, current);
635 int setup_rt_frame_32(struct k_sigaction * ka, struct pt_regs *regs,
636 int signr, sigset_t *set, siginfo_t *info)
638 struct rt_sigframe32 __user *frame;
642 frame = get_sigframe(ka, regs, sizeof(*frame));
643 if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
646 err |= install_sigtramp(frame->rs_code, __NR_O32_rt_sigreturn);
648 /* Convert (siginfo_t -> compat_siginfo_t) and copy to user. */
649 err |= copy_siginfo_to_user32(&frame->rs_info, info);
651 /* Create the ucontext. */
652 err |= __put_user(0, &frame->rs_uc.uc_flags);
653 err |= __put_user(0, &frame->rs_uc.uc_link);
654 sp = (int) (long) current->sas_ss_sp;
655 err |= __put_user(sp,
656 &frame->rs_uc.uc_stack.ss_sp);
657 err |= __put_user(sas_ss_flags(regs->regs[29]),
658 &frame->rs_uc.uc_stack.ss_flags);
659 err |= __put_user(current->sas_ss_size,
660 &frame->rs_uc.uc_stack.ss_size);
661 err |= setup_sigcontext32(regs, &frame->rs_uc.uc_mcontext);
662 err |= __copy_to_user(&frame->rs_uc.uc_sigmask, set, sizeof(*set));
668 * Arguments to signal handler:
671 * a1 = 0 (should be cause)
672 * a2 = pointer to ucontext
674 * $25 and c0_epc point to the signal handler, $29 points to
675 * the struct rt_sigframe32.
677 regs->regs[ 4] = signr;
678 regs->regs[ 5] = (unsigned long) &frame->rs_info;
679 regs->regs[ 6] = (unsigned long) &frame->rs_uc;
680 regs->regs[29] = (unsigned long) frame;
681 regs->regs[31] = (unsigned long) frame->rs_code;
682 regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
684 DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
685 current->comm, current->pid,
686 frame, regs->cp0_epc, regs->regs[31]);
691 force_sigsegv(signr, current);
695 static inline int handle_signal(unsigned long sig, siginfo_t *info,
696 struct k_sigaction *ka, sigset_t *oldset, struct pt_regs * regs)
700 switch (regs->regs[0]) {
701 case ERESTART_RESTARTBLOCK:
703 regs->regs[2] = EINTR;
706 if (!(ka->sa.sa_flags & SA_RESTART)) {
707 regs->regs[2] = EINTR;
711 case ERESTARTNOINTR: /* Userland will reload $v0. */
712 regs->regs[7] = regs->regs[26];
716 regs->regs[0] = 0; /* Don't deal with this again. */
718 if (ka->sa.sa_flags & SA_SIGINFO)
719 ret = current->thread.abi->setup_rt_frame(ka, regs, sig, oldset, info);
721 ret = current->thread.abi->setup_frame(ka, regs, sig, oldset);
723 spin_lock_irq(¤t->sighand->siglock);
724 sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
725 if (!(ka->sa.sa_flags & SA_NODEFER))
726 sigaddset(¤t->blocked,sig);
728 spin_unlock_irq(¤t->sighand->siglock);
733 void do_signal32(struct pt_regs *regs)
735 struct k_sigaction ka;
741 * We want the common case to go fast, which is why we may in certain
742 * cases get here from kernel mode. Just return without doing anything
745 if (!user_mode(regs))
748 if (test_thread_flag(TIF_RESTORE_SIGMASK))
749 oldset = ¤t->saved_sigmask;
751 oldset = ¤t->blocked;
753 signr = get_signal_to_deliver(&info, &ka, regs, NULL);
755 /* Whee! Actually deliver the signal. */
756 if (handle_signal(signr, &info, &ka, oldset, regs) == 0) {
758 * A signal was successfully delivered; the saved
759 * sigmask will have been stored in the signal frame,
760 * and will be restored by sigreturn, so we can simply
761 * clear the TIF_RESTORE_SIGMASK flag.
763 if (test_thread_flag(TIF_RESTORE_SIGMASK))
764 clear_thread_flag(TIF_RESTORE_SIGMASK);
771 * Who's code doesn't conform to the restartable syscall convention
772 * dies here!!! The li instruction, a single machine instruction,
773 * must directly be followed by the syscall instruction.
776 if (regs->regs[2] == ERESTARTNOHAND ||
777 regs->regs[2] == ERESTARTSYS ||
778 regs->regs[2] == ERESTARTNOINTR) {
779 regs->regs[7] = regs->regs[26];
782 if (regs->regs[2] == ERESTART_RESTARTBLOCK) {
783 regs->regs[2] = __NR_O32_restart_syscall;
784 regs->regs[7] = regs->regs[26];
787 regs->regs[0] = 0; /* Don't deal with this again. */
791 * If there's no signal to deliver, we just put the saved sigmask
794 if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
795 clear_thread_flag(TIF_RESTORE_SIGMASK);
796 sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL);
800 asmlinkage int sys32_rt_sigaction(int sig, const struct sigaction32 __user *act,
801 struct sigaction32 __user *oact,
802 unsigned int sigsetsize)
804 struct k_sigaction new_sa, old_sa;
807 /* XXX: Don't preclude handling different sized sigset_t's. */
808 if (sigsetsize != sizeof(sigset_t))
815 if (!access_ok(VERIFY_READ, act, sizeof(*act)))
817 err |= __get_user(handler, &act->sa_handler);
818 new_sa.sa.sa_handler = (void __user *)(s64)handler;
819 err |= __get_user(new_sa.sa.sa_flags, &act->sa_flags);
820 err |= get_sigset(&new_sa.sa.sa_mask, &act->sa_mask);
825 ret = do_sigaction(sig, act ? &new_sa : NULL, oact ? &old_sa : NULL);
830 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)))
833 err |= __put_user((u32)(u64)old_sa.sa.sa_handler,
835 err |= __put_user(old_sa.sa.sa_flags, &oact->sa_flags);
836 err |= put_sigset(&old_sa.sa.sa_mask, &oact->sa_mask);
844 asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t __user *set,
845 compat_sigset_t __user *oset, unsigned int sigsetsize)
847 sigset_t old_set, new_set;
849 mm_segment_t old_fs = get_fs();
851 if (set && get_sigset(&new_set, set))
855 ret = sys_rt_sigprocmask(how, set ? (sigset_t __user *)&new_set : NULL,
856 oset ? (sigset_t __user *)&old_set : NULL,
860 if (!ret && oset && put_sigset(&old_set, oset))
866 asmlinkage int sys32_rt_sigpending(compat_sigset_t __user *uset,
867 unsigned int sigsetsize)
871 mm_segment_t old_fs = get_fs();
874 ret = sys_rt_sigpending((sigset_t __user *)&set, sigsetsize);
877 if (!ret && put_sigset(&set, uset))
883 asmlinkage int sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo)
887 mm_segment_t old_fs = get_fs();
889 if (copy_from_user (&info, uinfo, 3*sizeof(int)) ||
890 copy_from_user (info._sifields._pad, uinfo->_sifields._pad, SI_PAD_SIZE))
893 ret = sys_rt_sigqueueinfo(pid, sig, (siginfo_t __user *)&info);
899 sys32_waitid(int which, compat_pid_t pid,
900 compat_siginfo_t __user *uinfo, int options,
901 struct compat_rusage __user *uru)
906 mm_segment_t old_fs = get_fs();
910 ret = sys_waitid(which, pid, (siginfo_t __user *) &info, options,
911 uru ? (struct rusage __user *) &ru : NULL);
914 if (ret < 0 || info.si_signo == 0)
917 if (uru && (ret = put_compat_rusage(&ru, uru)))
920 BUG_ON(info.si_code & __SI_MASK);
921 info.si_code |= __SI_CHLD;
922 return copy_siginfo_to_user32(uinfo, &info);