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/compat.h>
12 #include <linux/sched.h>
14 #include <linux/smp.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/suspend.h>
22 #include <linux/compiler.h>
23 #include <linux/uaccess.h>
27 #include <asm/compat-signal.h>
28 #include <linux/bitops.h>
29 #include <asm/cacheflush.h>
31 #include <asm/ucontext.h>
32 #include <asm/system.h>
37 #include "signal-common.h"
39 static int (*save_fp_context32
)(struct sigcontext32 __user
*sc
);
40 static int (*restore_fp_context32
)(struct sigcontext32 __user
*sc
);
42 extern asmlinkage
int _save_fp_context32(struct sigcontext32 __user
*sc
);
43 extern asmlinkage
int _restore_fp_context32(struct sigcontext32 __user
*sc
);
45 extern asmlinkage
int fpu_emulator_save_context32(struct sigcontext32 __user
*sc
);
46 extern asmlinkage
int fpu_emulator_restore_context32(struct sigcontext32 __user
*sc
);
49 * Including <asm/unistd.h> would give use the 64-bit syscall numbers ...
51 #define __NR_O32_restart_syscall 4253
53 /* 32-bit compatibility types */
55 typedef unsigned int __sighandler32_t
;
56 typedef void (*vfptr_t
)(void);
59 unsigned int sa_flags
;
60 __sighandler32_t sa_handler
;
61 compat_sigset_t sa_mask
;
64 /* IRIX compatible stack_t */
65 typedef struct sigaltstack32
{
67 compat_size_t ss_size
;
75 struct sigcontext32 uc_mcontext
;
76 compat_sigset_t uc_sigmask
; /* mask last for extensibility */
80 u32 sf_ass
[4]; /* argument save space for o32 */
81 u32 sf_pad
[2]; /* Was: signal trampoline */
82 struct sigcontext32 sf_sc
;
83 compat_sigset_t sf_mask
;
86 struct rt_sigframe32
{
87 u32 rs_ass
[4]; /* argument save space for o32 */
88 u32 rs_pad
[2]; /* Was: signal trampoline */
89 compat_siginfo_t rs_info
;
90 struct ucontext32 rs_uc
;
96 static int protected_save_fp_context32(struct sigcontext32 __user
*sc
)
102 err
= save_fp_context32(sc
); /* this might fail */
106 /* touch the sigcontext and try again */
107 err
= __put_user(0, &sc
->sc_fpregs
[0]) |
108 __put_user(0, &sc
->sc_fpregs
[31]) |
109 __put_user(0, &sc
->sc_fpc_csr
);
111 break; /* really bad sigcontext */
116 static int protected_restore_fp_context32(struct sigcontext32 __user
*sc
)
118 int err
, tmp __maybe_unused
;
122 err
= restore_fp_context32(sc
); /* this might fail */
126 /* touch the sigcontext and try again */
127 err
= __get_user(tmp
, &sc
->sc_fpregs
[0]) |
128 __get_user(tmp
, &sc
->sc_fpregs
[31]) |
129 __get_user(tmp
, &sc
->sc_fpc_csr
);
131 break; /* really bad sigcontext */
136 static int setup_sigcontext32(struct pt_regs
*regs
,
137 struct sigcontext32 __user
*sc
)
143 err
|= __put_user(regs
->cp0_epc
, &sc
->sc_pc
);
145 err
|= __put_user(0, &sc
->sc_regs
[0]);
146 for (i
= 1; i
< 32; i
++)
147 err
|= __put_user(regs
->regs
[i
], &sc
->sc_regs
[i
]);
149 err
|= __put_user(regs
->hi
, &sc
->sc_mdhi
);
150 err
|= __put_user(regs
->lo
, &sc
->sc_mdlo
);
152 err
|= __put_user(rddsp(DSP_MASK
), &sc
->sc_dsp
);
153 err
|= __put_user(mfhi1(), &sc
->sc_hi1
);
154 err
|= __put_user(mflo1(), &sc
->sc_lo1
);
155 err
|= __put_user(mfhi2(), &sc
->sc_hi2
);
156 err
|= __put_user(mflo2(), &sc
->sc_lo2
);
157 err
|= __put_user(mfhi3(), &sc
->sc_hi3
);
158 err
|= __put_user(mflo3(), &sc
->sc_lo3
);
161 used_math
= !!used_math();
162 err
|= __put_user(used_math
, &sc
->sc_used_math
);
166 * Save FPU state to signal context. Signal handler
167 * will "inherit" current FPU state.
169 err
|= protected_save_fp_context32(sc
);
175 check_and_restore_fp_context32(struct sigcontext32 __user
*sc
)
179 err
= sig
= fpcsr_pending(&sc
->sc_fpc_csr
);
182 err
|= protected_restore_fp_context32(sc
);
186 static int restore_sigcontext32(struct pt_regs
*regs
,
187 struct sigcontext32 __user
*sc
)
194 /* Always make any pending restarted system calls return -EINTR */
195 current_thread_info()->restart_block
.fn
= do_no_restart_syscall
;
197 err
|= __get_user(regs
->cp0_epc
, &sc
->sc_pc
);
198 err
|= __get_user(regs
->hi
, &sc
->sc_mdhi
);
199 err
|= __get_user(regs
->lo
, &sc
->sc_mdlo
);
201 err
|= __get_user(treg
, &sc
->sc_hi1
); mthi1(treg
);
202 err
|= __get_user(treg
, &sc
->sc_lo1
); mtlo1(treg
);
203 err
|= __get_user(treg
, &sc
->sc_hi2
); mthi2(treg
);
204 err
|= __get_user(treg
, &sc
->sc_lo2
); mtlo2(treg
);
205 err
|= __get_user(treg
, &sc
->sc_hi3
); mthi3(treg
);
206 err
|= __get_user(treg
, &sc
->sc_lo3
); mtlo3(treg
);
207 err
|= __get_user(treg
, &sc
->sc_dsp
); wrdsp(treg
, DSP_MASK
);
210 for (i
= 1; i
< 32; i
++)
211 err
|= __get_user(regs
->regs
[i
], &sc
->sc_regs
[i
]);
213 err
|= __get_user(used_math
, &sc
->sc_used_math
);
214 conditional_used_math(used_math
);
217 /* restore fpu context if we have used it before */
219 err
= check_and_restore_fp_context32(sc
);
221 /* signal handler may have used FPU. Give it up. */
231 extern void __put_sigset_unknown_nsig(void);
232 extern void __get_sigset_unknown_nsig(void);
234 static inline int put_sigset(const sigset_t
*kbuf
, compat_sigset_t __user
*ubuf
)
238 if (!access_ok(VERIFY_WRITE
, ubuf
, sizeof(*ubuf
)))
241 switch (_NSIG_WORDS
) {
243 __put_sigset_unknown_nsig();
245 err
|= __put_user(kbuf
->sig
[1] >> 32, &ubuf
->sig
[3]);
246 err
|= __put_user(kbuf
->sig
[1] & 0xffffffff, &ubuf
->sig
[2]);
248 err
|= __put_user(kbuf
->sig
[0] >> 32, &ubuf
->sig
[1]);
249 err
|= __put_user(kbuf
->sig
[0] & 0xffffffff, &ubuf
->sig
[0]);
255 static inline int get_sigset(sigset_t
*kbuf
, const compat_sigset_t __user
*ubuf
)
258 unsigned long sig
[4];
260 if (!access_ok(VERIFY_READ
, ubuf
, sizeof(*ubuf
)))
263 switch (_NSIG_WORDS
) {
265 __get_sigset_unknown_nsig();
267 err
|= __get_user(sig
[3], &ubuf
->sig
[3]);
268 err
|= __get_user(sig
[2], &ubuf
->sig
[2]);
269 kbuf
->sig
[1] = sig
[2] | (sig
[3] << 32);
271 err
|= __get_user(sig
[1], &ubuf
->sig
[1]);
272 err
|= __get_user(sig
[0], &ubuf
->sig
[0]);
273 kbuf
->sig
[0] = sig
[0] | (sig
[1] << 32);
280 * Atomically swap in the new signal mask, and wait for a signal.
283 asmlinkage
int sys32_sigsuspend(nabi_no_regargs
struct pt_regs regs
)
285 compat_sigset_t __user
*uset
;
288 uset
= (compat_sigset_t __user
*) regs
.regs
[4];
289 if (get_sigset(&newset
, uset
))
291 sigdelsetmask(&newset
, ~_BLOCKABLE
);
293 spin_lock_irq(¤t
->sighand
->siglock
);
294 current
->saved_sigmask
= current
->blocked
;
295 current
->blocked
= newset
;
297 spin_unlock_irq(¤t
->sighand
->siglock
);
299 current
->state
= TASK_INTERRUPTIBLE
;
301 set_thread_flag(TIF_RESTORE_SIGMASK
);
302 return -ERESTARTNOHAND
;
305 asmlinkage
int sys32_rt_sigsuspend(nabi_no_regargs
struct pt_regs regs
)
307 compat_sigset_t __user
*uset
;
311 /* XXX Don't preclude handling different sized sigset_t's. */
312 sigsetsize
= regs
.regs
[5];
313 if (sigsetsize
!= sizeof(compat_sigset_t
))
316 uset
= (compat_sigset_t __user
*) regs
.regs
[4];
317 if (get_sigset(&newset
, uset
))
319 sigdelsetmask(&newset
, ~_BLOCKABLE
);
321 spin_lock_irq(¤t
->sighand
->siglock
);
322 current
->saved_sigmask
= current
->blocked
;
323 current
->blocked
= newset
;
325 spin_unlock_irq(¤t
->sighand
->siglock
);
327 current
->state
= TASK_INTERRUPTIBLE
;
329 set_thread_flag(TIF_RESTORE_SIGMASK
);
330 return -ERESTARTNOHAND
;
333 SYSCALL_DEFINE3(32_sigaction
, long, sig
, const struct sigaction32 __user
*, act
,
334 struct sigaction32 __user
*, oact
)
336 struct k_sigaction new_ka
, old_ka
;
344 if (!access_ok(VERIFY_READ
, act
, sizeof(*act
)))
346 err
|= __get_user(handler
, &act
->sa_handler
);
347 new_ka
.sa
.sa_handler
= (void __user
*)(s64
)handler
;
348 err
|= __get_user(new_ka
.sa
.sa_flags
, &act
->sa_flags
);
349 err
|= __get_user(mask
, &act
->sa_mask
.sig
[0]);
353 siginitset(&new_ka
.sa
.sa_mask
, mask
);
356 ret
= do_sigaction(sig
, act
? &new_ka
: NULL
, oact
? &old_ka
: NULL
);
359 if (!access_ok(VERIFY_WRITE
, oact
, sizeof(*oact
)))
361 err
|= __put_user(old_ka
.sa
.sa_flags
, &oact
->sa_flags
);
362 err
|= __put_user((u32
)(u64
)old_ka
.sa
.sa_handler
,
364 err
|= __put_user(old_ka
.sa
.sa_mask
.sig
[0], oact
->sa_mask
.sig
);
365 err
|= __put_user(0, &oact
->sa_mask
.sig
[1]);
366 err
|= __put_user(0, &oact
->sa_mask
.sig
[2]);
367 err
|= __put_user(0, &oact
->sa_mask
.sig
[3]);
375 asmlinkage
int sys32_sigaltstack(nabi_no_regargs
struct pt_regs regs
)
377 const stack32_t __user
*uss
= (const stack32_t __user
*) regs
.regs
[4];
378 stack32_t __user
*uoss
= (stack32_t __user
*) regs
.regs
[5];
379 unsigned long usp
= regs
.regs
[29];
382 mm_segment_t old_fs
= get_fs();
386 if (!access_ok(VERIFY_READ
, uss
, sizeof(*uss
)))
388 err
|= __get_user(sp
, &uss
->ss_sp
);
389 kss
.ss_sp
= (void __user
*) (long) sp
;
390 err
|= __get_user(kss
.ss_size
, &uss
->ss_size
);
391 err
|= __get_user(kss
.ss_flags
, &uss
->ss_flags
);
397 ret
= do_sigaltstack(uss
? (stack_t __user
*)&kss
: NULL
,
398 uoss
? (stack_t __user
*)&koss
: NULL
, usp
);
402 if (!access_ok(VERIFY_WRITE
, uoss
, sizeof(*uoss
)))
404 sp
= (int) (unsigned long) koss
.ss_sp
;
405 err
|= __put_user(sp
, &uoss
->ss_sp
);
406 err
|= __put_user(koss
.ss_size
, &uoss
->ss_size
);
407 err
|= __put_user(koss
.ss_flags
, &uoss
->ss_flags
);
414 int copy_siginfo_to_user32(compat_siginfo_t __user
*to
, siginfo_t
*from
)
418 if (!access_ok (VERIFY_WRITE
, to
, sizeof(compat_siginfo_t
)))
421 /* If you change siginfo_t structure, please be sure
422 this code is fixed accordingly.
423 It should never copy any pad contained in the structure
424 to avoid security leaks, but must copy the generic
425 3 ints plus the relevant union member.
426 This routine must convert siginfo from 64bit to 32bit as well
428 err
= __put_user(from
->si_signo
, &to
->si_signo
);
429 err
|= __put_user(from
->si_errno
, &to
->si_errno
);
430 err
|= __put_user((short)from
->si_code
, &to
->si_code
);
431 if (from
->si_code
< 0)
432 err
|= __copy_to_user(&to
->_sifields
._pad
, &from
->_sifields
._pad
, SI_PAD_SIZE
);
434 switch (from
->si_code
>> 16) {
435 case __SI_TIMER
>> 16:
436 err
|= __put_user(from
->si_tid
, &to
->si_tid
);
437 err
|= __put_user(from
->si_overrun
, &to
->si_overrun
);
438 err
|= __put_user(from
->si_int
, &to
->si_int
);
440 case __SI_CHLD
>> 16:
441 err
|= __put_user(from
->si_utime
, &to
->si_utime
);
442 err
|= __put_user(from
->si_stime
, &to
->si_stime
);
443 err
|= __put_user(from
->si_status
, &to
->si_status
);
445 err
|= __put_user(from
->si_pid
, &to
->si_pid
);
446 err
|= __put_user(from
->si_uid
, &to
->si_uid
);
448 case __SI_FAULT
>> 16:
449 err
|= __put_user((unsigned long)from
->si_addr
, &to
->si_addr
);
451 case __SI_POLL
>> 16:
452 err
|= __put_user(from
->si_band
, &to
->si_band
);
453 err
|= __put_user(from
->si_fd
, &to
->si_fd
);
455 case __SI_RT
>> 16: /* This is not generated by the kernel as of now. */
456 case __SI_MESGQ
>> 16:
457 err
|= __put_user(from
->si_pid
, &to
->si_pid
);
458 err
|= __put_user(from
->si_uid
, &to
->si_uid
);
459 err
|= __put_user(from
->si_int
, &to
->si_int
);
466 int copy_siginfo_from_user32(siginfo_t
*to
, compat_siginfo_t __user
*from
)
468 memset(to
, 0, sizeof *to
);
470 if (copy_from_user(to
, from
, 3*sizeof(int)) ||
471 copy_from_user(to
->_sifields
._pad
,
472 from
->_sifields
._pad
, SI_PAD_SIZE32
))
478 asmlinkage
void sys32_sigreturn(nabi_no_regargs
struct pt_regs regs
)
480 struct sigframe32 __user
*frame
;
484 frame
= (struct sigframe32 __user
*) regs
.regs
[29];
485 if (!access_ok(VERIFY_READ
, frame
, sizeof(*frame
)))
487 if (__copy_conv_sigset_from_user(&blocked
, &frame
->sf_mask
))
490 sigdelsetmask(&blocked
, ~_BLOCKABLE
);
491 spin_lock_irq(¤t
->sighand
->siglock
);
492 current
->blocked
= blocked
;
494 spin_unlock_irq(¤t
->sighand
->siglock
);
496 sig
= restore_sigcontext32(®s
, &frame
->sf_sc
);
500 force_sig(sig
, current
);
503 * Don't let your children do this ...
505 __asm__
__volatile__(
513 force_sig(SIGSEGV
, current
);
516 asmlinkage
void sys32_rt_sigreturn(nabi_no_regargs
struct pt_regs regs
)
518 struct rt_sigframe32 __user
*frame
;
525 frame
= (struct rt_sigframe32 __user
*) regs
.regs
[29];
526 if (!access_ok(VERIFY_READ
, frame
, sizeof(*frame
)))
528 if (__copy_conv_sigset_from_user(&set
, &frame
->rs_uc
.uc_sigmask
))
531 sigdelsetmask(&set
, ~_BLOCKABLE
);
532 spin_lock_irq(¤t
->sighand
->siglock
);
533 current
->blocked
= set
;
535 spin_unlock_irq(¤t
->sighand
->siglock
);
537 sig
= restore_sigcontext32(®s
, &frame
->rs_uc
.uc_mcontext
);
541 force_sig(sig
, current
);
543 /* The ucontext contains a stack32_t, so we must convert! */
544 if (__get_user(sp
, &frame
->rs_uc
.uc_stack
.ss_sp
))
546 st
.ss_sp
= (void __user
*)(long) sp
;
547 if (__get_user(st
.ss_size
, &frame
->rs_uc
.uc_stack
.ss_size
))
549 if (__get_user(st
.ss_flags
, &frame
->rs_uc
.uc_stack
.ss_flags
))
552 /* It is more difficult to avoid calling this function than to
553 call it and ignore errors. */
556 do_sigaltstack((stack_t __user
*)&st
, NULL
, regs
.regs
[29]);
560 * Don't let your children do this ...
562 __asm__
__volatile__(
570 force_sig(SIGSEGV
, current
);
573 static int setup_frame_32(void *sig_return
, struct k_sigaction
*ka
,
574 struct pt_regs
*regs
, int signr
, sigset_t
*set
)
576 struct sigframe32 __user
*frame
;
579 frame
= get_sigframe(ka
, regs
, sizeof(*frame
));
580 if (!access_ok(VERIFY_WRITE
, frame
, sizeof (*frame
)))
583 err
|= setup_sigcontext32(regs
, &frame
->sf_sc
);
584 err
|= __copy_conv_sigset_to_user(&frame
->sf_mask
, set
);
590 * Arguments to signal handler:
593 * a1 = 0 (should be cause)
594 * a2 = pointer to struct sigcontext
596 * $25 and c0_epc point to the signal handler, $29 points to the
599 regs
->regs
[ 4] = signr
;
601 regs
->regs
[ 6] = (unsigned long) &frame
->sf_sc
;
602 regs
->regs
[29] = (unsigned long) frame
;
603 regs
->regs
[31] = (unsigned long) sig_return
;
604 regs
->cp0_epc
= regs
->regs
[25] = (unsigned long) ka
->sa
.sa_handler
;
606 DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
607 current
->comm
, current
->pid
,
608 frame
, regs
->cp0_epc
, regs
->regs
[31]);
613 force_sigsegv(signr
, current
);
617 static int setup_rt_frame_32(void *sig_return
, struct k_sigaction
*ka
,
618 struct pt_regs
*regs
, int signr
, sigset_t
*set
,
621 struct rt_sigframe32 __user
*frame
;
625 frame
= get_sigframe(ka
, regs
, sizeof(*frame
));
626 if (!access_ok(VERIFY_WRITE
, frame
, sizeof (*frame
)))
629 /* Convert (siginfo_t -> compat_siginfo_t) and copy to user. */
630 err
|= copy_siginfo_to_user32(&frame
->rs_info
, info
);
632 /* Create the ucontext. */
633 err
|= __put_user(0, &frame
->rs_uc
.uc_flags
);
634 err
|= __put_user(0, &frame
->rs_uc
.uc_link
);
635 sp
= (int) (long) current
->sas_ss_sp
;
636 err
|= __put_user(sp
,
637 &frame
->rs_uc
.uc_stack
.ss_sp
);
638 err
|= __put_user(sas_ss_flags(regs
->regs
[29]),
639 &frame
->rs_uc
.uc_stack
.ss_flags
);
640 err
|= __put_user(current
->sas_ss_size
,
641 &frame
->rs_uc
.uc_stack
.ss_size
);
642 err
|= setup_sigcontext32(regs
, &frame
->rs_uc
.uc_mcontext
);
643 err
|= __copy_conv_sigset_to_user(&frame
->rs_uc
.uc_sigmask
, set
);
649 * Arguments to signal handler:
652 * a1 = 0 (should be cause)
653 * a2 = pointer to ucontext
655 * $25 and c0_epc point to the signal handler, $29 points to
656 * the struct rt_sigframe32.
658 regs
->regs
[ 4] = signr
;
659 regs
->regs
[ 5] = (unsigned long) &frame
->rs_info
;
660 regs
->regs
[ 6] = (unsigned long) &frame
->rs_uc
;
661 regs
->regs
[29] = (unsigned long) frame
;
662 regs
->regs
[31] = (unsigned long) sig_return
;
663 regs
->cp0_epc
= regs
->regs
[25] = (unsigned long) ka
->sa
.sa_handler
;
665 DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
666 current
->comm
, current
->pid
,
667 frame
, regs
->cp0_epc
, regs
->regs
[31]);
672 force_sigsegv(signr
, current
);
677 * o32 compatibility on 64-bit kernels, without DSP ASE
679 struct mips_abi mips_abi_32
= {
680 .setup_frame
= setup_frame_32
,
681 .signal_return_offset
=
682 offsetof(struct mips_vdso
, o32_signal_trampoline
),
683 .setup_rt_frame
= setup_rt_frame_32
,
684 .rt_signal_return_offset
=
685 offsetof(struct mips_vdso
, o32_rt_signal_trampoline
),
686 .restart
= __NR_O32_restart_syscall
689 SYSCALL_DEFINE4(32_rt_sigaction
, int, sig
,
690 const struct sigaction32 __user
*, act
,
691 struct sigaction32 __user
*, oact
, unsigned int, sigsetsize
)
693 struct k_sigaction new_sa
, old_sa
;
696 /* XXX: Don't preclude handling different sized sigset_t's. */
697 if (sigsetsize
!= sizeof(sigset_t
))
704 if (!access_ok(VERIFY_READ
, act
, sizeof(*act
)))
706 err
|= __get_user(handler
, &act
->sa_handler
);
707 new_sa
.sa
.sa_handler
= (void __user
*)(s64
)handler
;
708 err
|= __get_user(new_sa
.sa
.sa_flags
, &act
->sa_flags
);
709 err
|= get_sigset(&new_sa
.sa
.sa_mask
, &act
->sa_mask
);
714 ret
= do_sigaction(sig
, act
? &new_sa
: NULL
, oact
? &old_sa
: NULL
);
719 if (!access_ok(VERIFY_WRITE
, oact
, sizeof(*oact
)))
722 err
|= __put_user((u32
)(u64
)old_sa
.sa
.sa_handler
,
724 err
|= __put_user(old_sa
.sa
.sa_flags
, &oact
->sa_flags
);
725 err
|= put_sigset(&old_sa
.sa
.sa_mask
, &oact
->sa_mask
);
733 SYSCALL_DEFINE4(32_rt_sigprocmask
, int, how
, compat_sigset_t __user
*, set
,
734 compat_sigset_t __user
*, oset
, unsigned int, sigsetsize
)
736 sigset_t old_set
, new_set
;
738 mm_segment_t old_fs
= get_fs();
740 if (set
&& get_sigset(&new_set
, set
))
744 ret
= sys_rt_sigprocmask(how
, set
? (sigset_t __user
*)&new_set
: NULL
,
745 oset
? (sigset_t __user
*)&old_set
: NULL
,
749 if (!ret
&& oset
&& put_sigset(&old_set
, oset
))
755 SYSCALL_DEFINE2(32_rt_sigpending
, compat_sigset_t __user
*, uset
,
756 unsigned int, sigsetsize
)
760 mm_segment_t old_fs
= get_fs();
763 ret
= sys_rt_sigpending((sigset_t __user
*)&set
, sigsetsize
);
766 if (!ret
&& put_sigset(&set
, uset
))
772 SYSCALL_DEFINE3(32_rt_sigqueueinfo
, int, pid
, int, sig
,
773 compat_siginfo_t __user
*, uinfo
)
777 mm_segment_t old_fs
= get_fs();
779 if (copy_from_user(&info
, uinfo
, 3*sizeof(int)) ||
780 copy_from_user(info
._sifields
._pad
, uinfo
->_sifields
._pad
, SI_PAD_SIZE
))
783 ret
= sys_rt_sigqueueinfo(pid
, sig
, (siginfo_t __user
*)&info
);
788 SYSCALL_DEFINE5(32_waitid
, int, which
, compat_pid_t
, pid
,
789 compat_siginfo_t __user
*, uinfo
, int, options
,
790 struct compat_rusage __user
*, uru
)
795 mm_segment_t old_fs
= get_fs();
799 ret
= sys_waitid(which
, pid
, (siginfo_t __user
*) &info
, options
,
800 uru
? (struct rusage __user
*) &ru
: NULL
);
803 if (ret
< 0 || info
.si_signo
== 0)
806 if (uru
&& (ret
= put_compat_rusage(&ru
, uru
)))
809 BUG_ON(info
.si_code
& __SI_MASK
);
810 info
.si_code
|= __SI_CHLD
;
811 return copy_siginfo_to_user32(uinfo
, &info
);
814 static int signal32_init(void)
817 save_fp_context32
= _save_fp_context32
;
818 restore_fp_context32
= _restore_fp_context32
;
820 save_fp_context32
= fpu_emulator_save_context32
;
821 restore_fp_context32
= fpu_emulator_restore_context32
;
827 arch_initcall(signal32_init
);