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 struct compat_siginfo {
41 int _pad[SI_PAD_SIZE32];
45 compat_pid_t _pid; /* sender's pid */
46 compat_uid_t _uid; /* sender's uid */
51 compat_pid_t _pid; /* which child */
52 compat_uid_t _uid; /* sender's uid */
53 int _status; /* exit code */
54 compat_clock_t _utime;
55 compat_clock_t _stime;
60 compat_pid_t _pid; /* which child */
61 compat_clock_t _utime;
62 int _status; /* exit code */
63 compat_clock_t _stime;
66 /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
68 s32 _addr; /* faulting insn/memory ref. */
71 /* SIGPOLL, SIGXFSZ (To do ...) */
73 int _band; /* POLL_IN, POLL_OUT, POLL_MSG */
79 timer_t _tid; /* timer id */
80 int _overrun; /* overrun count */
81 sigval_t32 _sigval; /* same as below */
82 int _sys_private; /* not to be passed to user */
85 /* POSIX.1b signals */
87 compat_pid_t _pid; /* sender's pid */
88 compat_uid_t _uid; /* sender's uid */
89 compat_sigval_t _sigval;
96 * Including <asm/unistd.h> would give use the 64-bit syscall numbers ...
98 #define __NR_O32_sigreturn 4119
99 #define __NR_O32_rt_sigreturn 4193
100 #define __NR_O32_restart_syscall 4253
104 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
106 extern int do_signal32(sigset_t *oldset, struct pt_regs *regs);
108 /* 32-bit compatibility types */
110 #define _NSIG_BPW32 32
111 #define _NSIG_WORDS32 (_NSIG / _NSIG_BPW32)
114 unsigned int sig[_NSIG_WORDS32];
117 typedef unsigned int __sighandler32_t;
118 typedef void (*vfptr_t)(void);
121 unsigned int sa_flags;
122 __sighandler32_t sa_handler;
123 compat_sigset_t sa_mask;
126 /* IRIX compatible stack_t */
127 typedef struct sigaltstack32 {
129 compat_size_t ss_size;
137 struct sigcontext32 uc_mcontext;
138 sigset_t32 uc_sigmask; /* mask last for extensibility */
141 extern void __put_sigset_unknown_nsig(void);
142 extern void __get_sigset_unknown_nsig(void);
144 static inline int put_sigset(const sigset_t *kbuf, compat_sigset_t *ubuf)
148 if (!access_ok(VERIFY_WRITE, ubuf, sizeof(*ubuf)))
151 switch (_NSIG_WORDS) {
153 __put_sigset_unknown_nsig();
155 err |= __put_user (kbuf->sig[1] >> 32, &ubuf->sig[3]);
156 err |= __put_user (kbuf->sig[1] & 0xffffffff, &ubuf->sig[2]);
158 err |= __put_user (kbuf->sig[0] >> 32, &ubuf->sig[1]);
159 err |= __put_user (kbuf->sig[0] & 0xffffffff, &ubuf->sig[0]);
165 static inline int get_sigset(sigset_t *kbuf, const compat_sigset_t *ubuf)
168 unsigned long sig[4];
170 if (!access_ok(VERIFY_READ, ubuf, sizeof(*ubuf)))
173 switch (_NSIG_WORDS) {
175 __get_sigset_unknown_nsig();
177 err |= __get_user (sig[3], &ubuf->sig[3]);
178 err |= __get_user (sig[2], &ubuf->sig[2]);
179 kbuf->sig[1] = sig[2] | (sig[3] << 32);
181 err |= __get_user (sig[1], &ubuf->sig[1]);
182 err |= __get_user (sig[0], &ubuf->sig[0]);
183 kbuf->sig[0] = sig[0] | (sig[1] << 32);
190 * Atomically swap in the new signal mask, and wait for a signal.
193 save_static_function(sys32_sigsuspend);
194 __attribute_used__ noinline static int
195 _sys32_sigsuspend(nabi_no_regargs struct pt_regs regs)
197 compat_sigset_t *uset;
198 sigset_t newset, saveset;
200 uset = (compat_sigset_t *) regs.regs[4];
201 if (get_sigset(&newset, uset))
203 sigdelsetmask(&newset, ~_BLOCKABLE);
205 spin_lock_irq(¤t->sighand->siglock);
206 saveset = current->blocked;
207 current->blocked = newset;
209 spin_unlock_irq(¤t->sighand->siglock);
211 regs.regs[2] = EINTR;
214 current->state = TASK_INTERRUPTIBLE;
216 if (do_signal32(&saveset, ®s))
221 save_static_function(sys32_rt_sigsuspend);
222 __attribute_used__ noinline static int
223 _sys32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
225 compat_sigset_t *uset;
226 sigset_t newset, saveset;
229 /* XXX Don't preclude handling different sized sigset_t's. */
230 sigsetsize = regs.regs[5];
231 if (sigsetsize != sizeof(compat_sigset_t))
234 uset = (compat_sigset_t *) regs.regs[4];
235 if (get_sigset(&newset, uset))
237 sigdelsetmask(&newset, ~_BLOCKABLE);
239 spin_lock_irq(¤t->sighand->siglock);
240 saveset = current->blocked;
241 current->blocked = newset;
243 spin_unlock_irq(¤t->sighand->siglock);
245 regs.regs[2] = EINTR;
248 current->state = TASK_INTERRUPTIBLE;
250 if (do_signal32(&saveset, ®s))
255 asmlinkage int sys32_sigaction(int sig, const struct sigaction32 *act,
256 struct sigaction32 *oact)
258 struct k_sigaction new_ka, old_ka;
265 if (!access_ok(VERIFY_READ, act, sizeof(*act)))
267 err |= __get_user((u32)(u64)new_ka.sa.sa_handler,
269 err |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
270 err |= __get_user(mask, &act->sa_mask.sig[0]);
274 siginitset(&new_ka.sa.sa_mask, mask);
277 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
280 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)))
282 err |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
283 err |= __put_user((u32)(u64)old_ka.sa.sa_handler,
285 err |= __put_user(old_ka.sa.sa_mask.sig[0], oact->sa_mask.sig);
286 err |= __put_user(0, &oact->sa_mask.sig[1]);
287 err |= __put_user(0, &oact->sa_mask.sig[2]);
288 err |= __put_user(0, &oact->sa_mask.sig[3]);
296 asmlinkage int sys32_sigaltstack(nabi_no_regargs struct pt_regs regs)
298 const stack32_t *uss = (const stack32_t *) regs.regs[4];
299 stack32_t *uoss = (stack32_t *) regs.regs[5];
300 unsigned long usp = regs.regs[29];
303 mm_segment_t old_fs = get_fs();
307 if (!access_ok(VERIFY_READ, uss, sizeof(*uss)))
309 err |= __get_user(sp, &uss->ss_sp);
310 kss.ss_sp = (void *) (long) sp;
311 err |= __get_user(kss.ss_size, &uss->ss_size);
312 err |= __get_user(kss.ss_flags, &uss->ss_flags);
318 ret = do_sigaltstack(uss ? &kss : NULL , uoss ? &koss : NULL, usp);
322 if (!access_ok(VERIFY_WRITE, uoss, sizeof(*uoss)))
324 sp = (int) (long) koss.ss_sp;
325 err |= __put_user(sp, &uoss->ss_sp);
326 err |= __put_user(koss.ss_size, &uoss->ss_size);
327 err |= __put_user(koss.ss_flags, &uoss->ss_flags);
334 static int restore_sigcontext32(struct pt_regs *regs, struct sigcontext32 *sc)
339 /* Always make any pending restarted system calls return -EINTR */
340 current_thread_info()->restart_block.fn = do_no_restart_syscall;
342 err |= __get_user(regs->cp0_epc, &sc->sc_pc);
343 err |= __get_user(regs->hi, &sc->sc_mdhi);
344 err |= __get_user(regs->lo, &sc->sc_mdlo);
346 #define restore_gp_reg(i) do { \
347 err |= __get_user(regs->regs[i], &sc->sc_regs[i]); \
349 restore_gp_reg( 1); restore_gp_reg( 2); restore_gp_reg( 3);
350 restore_gp_reg( 4); restore_gp_reg( 5); restore_gp_reg( 6);
351 restore_gp_reg( 7); restore_gp_reg( 8); restore_gp_reg( 9);
352 restore_gp_reg(10); restore_gp_reg(11); restore_gp_reg(12);
353 restore_gp_reg(13); restore_gp_reg(14); restore_gp_reg(15);
354 restore_gp_reg(16); restore_gp_reg(17); restore_gp_reg(18);
355 restore_gp_reg(19); restore_gp_reg(20); restore_gp_reg(21);
356 restore_gp_reg(22); restore_gp_reg(23); restore_gp_reg(24);
357 restore_gp_reg(25); restore_gp_reg(26); restore_gp_reg(27);
358 restore_gp_reg(28); restore_gp_reg(29); restore_gp_reg(30);
360 #undef restore_gp_reg
362 err |= __get_user(used_math, &sc->sc_used_math);
363 conditional_used_math(used_math);
368 /* restore fpu context if we have used it before */
370 err |= restore_fp_context32(sc);
372 /* signal handler may have used FPU. Give it up. */
382 u32 sf_ass[4]; /* argument save space for o32 */
383 u32 sf_code[2]; /* signal trampoline */
384 struct sigcontext32 sf_sc;
388 struct rt_sigframe32 {
389 u32 rs_ass[4]; /* argument save space for o32 */
390 u32 rs_code[2]; /* signal trampoline */
391 compat_siginfo_t rs_info;
392 struct ucontext32 rs_uc;
395 int copy_siginfo_to_user32(compat_siginfo_t *to, siginfo_t *from)
399 if (!access_ok (VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
402 /* If you change siginfo_t structure, please be sure
403 this code is fixed accordingly.
404 It should never copy any pad contained in the structure
405 to avoid security leaks, but must copy the generic
406 3 ints plus the relevant union member.
407 This routine must convert siginfo from 64bit to 32bit as well
409 err = __put_user(from->si_signo, &to->si_signo);
410 err |= __put_user(from->si_errno, &to->si_errno);
411 err |= __put_user((short)from->si_code, &to->si_code);
412 if (from->si_code < 0)
413 err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
415 switch (from->si_code >> 16) {
416 case __SI_TIMER >> 16:
417 err |= __put_user(from->si_tid, &to->si_tid);
418 err |= __put_user(from->si_overrun, &to->si_overrun);
419 err |= __put_user(from->si_int, &to->si_int);
421 case __SI_CHLD >> 16:
422 err |= __put_user(from->si_utime, &to->si_utime);
423 err |= __put_user(from->si_stime, &to->si_stime);
424 err |= __put_user(from->si_status, &to->si_status);
426 err |= __put_user(from->si_pid, &to->si_pid);
427 err |= __put_user(from->si_uid, &to->si_uid);
429 case __SI_FAULT >> 16:
430 err |= __put_user((long)from->si_addr, &to->si_addr);
432 case __SI_POLL >> 16:
433 err |= __put_user(from->si_band, &to->si_band);
434 err |= __put_user(from->si_fd, &to->si_fd);
436 case __SI_RT >> 16: /* This is not generated by the kernel as of now. */
437 case __SI_MESGQ >> 16:
438 err |= __put_user(from->si_pid, &to->si_pid);
439 err |= __put_user(from->si_uid, &to->si_uid);
440 err |= __put_user(from->si_int, &to->si_int);
447 save_static_function(sys32_sigreturn);
448 __attribute_used__ noinline static void
449 _sys32_sigreturn(nabi_no_regargs struct pt_regs regs)
451 struct sigframe *frame;
454 frame = (struct sigframe *) regs.regs[29];
455 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
457 if (__copy_from_user(&blocked, &frame->sf_mask, sizeof(blocked)))
460 sigdelsetmask(&blocked, ~_BLOCKABLE);
461 spin_lock_irq(¤t->sighand->siglock);
462 current->blocked = blocked;
464 spin_unlock_irq(¤t->sighand->siglock);
466 if (restore_sigcontext32(®s, &frame->sf_sc))
470 * Don't let your children do this ...
472 if (current_thread_info()->flags & TIF_SYSCALL_TRACE)
473 do_syscall_trace(®s, 1);
474 __asm__ __volatile__(
482 force_sig(SIGSEGV, current);
485 save_static_function(sys32_rt_sigreturn);
486 __attribute_used__ noinline static void
487 _sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
489 struct rt_sigframe32 *frame;
494 frame = (struct rt_sigframe32 *) regs.regs[29];
495 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
497 if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set)))
500 sigdelsetmask(&set, ~_BLOCKABLE);
501 spin_lock_irq(¤t->sighand->siglock);
502 current->blocked = set;
504 spin_unlock_irq(¤t->sighand->siglock);
506 if (restore_sigcontext32(®s, &frame->rs_uc.uc_mcontext))
509 /* The ucontext contains a stack32_t, so we must convert! */
510 if (__get_user(sp, &frame->rs_uc.uc_stack.ss_sp))
512 st.ss_size = (long) sp;
513 if (__get_user(st.ss_size, &frame->rs_uc.uc_stack.ss_size))
515 if (__get_user(st.ss_flags, &frame->rs_uc.uc_stack.ss_flags))
518 /* It is more difficult to avoid calling this function than to
519 call it and ignore errors. */
520 do_sigaltstack(&st, NULL, regs.regs[29]);
523 * Don't let your children do this ...
525 __asm__ __volatile__(
533 force_sig(SIGSEGV, current);
536 static inline int setup_sigcontext32(struct pt_regs *regs,
537 struct sigcontext32 *sc)
541 err |= __put_user(regs->cp0_epc, &sc->sc_pc);
542 err |= __put_user(regs->cp0_status, &sc->sc_status);
544 #define save_gp_reg(i) { \
545 err |= __put_user(regs->regs[i], &sc->sc_regs[i]); \
547 __put_user(0, &sc->sc_regs[0]); save_gp_reg(1); save_gp_reg(2);
548 save_gp_reg(3); save_gp_reg(4); save_gp_reg(5); save_gp_reg(6);
549 save_gp_reg(7); save_gp_reg(8); save_gp_reg(9); save_gp_reg(10);
550 save_gp_reg(11); save_gp_reg(12); save_gp_reg(13); save_gp_reg(14);
551 save_gp_reg(15); save_gp_reg(16); save_gp_reg(17); save_gp_reg(18);
552 save_gp_reg(19); save_gp_reg(20); save_gp_reg(21); save_gp_reg(22);
553 save_gp_reg(23); save_gp_reg(24); save_gp_reg(25); save_gp_reg(26);
554 save_gp_reg(27); save_gp_reg(28); save_gp_reg(29); save_gp_reg(30);
558 err |= __put_user(regs->hi, &sc->sc_mdhi);
559 err |= __put_user(regs->lo, &sc->sc_mdlo);
560 err |= __put_user(regs->cp0_cause, &sc->sc_cause);
561 err |= __put_user(regs->cp0_badvaddr, &sc->sc_badvaddr);
563 err |= __put_user(!!used_math(), &sc->sc_used_math);
569 * Save FPU state to signal context. Signal handler will "inherit"
574 if (!is_fpu_owner()) {
578 err |= save_fp_context32(sc);
587 * Determine which stack to use..
589 static inline void *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
594 /* Default to using normal stack */
598 * FPU emulator may have it's own trampoline active just
599 * above the user stack, 16-bytes before the next lowest
600 * 16 byte boundary. Try to avoid trashing it.
604 /* This is the X/Open sanctioned signal stack switching. */
605 if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags (sp) == 0))
606 sp = current->sas_ss_sp + current->sas_ss_size;
608 return (void *)((sp - frame_size) & ALMASK);
611 static inline void setup_frame(struct k_sigaction * ka, struct pt_regs *regs,
612 int signr, sigset_t *set)
614 struct sigframe *frame;
617 frame = get_sigframe(ka, regs, sizeof(*frame));
618 if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
622 * Set up the return code ...
624 * li v0, __NR_O32_sigreturn
627 err |= __put_user(0x24020000 + __NR_O32_sigreturn, frame->sf_code + 0);
628 err |= __put_user(0x0000000c , frame->sf_code + 1);
629 flush_cache_sigtramp((unsigned long) frame->sf_code);
631 err |= setup_sigcontext32(regs, &frame->sf_sc);
632 err |= __copy_to_user(&frame->sf_mask, set, sizeof(*set));
637 * Arguments to signal handler:
640 * a1 = 0 (should be cause)
641 * a2 = pointer to struct sigcontext
643 * $25 and c0_epc point to the signal handler, $29 points to the
646 regs->regs[ 4] = signr;
648 regs->regs[ 6] = (unsigned long) &frame->sf_sc;
649 regs->regs[29] = (unsigned long) frame;
650 regs->regs[31] = (unsigned long) frame->sf_code;
651 regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
654 printk("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%p\n",
655 current->comm, current->pid,
656 frame, regs->cp0_epc, frame->sf_code);
661 force_sigsegv(signr, current);
664 static inline void setup_rt_frame(struct k_sigaction * ka,
665 struct pt_regs *regs, int signr,
666 sigset_t *set, siginfo_t *info)
668 struct rt_sigframe32 *frame;
672 frame = get_sigframe(ka, regs, sizeof(*frame));
673 if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
676 /* Set up to return from userspace. If provided, use a stub already
679 * Set up the return code ...
681 * li v0, __NR_O32_rt_sigreturn
684 err |= __put_user(0x24020000 + __NR_O32_rt_sigreturn, frame->rs_code + 0);
685 err |= __put_user(0x0000000c , frame->rs_code + 1);
686 flush_cache_sigtramp((unsigned long) frame->rs_code);
688 /* Convert (siginfo_t -> compat_siginfo_t) and copy to user. */
689 err |= copy_siginfo_to_user32(&frame->rs_info, info);
691 /* Create the ucontext. */
692 err |= __put_user(0, &frame->rs_uc.uc_flags);
693 err |= __put_user(0, &frame->rs_uc.uc_link);
694 sp = (int) (long) current->sas_ss_sp;
695 err |= __put_user(sp,
696 &frame->rs_uc.uc_stack.ss_sp);
697 err |= __put_user(sas_ss_flags(regs->regs[29]),
698 &frame->rs_uc.uc_stack.ss_flags);
699 err |= __put_user(current->sas_ss_size,
700 &frame->rs_uc.uc_stack.ss_size);
701 err |= setup_sigcontext32(regs, &frame->rs_uc.uc_mcontext);
702 err |= __copy_to_user(&frame->rs_uc.uc_sigmask, set, sizeof(*set));
708 * Arguments to signal handler:
711 * a1 = 0 (should be cause)
712 * a2 = pointer to ucontext
714 * $25 and c0_epc point to the signal handler, $29 points to
715 * the struct rt_sigframe32.
717 regs->regs[ 4] = signr;
718 regs->regs[ 5] = (unsigned long) &frame->rs_info;
719 regs->regs[ 6] = (unsigned long) &frame->rs_uc;
720 regs->regs[29] = (unsigned long) frame;
721 regs->regs[31] = (unsigned long) frame->rs_code;
722 regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
725 printk("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%p\n",
726 current->comm, current->pid,
727 frame, regs->cp0_epc, frame->rs_code);
732 force_sigsegv(signr, current);
735 static inline void handle_signal(unsigned long sig, siginfo_t *info,
736 struct k_sigaction *ka, sigset_t *oldset, struct pt_regs * regs)
738 switch (regs->regs[0]) {
739 case ERESTART_RESTARTBLOCK:
741 regs->regs[2] = EINTR;
744 if(!(ka->sa.sa_flags & SA_RESTART)) {
745 regs->regs[2] = EINTR;
749 case ERESTARTNOINTR: /* Userland will reload $v0. */
750 regs->regs[7] = regs->regs[26];
754 regs->regs[0] = 0; /* Don't deal with this again. */
756 if (ka->sa.sa_flags & SA_SIGINFO)
757 setup_rt_frame(ka, regs, sig, oldset, info);
759 setup_frame(ka, regs, sig, oldset);
761 spin_lock_irq(¤t->sighand->siglock);
762 sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
763 if (!(ka->sa.sa_flags & SA_NODEFER))
764 sigaddset(¤t->blocked,sig);
766 spin_unlock_irq(¤t->sighand->siglock);
769 int do_signal32(sigset_t *oldset, struct pt_regs *regs)
771 struct k_sigaction ka;
776 * We want the common case to go fast, which is why we may in certain
777 * cases get here from kernel mode. Just return without doing anything
780 if (!user_mode(regs))
787 oldset = ¤t->blocked;
789 signr = get_signal_to_deliver(&info, &ka, regs, NULL);
791 handle_signal(signr, &info, &ka, oldset, regs);
797 * Who's code doesn't conform to the restartable syscall convention
798 * dies here!!! The li instruction, a single machine instruction,
799 * must directly be followed by the syscall instruction.
802 if (regs->regs[2] == ERESTARTNOHAND ||
803 regs->regs[2] == ERESTARTSYS ||
804 regs->regs[2] == ERESTARTNOINTR) {
805 regs->regs[7] = regs->regs[26];
808 if (regs->regs[2] == ERESTART_RESTARTBLOCK) {
809 regs->regs[2] = __NR_O32_restart_syscall;
810 regs->regs[7] = regs->regs[26];
817 asmlinkage int sys32_rt_sigaction(int sig, const struct sigaction32 *act,
818 struct sigaction32 *oact,
819 unsigned int sigsetsize)
821 struct k_sigaction new_sa, old_sa;
824 /* XXX: Don't preclude handling different sized sigset_t's. */
825 if (sigsetsize != sizeof(sigset_t))
831 if (!access_ok(VERIFY_READ, act, sizeof(*act)))
833 err |= __get_user((u32)(u64)new_sa.sa.sa_handler,
835 err |= __get_user(new_sa.sa.sa_flags, &act->sa_flags);
836 err |= get_sigset(&new_sa.sa.sa_mask, &act->sa_mask);
841 ret = do_sigaction(sig, act ? &new_sa : NULL, oact ? &old_sa : NULL);
846 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)))
849 err |= __put_user((u32)(u64)old_sa.sa.sa_handler,
851 err |= __put_user(old_sa.sa.sa_flags, &oact->sa_flags);
852 err |= put_sigset(&old_sa.sa.sa_mask, &oact->sa_mask);
860 asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t *set,
861 compat_sigset_t *oset, unsigned int sigsetsize)
863 sigset_t old_set, new_set;
865 mm_segment_t old_fs = get_fs();
867 if (set && get_sigset(&new_set, set))
871 ret = sys_rt_sigprocmask(how, set ? &new_set : NULL,
872 oset ? &old_set : NULL, sigsetsize);
875 if (!ret && oset && put_sigset(&old_set, oset))
881 asmlinkage int sys32_rt_sigpending(compat_sigset_t *uset,
882 unsigned int sigsetsize)
886 mm_segment_t old_fs = get_fs();
889 ret = sys_rt_sigpending(&set, sigsetsize);
892 if (!ret && put_sigset(&set, uset))
898 asmlinkage int sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t *uinfo)
902 mm_segment_t old_fs = get_fs();
904 if (copy_from_user (&info, uinfo, 3*sizeof(int)) ||
905 copy_from_user (info._sifields._pad, uinfo->_sifields._pad, SI_PAD_SIZE))
908 ret = sys_rt_sigqueueinfo(pid, sig, &info);
914 sys32_waitid(int which, compat_pid_t pid,
915 compat_siginfo_t __user *uinfo, int options,
916 struct compat_rusage __user *uru)
921 mm_segment_t old_fs = get_fs();
925 ret = sys_waitid(which, pid, (siginfo_t __user *) &info, options,
926 uru ? (struct rusage __user *) &ru : NULL);
929 if (ret < 0 || info.si_signo == 0)
932 if (uru && (ret = put_compat_rusage(&ru, uru)))
935 BUG_ON(info.si_code & __SI_MASK);
936 info.si_code |= __SI_CHLD;
937 return copy_siginfo_to_user32(uinfo, &info);