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 Ralf Baechle
8 * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
10 #include <linux/sched.h>
12 #include <linux/smp.h>
13 #include <linux/smp_lock.h>
14 #include <linux/kernel.h>
15 #include <linux/signal.h>
16 #include <linux/syscalls.h>
17 #include <linux/errno.h>
18 #include <linux/wait.h>
19 #include <linux/ptrace.h>
20 #include <linux/compat.h>
21 #include <linux/suspend.h>
22 #include <linux/compiler.h>
25 #include <linux/bitops.h>
26 #include <asm/cacheflush.h>
28 #include <asm/uaccess.h>
29 #include <asm/ucontext.h>
30 #include <asm/system.h>
33 #define SI_PAD_SIZE32 ((SI_MAX_SIZE/sizeof(int)) - 3)
35 typedef union sigval32 {
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 */
88 /* POSIX.1b signals */
90 compat_pid_t _pid; /* sender's pid */
91 compat_uid_t _uid; /* sender's uid */
99 * Including <asm/unistd.h> would give use the 64-bit syscall numbers ...
101 #define __NR_O32_sigreturn 4119
102 #define __NR_O32_rt_sigreturn 4193
103 #define __NR_O32_restart_syscall 4253
107 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
109 extern int do_signal32(sigset_t *oldset, struct pt_regs *regs);
111 /* 32-bit compatibility types */
113 #define _NSIG_BPW32 32
114 #define _NSIG_WORDS32 (_NSIG / _NSIG_BPW32)
117 unsigned int sig[_NSIG_WORDS32];
120 typedef unsigned int __sighandler32_t;
121 typedef void (*vfptr_t)(void);
124 unsigned int sa_flags;
125 __sighandler32_t sa_handler;
126 compat_sigset_t sa_mask;
129 /* IRIX compatible stack_t */
130 typedef struct sigaltstack32 {
132 compat_size_t ss_size;
140 struct sigcontext32 uc_mcontext;
141 sigset_t32 uc_sigmask; /* mask last for extensibility */
144 extern void __put_sigset_unknown_nsig(void);
145 extern void __get_sigset_unknown_nsig(void);
147 static inline int put_sigset(const sigset_t *kbuf, compat_sigset_t *ubuf)
151 if (!access_ok(VERIFY_WRITE, ubuf, sizeof(*ubuf)))
154 switch (_NSIG_WORDS) {
156 __put_sigset_unknown_nsig();
158 err |= __put_user (kbuf->sig[1] >> 32, &ubuf->sig[3]);
159 err |= __put_user (kbuf->sig[1] & 0xffffffff, &ubuf->sig[2]);
161 err |= __put_user (kbuf->sig[0] >> 32, &ubuf->sig[1]);
162 err |= __put_user (kbuf->sig[0] & 0xffffffff, &ubuf->sig[0]);
168 static inline int get_sigset(sigset_t *kbuf, const compat_sigset_t *ubuf)
171 unsigned long sig[4];
173 if (!access_ok(VERIFY_READ, ubuf, sizeof(*ubuf)))
176 switch (_NSIG_WORDS) {
178 __get_sigset_unknown_nsig();
180 err |= __get_user (sig[3], &ubuf->sig[3]);
181 err |= __get_user (sig[2], &ubuf->sig[2]);
182 kbuf->sig[1] = sig[2] | (sig[3] << 32);
184 err |= __get_user (sig[1], &ubuf->sig[1]);
185 err |= __get_user (sig[0], &ubuf->sig[0]);
186 kbuf->sig[0] = sig[0] | (sig[1] << 32);
193 * Atomically swap in the new signal mask, and wait for a signal.
196 save_static_function(sys32_sigsuspend);
197 __attribute_used__ noinline static int
198 _sys32_sigsuspend(nabi_no_regargs struct pt_regs regs)
200 compat_sigset_t *uset;
201 sigset_t newset, saveset;
203 uset = (compat_sigset_t *) regs.regs[4];
204 if (get_sigset(&newset, uset))
206 sigdelsetmask(&newset, ~_BLOCKABLE);
208 spin_lock_irq(¤t->sighand->siglock);
209 saveset = current->blocked;
210 current->blocked = newset;
212 spin_unlock_irq(¤t->sighand->siglock);
214 regs.regs[2] = EINTR;
217 current->state = TASK_INTERRUPTIBLE;
219 if (do_signal32(&saveset, ®s))
224 save_static_function(sys32_rt_sigsuspend);
225 __attribute_used__ noinline static int
226 _sys32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
228 compat_sigset_t *uset;
229 sigset_t newset, saveset;
232 /* XXX Don't preclude handling different sized sigset_t's. */
233 sigsetsize = regs.regs[5];
234 if (sigsetsize != sizeof(compat_sigset_t))
237 uset = (compat_sigset_t *) regs.regs[4];
238 if (get_sigset(&newset, uset))
240 sigdelsetmask(&newset, ~_BLOCKABLE);
242 spin_lock_irq(¤t->sighand->siglock);
243 saveset = current->blocked;
244 current->blocked = newset;
246 spin_unlock_irq(¤t->sighand->siglock);
248 regs.regs[2] = EINTR;
251 current->state = TASK_INTERRUPTIBLE;
253 if (do_signal32(&saveset, ®s))
258 asmlinkage int sys32_sigaction(int sig, const struct sigaction32 *act,
259 struct sigaction32 *oact)
261 struct k_sigaction new_ka, old_ka;
268 if (!access_ok(VERIFY_READ, act, sizeof(*act)))
270 err |= __get_user((u32)(u64)new_ka.sa.sa_handler,
272 err |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
273 err |= __get_user(mask, &act->sa_mask.sig[0]);
277 siginitset(&new_ka.sa.sa_mask, mask);
280 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
283 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)))
285 err |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
286 err |= __put_user((u32)(u64)old_ka.sa.sa_handler,
288 err |= __put_user(old_ka.sa.sa_mask.sig[0], oact->sa_mask.sig);
289 err |= __put_user(0, &oact->sa_mask.sig[1]);
290 err |= __put_user(0, &oact->sa_mask.sig[2]);
291 err |= __put_user(0, &oact->sa_mask.sig[3]);
299 asmlinkage int sys32_sigaltstack(nabi_no_regargs struct pt_regs regs)
301 const stack32_t *uss = (const stack32_t *) regs.regs[4];
302 stack32_t *uoss = (stack32_t *) regs.regs[5];
303 unsigned long usp = regs.regs[29];
306 mm_segment_t old_fs = get_fs();
310 if (!access_ok(VERIFY_READ, uss, sizeof(*uss)))
312 err |= __get_user(sp, &uss->ss_sp);
313 kss.ss_sp = (void *) (long) sp;
314 err |= __get_user(kss.ss_size, &uss->ss_size);
315 err |= __get_user(kss.ss_flags, &uss->ss_flags);
321 ret = do_sigaltstack(uss ? &kss : NULL , uoss ? &koss : NULL, usp);
325 if (!access_ok(VERIFY_WRITE, uoss, sizeof(*uoss)))
327 sp = (int) (long) koss.ss_sp;
328 err |= __put_user(sp, &uoss->ss_sp);
329 err |= __put_user(koss.ss_size, &uoss->ss_size);
330 err |= __put_user(koss.ss_flags, &uoss->ss_flags);
337 static int restore_sigcontext32(struct pt_regs *regs, struct sigcontext32 *sc)
342 /* Always make any pending restarted system calls return -EINTR */
343 current_thread_info()->restart_block.fn = do_no_restart_syscall;
345 err |= __get_user(regs->cp0_epc, &sc->sc_pc);
346 err |= __get_user(regs->hi, &sc->sc_mdhi);
347 err |= __get_user(regs->lo, &sc->sc_mdlo);
349 #define restore_gp_reg(i) do { \
350 err |= __get_user(regs->regs[i], &sc->sc_regs[i]); \
352 restore_gp_reg( 1); restore_gp_reg( 2); restore_gp_reg( 3);
353 restore_gp_reg( 4); restore_gp_reg( 5); restore_gp_reg( 6);
354 restore_gp_reg( 7); restore_gp_reg( 8); restore_gp_reg( 9);
355 restore_gp_reg(10); restore_gp_reg(11); restore_gp_reg(12);
356 restore_gp_reg(13); restore_gp_reg(14); restore_gp_reg(15);
357 restore_gp_reg(16); restore_gp_reg(17); restore_gp_reg(18);
358 restore_gp_reg(19); restore_gp_reg(20); restore_gp_reg(21);
359 restore_gp_reg(22); restore_gp_reg(23); restore_gp_reg(24);
360 restore_gp_reg(25); restore_gp_reg(26); restore_gp_reg(27);
361 restore_gp_reg(28); restore_gp_reg(29); restore_gp_reg(30);
363 #undef restore_gp_reg
365 err |= __get_user(used_math, &sc->sc_used_math);
366 conditional_used_math(used_math);
371 /* restore fpu context if we have used it before */
373 err |= restore_fp_context32(sc);
375 /* signal handler may have used FPU. Give it up. */
385 u32 sf_ass[4]; /* argument save space for o32 */
386 u32 sf_code[2]; /* signal trampoline */
387 struct sigcontext32 sf_sc;
391 struct rt_sigframe32 {
392 u32 rs_ass[4]; /* argument save space for o32 */
393 u32 rs_code[2]; /* signal trampoline */
394 compat_siginfo_t rs_info;
395 struct ucontext32 rs_uc;
398 int copy_siginfo_to_user32(compat_siginfo_t *to, siginfo_t *from)
402 if (!access_ok (VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
405 /* If you change siginfo_t structure, please be sure
406 this code is fixed accordingly.
407 It should never copy any pad contained in the structure
408 to avoid security leaks, but must copy the generic
409 3 ints plus the relevant union member.
410 This routine must convert siginfo from 64bit to 32bit as well
412 err = __put_user(from->si_signo, &to->si_signo);
413 err |= __put_user(from->si_errno, &to->si_errno);
414 err |= __put_user((short)from->si_code, &to->si_code);
415 if (from->si_code < 0)
416 err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
418 switch (from->si_code >> 16) {
419 case __SI_CHLD >> 16:
420 err |= __put_user(from->si_utime, &to->si_utime);
421 err |= __put_user(from->si_stime, &to->si_stime);
422 err |= __put_user(from->si_status, &to->si_status);
424 err |= __put_user(from->si_pid, &to->si_pid);
425 err |= __put_user(from->si_uid, &to->si_uid);
427 case __SI_FAULT >> 16:
428 err |= __put_user((long)from->si_addr, &to->si_addr);
430 case __SI_POLL >> 16:
431 err |= __put_user(from->si_band, &to->si_band);
432 err |= __put_user(from->si_fd, &to->si_fd);
434 case __SI_RT >> 16: /* This is not generated by the kernel as of now. */
435 case __SI_MESGQ >> 16:
436 err |= __put_user(from->si_pid, &to->si_pid);
437 err |= __put_user(from->si_uid, &to->si_uid);
438 err |= __put_user(from->si_int, &to->si_int);
445 save_static_function(sys32_sigreturn);
446 __attribute_used__ noinline static void
447 _sys32_sigreturn(nabi_no_regargs struct pt_regs regs)
449 struct sigframe *frame;
452 frame = (struct sigframe *) regs.regs[29];
453 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
455 if (__copy_from_user(&blocked, &frame->sf_mask, sizeof(blocked)))
458 sigdelsetmask(&blocked, ~_BLOCKABLE);
459 spin_lock_irq(¤t->sighand->siglock);
460 current->blocked = blocked;
462 spin_unlock_irq(¤t->sighand->siglock);
464 if (restore_sigcontext32(®s, &frame->sf_sc))
468 * Don't let your children do this ...
470 if (current_thread_info()->flags & TIF_SYSCALL_TRACE)
471 do_syscall_trace(®s, 1);
472 __asm__ __volatile__(
480 force_sig(SIGSEGV, current);
483 save_static_function(sys32_rt_sigreturn);
484 __attribute_used__ noinline static void
485 _sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
487 struct rt_sigframe32 *frame;
492 frame = (struct rt_sigframe32 *) regs.regs[29];
493 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
495 if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set)))
498 sigdelsetmask(&set, ~_BLOCKABLE);
499 spin_lock_irq(¤t->sighand->siglock);
500 current->blocked = set;
502 spin_unlock_irq(¤t->sighand->siglock);
504 if (restore_sigcontext32(®s, &frame->rs_uc.uc_mcontext))
507 /* The ucontext contains a stack32_t, so we must convert! */
508 if (__get_user(sp, &frame->rs_uc.uc_stack.ss_sp))
510 st.ss_size = (long) sp;
511 if (__get_user(st.ss_size, &frame->rs_uc.uc_stack.ss_size))
513 if (__get_user(st.ss_flags, &frame->rs_uc.uc_stack.ss_flags))
516 /* It is more difficult to avoid calling this function than to
517 call it and ignore errors. */
518 do_sigaltstack(&st, NULL, regs.regs[29]);
521 * Don't let your children do this ...
523 __asm__ __volatile__(
531 force_sig(SIGSEGV, current);
534 static inline int setup_sigcontext32(struct pt_regs *regs,
535 struct sigcontext32 *sc)
539 err |= __put_user(regs->cp0_epc, &sc->sc_pc);
540 err |= __put_user(regs->cp0_status, &sc->sc_status);
542 #define save_gp_reg(i) { \
543 err |= __put_user(regs->regs[i], &sc->sc_regs[i]); \
545 __put_user(0, &sc->sc_regs[0]); save_gp_reg(1); save_gp_reg(2);
546 save_gp_reg(3); save_gp_reg(4); save_gp_reg(5); save_gp_reg(6);
547 save_gp_reg(7); save_gp_reg(8); save_gp_reg(9); save_gp_reg(10);
548 save_gp_reg(11); save_gp_reg(12); save_gp_reg(13); save_gp_reg(14);
549 save_gp_reg(15); save_gp_reg(16); save_gp_reg(17); save_gp_reg(18);
550 save_gp_reg(19); save_gp_reg(20); save_gp_reg(21); save_gp_reg(22);
551 save_gp_reg(23); save_gp_reg(24); save_gp_reg(25); save_gp_reg(26);
552 save_gp_reg(27); save_gp_reg(28); save_gp_reg(29); save_gp_reg(30);
556 err |= __put_user(regs->hi, &sc->sc_mdhi);
557 err |= __put_user(regs->lo, &sc->sc_mdlo);
558 err |= __put_user(regs->cp0_cause, &sc->sc_cause);
559 err |= __put_user(regs->cp0_badvaddr, &sc->sc_badvaddr);
561 err |= __put_user(!!used_math(), &sc->sc_used_math);
567 * Save FPU state to signal context. Signal handler will "inherit"
572 if (!is_fpu_owner()) {
576 err |= save_fp_context32(sc);
585 * Determine which stack to use..
587 static inline void *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
592 /* Default to using normal stack */
596 * FPU emulator may have it's own trampoline active just
597 * above the user stack, 16-bytes before the next lowest
598 * 16 byte boundary. Try to avoid trashing it.
602 /* This is the X/Open sanctioned signal stack switching. */
603 if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags (sp) == 0))
604 sp = current->sas_ss_sp + current->sas_ss_size;
606 return (void *)((sp - frame_size) & ALMASK);
609 static inline void setup_frame(struct k_sigaction * ka, struct pt_regs *regs,
610 int signr, sigset_t *set)
612 struct sigframe *frame;
615 frame = get_sigframe(ka, regs, sizeof(*frame));
616 if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
620 * Set up the return code ...
622 * li v0, __NR_O32_sigreturn
625 err |= __put_user(0x24020000 + __NR_O32_sigreturn, frame->sf_code + 0);
626 err |= __put_user(0x0000000c , frame->sf_code + 1);
627 flush_cache_sigtramp((unsigned long) frame->sf_code);
629 err |= setup_sigcontext32(regs, &frame->sf_sc);
630 err |= __copy_to_user(&frame->sf_mask, set, sizeof(*set));
635 * Arguments to signal handler:
638 * a1 = 0 (should be cause)
639 * a2 = pointer to struct sigcontext
641 * $25 and c0_epc point to the signal handler, $29 points to the
644 regs->regs[ 4] = signr;
646 regs->regs[ 6] = (unsigned long) &frame->sf_sc;
647 regs->regs[29] = (unsigned long) frame;
648 regs->regs[31] = (unsigned long) frame->sf_code;
649 regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
652 printk("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%p\n",
653 current->comm, current->pid,
654 frame, regs->cp0_epc, frame->sf_code);
659 force_sigsegv(signr, current);
662 static inline void setup_rt_frame(struct k_sigaction * ka,
663 struct pt_regs *regs, int signr,
664 sigset_t *set, siginfo_t *info)
666 struct rt_sigframe32 *frame;
670 frame = get_sigframe(ka, regs, sizeof(*frame));
671 if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
674 /* Set up to return from userspace. If provided, use a stub already
677 * Set up the return code ...
679 * li v0, __NR_O32_rt_sigreturn
682 err |= __put_user(0x24020000 + __NR_O32_rt_sigreturn, frame->rs_code + 0);
683 err |= __put_user(0x0000000c , frame->rs_code + 1);
684 flush_cache_sigtramp((unsigned long) frame->rs_code);
686 /* Convert (siginfo_t -> compat_siginfo_t) and copy to user. */
687 err |= copy_siginfo_to_user32(&frame->rs_info, info);
689 /* Create the ucontext. */
690 err |= __put_user(0, &frame->rs_uc.uc_flags);
691 err |= __put_user(0, &frame->rs_uc.uc_link);
692 sp = (int) (long) current->sas_ss_sp;
693 err |= __put_user(sp,
694 &frame->rs_uc.uc_stack.ss_sp);
695 err |= __put_user(sas_ss_flags(regs->regs[29]),
696 &frame->rs_uc.uc_stack.ss_flags);
697 err |= __put_user(current->sas_ss_size,
698 &frame->rs_uc.uc_stack.ss_size);
699 err |= setup_sigcontext32(regs, &frame->rs_uc.uc_mcontext);
700 err |= __copy_to_user(&frame->rs_uc.uc_sigmask, set, sizeof(*set));
706 * Arguments to signal handler:
709 * a1 = 0 (should be cause)
710 * a2 = pointer to ucontext
712 * $25 and c0_epc point to the signal handler, $29 points to
713 * the struct rt_sigframe32.
715 regs->regs[ 4] = signr;
716 regs->regs[ 5] = (unsigned long) &frame->rs_info;
717 regs->regs[ 6] = (unsigned long) &frame->rs_uc;
718 regs->regs[29] = (unsigned long) frame;
719 regs->regs[31] = (unsigned long) frame->rs_code;
720 regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
723 printk("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%p\n",
724 current->comm, current->pid,
725 frame, regs->cp0_epc, frame->rs_code);
730 force_sigsegv(signr, current);
733 static inline void handle_signal(unsigned long sig, siginfo_t *info,
734 struct k_sigaction *ka, sigset_t *oldset, struct pt_regs * regs)
736 switch (regs->regs[0]) {
737 case ERESTART_RESTARTBLOCK:
739 regs->regs[2] = EINTR;
742 if(!(ka->sa.sa_flags & SA_RESTART)) {
743 regs->regs[2] = EINTR;
747 case ERESTARTNOINTR: /* Userland will reload $v0. */
748 regs->regs[7] = regs->regs[26];
752 regs->regs[0] = 0; /* Don't deal with this again. */
754 if (ka->sa.sa_flags & SA_SIGINFO)
755 setup_rt_frame(ka, regs, sig, oldset, info);
757 setup_frame(ka, regs, sig, oldset);
759 if (!(ka->sa.sa_flags & SA_NODEFER)) {
760 spin_lock_irq(¤t->sighand->siglock);
761 sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
762 sigaddset(¤t->blocked,sig);
764 spin_unlock_irq(¤t->sighand->siglock);
768 int do_signal32(sigset_t *oldset, struct pt_regs *regs)
770 struct k_sigaction ka;
775 * We want the common case to go fast, which is why we may in certain
776 * cases get here from kernel mode. Just return without doing anything
779 if (!user_mode(regs))
782 if (try_to_freeze(0))
786 oldset = ¤t->blocked;
788 signr = get_signal_to_deliver(&info, &ka, regs, NULL);
790 handle_signal(signr, &info, &ka, oldset, regs);
796 * Who's code doesn't conform to the restartable syscall convention
797 * dies here!!! The li instruction, a single machine instruction,
798 * must directly be followed by the syscall instruction.
801 if (regs->regs[2] == ERESTARTNOHAND ||
802 regs->regs[2] == ERESTARTSYS ||
803 regs->regs[2] == ERESTARTNOINTR) {
804 regs->regs[7] = regs->regs[26];
807 if (regs->regs[2] == ERESTART_RESTARTBLOCK) {
808 regs->regs[2] = __NR_O32_restart_syscall;
809 regs->regs[7] = regs->regs[26];
816 asmlinkage int sys32_rt_sigaction(int sig, const struct sigaction32 *act,
817 struct sigaction32 *oact,
818 unsigned int sigsetsize)
820 struct k_sigaction new_sa, old_sa;
823 /* XXX: Don't preclude handling different sized sigset_t's. */
824 if (sigsetsize != sizeof(sigset_t))
830 if (!access_ok(VERIFY_READ, act, sizeof(*act)))
832 err |= __get_user((u32)(u64)new_sa.sa.sa_handler,
834 err |= __get_user(new_sa.sa.sa_flags, &act->sa_flags);
835 err |= get_sigset(&new_sa.sa.sa_mask, &act->sa_mask);
840 ret = do_sigaction(sig, act ? &new_sa : NULL, oact ? &old_sa : NULL);
845 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)))
848 err |= __put_user((u32)(u64)old_sa.sa.sa_handler,
850 err |= __put_user(old_sa.sa.sa_flags, &oact->sa_flags);
851 err |= put_sigset(&old_sa.sa.sa_mask, &oact->sa_mask);
859 asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t *set,
860 compat_sigset_t *oset, unsigned int sigsetsize)
862 sigset_t old_set, new_set;
864 mm_segment_t old_fs = get_fs();
866 if (set && get_sigset(&new_set, set))
870 ret = sys_rt_sigprocmask(how, set ? &new_set : NULL,
871 oset ? &old_set : NULL, sigsetsize);
874 if (!ret && oset && put_sigset(&old_set, oset))
880 asmlinkage int sys32_rt_sigpending(compat_sigset_t *uset,
881 unsigned int sigsetsize)
885 mm_segment_t old_fs = get_fs();
888 ret = sys_rt_sigpending(&set, sigsetsize);
891 if (!ret && put_sigset(&set, uset))
897 asmlinkage int sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t *uinfo)
901 mm_segment_t old_fs = get_fs();
903 if (copy_from_user (&info, uinfo, 3*sizeof(int)) ||
904 copy_from_user (info._sifields._pad, uinfo->_sifields._pad, SI_PAD_SIZE))
907 ret = sys_rt_sigqueueinfo(pid, sig, &info);