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>
26 #include <linux/bitops.h>
27 #include <asm/cacheflush.h>
29 #include <asm/uaccess.h>
30 #include <asm/ucontext.h>
31 #include <asm/system.h>
34 #define SI_PAD_SIZE32 ((SI_MAX_SIZE/sizeof(int)) - 3)
36 typedef struct compat_siginfo {
42 int _pad[SI_PAD_SIZE32];
46 compat_pid_t _pid; /* sender's pid */
47 compat_uid_t _uid; /* sender's uid */
52 compat_pid_t _pid; /* which child */
53 compat_uid_t _uid; /* sender's uid */
54 int _status; /* exit code */
55 compat_clock_t _utime;
56 compat_clock_t _stime;
61 compat_pid_t _pid; /* which child */
62 compat_clock_t _utime;
63 int _status; /* exit code */
64 compat_clock_t _stime;
67 /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
69 s32 _addr; /* faulting insn/memory ref. */
72 /* SIGPOLL, SIGXFSZ (To do ...) */
74 int _band; /* POLL_IN, POLL_OUT, POLL_MSG */
80 timer_t _tid; /* timer id */
81 int _overrun; /* overrun count */
82 compat_sigval_t _sigval;/* same as below */
83 int _sys_private; /* not to be passed to user */
86 /* POSIX.1b signals */
88 compat_pid_t _pid; /* sender's pid */
89 compat_uid_t _uid; /* sender's uid */
90 compat_sigval_t _sigval;
97 * Including <asm/unistd.h> would give use the 64-bit syscall numbers ...
99 #define __NR_O32_sigreturn 4119
100 #define __NR_O32_rt_sigreturn 4193
101 #define __NR_O32_restart_syscall 4253
105 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
107 extern int do_signal32(sigset_t *oldset, struct pt_regs *regs);
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 extern void __put_sigset_unknown_nsig(void);
143 extern void __get_sigset_unknown_nsig(void);
145 static inline int put_sigset(const sigset_t *kbuf, compat_sigset_t *ubuf)
149 if (!access_ok(VERIFY_WRITE, ubuf, sizeof(*ubuf)))
152 switch (_NSIG_WORDS) {
154 __put_sigset_unknown_nsig();
156 err |= __put_user (kbuf->sig[1] >> 32, &ubuf->sig[3]);
157 err |= __put_user (kbuf->sig[1] & 0xffffffff, &ubuf->sig[2]);
159 err |= __put_user (kbuf->sig[0] >> 32, &ubuf->sig[1]);
160 err |= __put_user (kbuf->sig[0] & 0xffffffff, &ubuf->sig[0]);
166 static inline int get_sigset(sigset_t *kbuf, const compat_sigset_t *ubuf)
169 unsigned long sig[4];
171 if (!access_ok(VERIFY_READ, ubuf, sizeof(*ubuf)))
174 switch (_NSIG_WORDS) {
176 __get_sigset_unknown_nsig();
178 err |= __get_user (sig[3], &ubuf->sig[3]);
179 err |= __get_user (sig[2], &ubuf->sig[2]);
180 kbuf->sig[1] = sig[2] | (sig[3] << 32);
182 err |= __get_user (sig[1], &ubuf->sig[1]);
183 err |= __get_user (sig[0], &ubuf->sig[0]);
184 kbuf->sig[0] = sig[0] | (sig[1] << 32);
191 * Atomically swap in the new signal mask, and wait for a signal.
194 save_static_function(sys32_sigsuspend);
195 __attribute_used__ noinline static int
196 _sys32_sigsuspend(nabi_no_regargs struct pt_regs regs)
198 compat_sigset_t *uset;
199 sigset_t newset, saveset;
201 uset = (compat_sigset_t *) regs.regs[4];
202 if (get_sigset(&newset, uset))
204 sigdelsetmask(&newset, ~_BLOCKABLE);
206 spin_lock_irq(¤t->sighand->siglock);
207 saveset = current->blocked;
208 current->blocked = newset;
210 spin_unlock_irq(¤t->sighand->siglock);
212 regs.regs[2] = EINTR;
215 current->state = TASK_INTERRUPTIBLE;
217 if (do_signal32(&saveset, ®s))
222 save_static_function(sys32_rt_sigsuspend);
223 __attribute_used__ noinline static int
224 _sys32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
226 compat_sigset_t *uset;
227 sigset_t newset, saveset;
230 /* XXX Don't preclude handling different sized sigset_t's. */
231 sigsetsize = regs.regs[5];
232 if (sigsetsize != sizeof(compat_sigset_t))
235 uset = (compat_sigset_t *) regs.regs[4];
236 if (get_sigset(&newset, uset))
238 sigdelsetmask(&newset, ~_BLOCKABLE);
240 spin_lock_irq(¤t->sighand->siglock);
241 saveset = current->blocked;
242 current->blocked = newset;
244 spin_unlock_irq(¤t->sighand->siglock);
246 regs.regs[2] = EINTR;
249 current->state = TASK_INTERRUPTIBLE;
251 if (do_signal32(&saveset, ®s))
256 asmlinkage int sys32_sigaction(int sig, const struct sigaction32 *act,
257 struct sigaction32 *oact)
259 struct k_sigaction new_ka, old_ka;
267 if (!access_ok(VERIFY_READ, act, sizeof(*act)))
269 err |= __get_user(handler, &act->sa_handler);
270 new_ka.sa.sa_handler = (void*)(s64)handler;
271 err |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
272 err |= __get_user(mask, &act->sa_mask.sig[0]);
276 siginitset(&new_ka.sa.sa_mask, mask);
279 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
282 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)))
284 err |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
285 err |= __put_user((u32)(u64)old_ka.sa.sa_handler,
287 err |= __put_user(old_ka.sa.sa_mask.sig[0], oact->sa_mask.sig);
288 err |= __put_user(0, &oact->sa_mask.sig[1]);
289 err |= __put_user(0, &oact->sa_mask.sig[2]);
290 err |= __put_user(0, &oact->sa_mask.sig[3]);
298 asmlinkage int sys32_sigaltstack(nabi_no_regargs struct pt_regs regs)
300 const stack32_t *uss = (const stack32_t *) regs.regs[4];
301 stack32_t *uoss = (stack32_t *) regs.regs[5];
302 unsigned long usp = regs.regs[29];
305 mm_segment_t old_fs = get_fs();
309 if (!access_ok(VERIFY_READ, uss, sizeof(*uss)))
311 err |= __get_user(sp, &uss->ss_sp);
312 kss.ss_sp = (void *) (long) sp;
313 err |= __get_user(kss.ss_size, &uss->ss_size);
314 err |= __get_user(kss.ss_flags, &uss->ss_flags);
320 ret = do_sigaltstack(uss ? &kss : NULL , uoss ? &koss : NULL, usp);
324 if (!access_ok(VERIFY_WRITE, uoss, sizeof(*uoss)))
326 sp = (int) (long) koss.ss_sp;
327 err |= __put_user(sp, &uoss->ss_sp);
328 err |= __put_user(koss.ss_size, &uoss->ss_size);
329 err |= __put_user(koss.ss_flags, &uoss->ss_flags);
336 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 err |= __get_user(treg, &sc->sc_hi1); mthi1(treg);
350 err |= __get_user(treg, &sc->sc_lo1); mtlo1(treg);
351 err |= __get_user(treg, &sc->sc_hi2); mthi2(treg);
352 err |= __get_user(treg, &sc->sc_lo2); mtlo2(treg);
353 err |= __get_user(treg, &sc->sc_hi3); mthi3(treg);
354 err |= __get_user(treg, &sc->sc_lo3); mtlo3(treg);
355 err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
358 #define restore_gp_reg(i) do { \
359 err |= __get_user(regs->regs[i], &sc->sc_regs[i]); \
361 restore_gp_reg( 1); restore_gp_reg( 2); restore_gp_reg( 3);
362 restore_gp_reg( 4); restore_gp_reg( 5); restore_gp_reg( 6);
363 restore_gp_reg( 7); restore_gp_reg( 8); restore_gp_reg( 9);
364 restore_gp_reg(10); restore_gp_reg(11); restore_gp_reg(12);
365 restore_gp_reg(13); restore_gp_reg(14); restore_gp_reg(15);
366 restore_gp_reg(16); restore_gp_reg(17); restore_gp_reg(18);
367 restore_gp_reg(19); restore_gp_reg(20); restore_gp_reg(21);
368 restore_gp_reg(22); restore_gp_reg(23); restore_gp_reg(24);
369 restore_gp_reg(25); restore_gp_reg(26); restore_gp_reg(27);
370 restore_gp_reg(28); restore_gp_reg(29); restore_gp_reg(30);
372 #undef restore_gp_reg
374 err |= __get_user(used_math, &sc->sc_used_math);
375 conditional_used_math(used_math);
380 /* restore fpu context if we have used it before */
382 err |= restore_fp_context32(sc);
384 /* signal handler may have used FPU. Give it up. */
394 u32 sf_ass[4]; /* argument save space for o32 */
395 u32 sf_code[2]; /* signal trampoline */
396 struct sigcontext32 sf_sc;
400 struct rt_sigframe32 {
401 u32 rs_ass[4]; /* argument save space for o32 */
402 u32 rs_code[2]; /* signal trampoline */
403 compat_siginfo_t rs_info;
404 struct ucontext32 rs_uc;
407 int copy_siginfo_to_user32(compat_siginfo_t *to, siginfo_t *from)
411 if (!access_ok (VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
414 /* If you change siginfo_t structure, please be sure
415 this code is fixed accordingly.
416 It should never copy any pad contained in the structure
417 to avoid security leaks, but must copy the generic
418 3 ints plus the relevant union member.
419 This routine must convert siginfo from 64bit to 32bit as well
421 err = __put_user(from->si_signo, &to->si_signo);
422 err |= __put_user(from->si_errno, &to->si_errno);
423 err |= __put_user((short)from->si_code, &to->si_code);
424 if (from->si_code < 0)
425 err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
427 switch (from->si_code >> 16) {
428 case __SI_TIMER >> 16:
429 err |= __put_user(from->si_tid, &to->si_tid);
430 err |= __put_user(from->si_overrun, &to->si_overrun);
431 err |= __put_user(from->si_int, &to->si_int);
433 case __SI_CHLD >> 16:
434 err |= __put_user(from->si_utime, &to->si_utime);
435 err |= __put_user(from->si_stime, &to->si_stime);
436 err |= __put_user(from->si_status, &to->si_status);
438 err |= __put_user(from->si_pid, &to->si_pid);
439 err |= __put_user(from->si_uid, &to->si_uid);
441 case __SI_FAULT >> 16:
442 err |= __put_user((long)from->si_addr, &to->si_addr);
444 case __SI_POLL >> 16:
445 err |= __put_user(from->si_band, &to->si_band);
446 err |= __put_user(from->si_fd, &to->si_fd);
448 case __SI_RT >> 16: /* This is not generated by the kernel as of now. */
449 case __SI_MESGQ >> 16:
450 err |= __put_user(from->si_pid, &to->si_pid);
451 err |= __put_user(from->si_uid, &to->si_uid);
452 err |= __put_user(from->si_int, &to->si_int);
459 save_static_function(sys32_sigreturn);
460 __attribute_used__ noinline static void
461 _sys32_sigreturn(nabi_no_regargs struct pt_regs regs)
463 struct sigframe *frame;
466 frame = (struct sigframe *) regs.regs[29];
467 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
469 if (__copy_from_user(&blocked, &frame->sf_mask, sizeof(blocked)))
472 sigdelsetmask(&blocked, ~_BLOCKABLE);
473 spin_lock_irq(¤t->sighand->siglock);
474 current->blocked = blocked;
476 spin_unlock_irq(¤t->sighand->siglock);
478 if (restore_sigcontext32(®s, &frame->sf_sc))
482 * Don't let your children do this ...
484 if (current_thread_info()->flags & TIF_SYSCALL_TRACE)
485 do_syscall_trace(®s, 1);
486 __asm__ __volatile__(
494 force_sig(SIGSEGV, current);
497 save_static_function(sys32_rt_sigreturn);
498 __attribute_used__ noinline static void
499 _sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
501 struct rt_sigframe32 *frame;
507 frame = (struct rt_sigframe32 *) regs.regs[29];
508 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
510 if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set)))
513 sigdelsetmask(&set, ~_BLOCKABLE);
514 spin_lock_irq(¤t->sighand->siglock);
515 current->blocked = set;
517 spin_unlock_irq(¤t->sighand->siglock);
519 if (restore_sigcontext32(®s, &frame->rs_uc.uc_mcontext))
522 /* The ucontext contains a stack32_t, so we must convert! */
523 if (__get_user(sp, &frame->rs_uc.uc_stack.ss_sp))
525 st.ss_size = (long) sp;
526 if (__get_user(st.ss_size, &frame->rs_uc.uc_stack.ss_size))
528 if (__get_user(st.ss_flags, &frame->rs_uc.uc_stack.ss_flags))
531 /* It is more difficult to avoid calling this function than to
532 call it and ignore errors. */
535 do_sigaltstack(&st, NULL, regs.regs[29]);
539 * Don't let your children do this ...
541 __asm__ __volatile__(
549 force_sig(SIGSEGV, current);
552 static inline int setup_sigcontext32(struct pt_regs *regs,
553 struct sigcontext32 *sc)
557 err |= __put_user(regs->cp0_epc, &sc->sc_pc);
558 err |= __put_user(regs->cp0_status, &sc->sc_status);
560 #define save_gp_reg(i) { \
561 err |= __put_user(regs->regs[i], &sc->sc_regs[i]); \
563 __put_user(0, &sc->sc_regs[0]); save_gp_reg(1); save_gp_reg(2);
564 save_gp_reg(3); save_gp_reg(4); save_gp_reg(5); save_gp_reg(6);
565 save_gp_reg(7); save_gp_reg(8); save_gp_reg(9); save_gp_reg(10);
566 save_gp_reg(11); save_gp_reg(12); save_gp_reg(13); save_gp_reg(14);
567 save_gp_reg(15); save_gp_reg(16); save_gp_reg(17); save_gp_reg(18);
568 save_gp_reg(19); save_gp_reg(20); save_gp_reg(21); save_gp_reg(22);
569 save_gp_reg(23); save_gp_reg(24); save_gp_reg(25); save_gp_reg(26);
570 save_gp_reg(27); save_gp_reg(28); save_gp_reg(29); save_gp_reg(30);
574 err |= __put_user(regs->hi, &sc->sc_mdhi);
575 err |= __put_user(regs->lo, &sc->sc_mdlo);
577 err |= __put_user(rddsp(DSP_MASK), &sc->sc_hi1);
578 err |= __put_user(mfhi1(), &sc->sc_hi1);
579 err |= __put_user(mflo1(), &sc->sc_lo1);
580 err |= __put_user(mfhi2(), &sc->sc_hi2);
581 err |= __put_user(mflo2(), &sc->sc_lo2);
582 err |= __put_user(mfhi3(), &sc->sc_hi3);
583 err |= __put_user(mflo3(), &sc->sc_lo3);
586 err |= __put_user(!!used_math(), &sc->sc_used_math);
592 * Save FPU state to signal context. Signal handler will "inherit"
597 if (!is_fpu_owner()) {
601 err |= save_fp_context32(sc);
610 * Determine which stack to use..
612 static inline void *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
617 /* Default to using normal stack */
621 * FPU emulator may have it's own trampoline active just
622 * above the user stack, 16-bytes before the next lowest
623 * 16 byte boundary. Try to avoid trashing it.
627 /* This is the X/Open sanctioned signal stack switching. */
628 if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags (sp) == 0))
629 sp = current->sas_ss_sp + current->sas_ss_size;
631 return (void *)((sp - frame_size) & ALMASK);
634 void setup_frame_32(struct k_sigaction * ka, struct pt_regs *regs,
635 int signr, sigset_t *set)
637 struct sigframe *frame;
640 frame = get_sigframe(ka, regs, sizeof(*frame));
641 if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
645 * Set up the return code ...
647 * li v0, __NR_O32_sigreturn
650 err |= __put_user(0x24020000 + __NR_O32_sigreturn, frame->sf_code + 0);
651 err |= __put_user(0x0000000c , frame->sf_code + 1);
652 flush_cache_sigtramp((unsigned long) frame->sf_code);
654 err |= setup_sigcontext32(regs, &frame->sf_sc);
655 err |= __copy_to_user(&frame->sf_mask, set, sizeof(*set));
660 * Arguments to signal handler:
663 * a1 = 0 (should be cause)
664 * a2 = pointer to struct sigcontext
666 * $25 and c0_epc point to the signal handler, $29 points to the
669 regs->regs[ 4] = signr;
671 regs->regs[ 6] = (unsigned long) &frame->sf_sc;
672 regs->regs[29] = (unsigned long) frame;
673 regs->regs[31] = (unsigned long) frame->sf_code;
674 regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
677 printk("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%p\n",
678 current->comm, current->pid,
679 frame, regs->cp0_epc, frame->sf_code);
684 force_sigsegv(signr, current);
687 void setup_rt_frame_32(struct k_sigaction * ka, struct pt_regs *regs, int signr, sigset_t *set, siginfo_t *info)
689 struct rt_sigframe32 *frame;
693 frame = get_sigframe(ka, regs, sizeof(*frame));
694 if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
697 /* Set up to return from userspace. If provided, use a stub already
700 * Set up the return code ...
702 * li v0, __NR_O32_rt_sigreturn
705 err |= __put_user(0x24020000 + __NR_O32_rt_sigreturn, frame->rs_code + 0);
706 err |= __put_user(0x0000000c , frame->rs_code + 1);
707 flush_cache_sigtramp((unsigned long) frame->rs_code);
709 /* Convert (siginfo_t -> compat_siginfo_t) and copy to user. */
710 err |= copy_siginfo_to_user32(&frame->rs_info, info);
712 /* Create the ucontext. */
713 err |= __put_user(0, &frame->rs_uc.uc_flags);
714 err |= __put_user(0, &frame->rs_uc.uc_link);
715 sp = (int) (long) current->sas_ss_sp;
716 err |= __put_user(sp,
717 &frame->rs_uc.uc_stack.ss_sp);
718 err |= __put_user(sas_ss_flags(regs->regs[29]),
719 &frame->rs_uc.uc_stack.ss_flags);
720 err |= __put_user(current->sas_ss_size,
721 &frame->rs_uc.uc_stack.ss_size);
722 err |= setup_sigcontext32(regs, &frame->rs_uc.uc_mcontext);
723 err |= __copy_to_user(&frame->rs_uc.uc_sigmask, set, sizeof(*set));
729 * Arguments to signal handler:
732 * a1 = 0 (should be cause)
733 * a2 = pointer to ucontext
735 * $25 and c0_epc point to the signal handler, $29 points to
736 * the struct rt_sigframe32.
738 regs->regs[ 4] = signr;
739 regs->regs[ 5] = (unsigned long) &frame->rs_info;
740 regs->regs[ 6] = (unsigned long) &frame->rs_uc;
741 regs->regs[29] = (unsigned long) frame;
742 regs->regs[31] = (unsigned long) frame->rs_code;
743 regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
746 printk("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%p\n",
747 current->comm, current->pid,
748 frame, regs->cp0_epc, frame->rs_code);
753 force_sigsegv(signr, current);
756 static inline void handle_signal(unsigned long sig, siginfo_t *info,
757 struct k_sigaction *ka, sigset_t *oldset, struct pt_regs * regs)
759 switch (regs->regs[0]) {
760 case ERESTART_RESTARTBLOCK:
762 regs->regs[2] = EINTR;
765 if(!(ka->sa.sa_flags & SA_RESTART)) {
766 regs->regs[2] = EINTR;
770 case ERESTARTNOINTR: /* Userland will reload $v0. */
771 regs->regs[7] = regs->regs[26];
775 regs->regs[0] = 0; /* Don't deal with this again. */
777 if (ka->sa.sa_flags & SA_SIGINFO)
778 current->thread.abi->setup_rt_frame(ka, regs, sig, oldset, info);
780 current->thread.abi->setup_frame(ka, regs, sig, oldset);
782 spin_lock_irq(¤t->sighand->siglock);
783 sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
784 if (!(ka->sa.sa_flags & SA_NODEFER))
785 sigaddset(¤t->blocked,sig);
787 spin_unlock_irq(¤t->sighand->siglock);
790 int do_signal32(sigset_t *oldset, struct pt_regs *regs)
792 struct k_sigaction ka;
797 * We want the common case to go fast, which is why we may in certain
798 * cases get here from kernel mode. Just return without doing anything
801 if (!user_mode(regs))
808 oldset = ¤t->blocked;
810 signr = get_signal_to_deliver(&info, &ka, regs, NULL);
812 handle_signal(signr, &info, &ka, oldset, regs);
818 * Who's code doesn't conform to the restartable syscall convention
819 * dies here!!! The li instruction, a single machine instruction,
820 * must directly be followed by the syscall instruction.
823 if (regs->regs[2] == ERESTARTNOHAND ||
824 regs->regs[2] == ERESTARTSYS ||
825 regs->regs[2] == ERESTARTNOINTR) {
826 regs->regs[7] = regs->regs[26];
829 if (regs->regs[2] == ERESTART_RESTARTBLOCK) {
830 regs->regs[2] = __NR_O32_restart_syscall;
831 regs->regs[7] = regs->regs[26];
838 asmlinkage int sys32_rt_sigaction(int sig, const struct sigaction32 *act,
839 struct sigaction32 *oact,
840 unsigned int sigsetsize)
842 struct k_sigaction new_sa, old_sa;
845 /* XXX: Don't preclude handling different sized sigset_t's. */
846 if (sigsetsize != sizeof(sigset_t))
853 if (!access_ok(VERIFY_READ, act, sizeof(*act)))
855 err |= __get_user(handler, &act->sa_handler);
856 new_sa.sa.sa_handler = (void*)(s64)handler;
857 err |= __get_user(new_sa.sa.sa_flags, &act->sa_flags);
858 err |= get_sigset(&new_sa.sa.sa_mask, &act->sa_mask);
863 ret = do_sigaction(sig, act ? &new_sa : NULL, oact ? &old_sa : NULL);
868 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)))
871 err |= __put_user((u32)(u64)old_sa.sa.sa_handler,
873 err |= __put_user(old_sa.sa.sa_flags, &oact->sa_flags);
874 err |= put_sigset(&old_sa.sa.sa_mask, &oact->sa_mask);
882 asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t *set,
883 compat_sigset_t *oset, unsigned int sigsetsize)
885 sigset_t old_set, new_set;
887 mm_segment_t old_fs = get_fs();
889 if (set && get_sigset(&new_set, set))
893 ret = sys_rt_sigprocmask(how, set ? &new_set : NULL,
894 oset ? &old_set : NULL, sigsetsize);
897 if (!ret && oset && put_sigset(&old_set, oset))
903 asmlinkage int sys32_rt_sigpending(compat_sigset_t *uset,
904 unsigned int sigsetsize)
908 mm_segment_t old_fs = get_fs();
911 ret = sys_rt_sigpending(&set, sigsetsize);
914 if (!ret && put_sigset(&set, uset))
920 asmlinkage int sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t *uinfo)
924 mm_segment_t old_fs = get_fs();
926 if (copy_from_user (&info, uinfo, 3*sizeof(int)) ||
927 copy_from_user (info._sifields._pad, uinfo->_sifields._pad, SI_PAD_SIZE))
930 ret = sys_rt_sigqueueinfo(pid, sig, &info);
936 sys32_waitid(int which, compat_pid_t pid,
937 compat_siginfo_t __user *uinfo, int options,
938 struct compat_rusage __user *uru)
943 mm_segment_t old_fs = get_fs();
947 ret = sys_waitid(which, pid, (siginfo_t __user *) &info, options,
948 uru ? (struct rusage __user *) &ru : NULL);
951 if (ret < 0 || info.si_signo == 0)
954 if (uru && (ret = put_compat_rusage(&ru, uru)))
957 BUG_ON(info.si_code & __SI_MASK);
958 info.si_code |= __SI_CHLD;
959 return copy_siginfo_to_user32(uinfo, &info);