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/compat.h>
22 #include <linux/suspend.h>
23 #include <linux/compiler.h>
24 #include <linux/uaccess.h>
28 #include <asm/compat-signal.h>
29 #include <linux/bitops.h>
30 #include <asm/cacheflush.h>
32 #include <asm/ucontext.h>
33 #include <asm/system.h>
38 #include "signal-common.h"
41 * Including <asm/unistd.h> would give use the 64-bit syscall numbers ...
43 #define __NR_O32_restart_syscall 4253
45 /* 32-bit compatibility types */
47 typedef unsigned int __sighandler32_t
;
48 typedef void (*vfptr_t
)(void);
51 unsigned int sa_flags
;
52 __sighandler32_t sa_handler
;
53 compat_sigset_t sa_mask
;
56 /* IRIX compatible stack_t */
57 typedef struct sigaltstack32
{
59 compat_size_t ss_size
;
67 struct sigcontext32 uc_mcontext
;
68 compat_sigset_t uc_sigmask
; /* mask last for extensibility */
72 u32 sf_ass
[4]; /* argument save space for o32 */
73 u32 sf_pad
[2]; /* Was: signal trampoline */
74 struct sigcontext32 sf_sc
;
75 compat_sigset_t sf_mask
;
78 struct rt_sigframe32
{
79 u32 rs_ass
[4]; /* argument save space for o32 */
80 u32 rs_pad
[2]; /* Was: signal trampoline */
81 compat_siginfo_t rs_info
;
82 struct ucontext32 rs_uc
;
88 static int protected_save_fp_context32(struct sigcontext32 __user
*sc
)
94 err
= save_fp_context32(sc
); /* this might fail */
98 /* touch the sigcontext and try again */
99 err
= __put_user(0, &sc
->sc_fpregs
[0]) |
100 __put_user(0, &sc
->sc_fpregs
[31]) |
101 __put_user(0, &sc
->sc_fpc_csr
);
103 break; /* really bad sigcontext */
108 static int protected_restore_fp_context32(struct sigcontext32 __user
*sc
)
110 int err
, tmp __maybe_unused
;
114 err
= restore_fp_context32(sc
); /* this might fail */
118 /* touch the sigcontext and try again */
119 err
= __get_user(tmp
, &sc
->sc_fpregs
[0]) |
120 __get_user(tmp
, &sc
->sc_fpregs
[31]) |
121 __get_user(tmp
, &sc
->sc_fpc_csr
);
123 break; /* really bad sigcontext */
128 static int setup_sigcontext32(struct pt_regs
*regs
,
129 struct sigcontext32 __user
*sc
)
135 err
|= __put_user(regs
->cp0_epc
, &sc
->sc_pc
);
137 err
|= __put_user(0, &sc
->sc_regs
[0]);
138 for (i
= 1; i
< 32; i
++)
139 err
|= __put_user(regs
->regs
[i
], &sc
->sc_regs
[i
]);
141 err
|= __put_user(regs
->hi
, &sc
->sc_mdhi
);
142 err
|= __put_user(regs
->lo
, &sc
->sc_mdlo
);
144 err
|= __put_user(rddsp(DSP_MASK
), &sc
->sc_dsp
);
145 err
|= __put_user(mfhi1(), &sc
->sc_hi1
);
146 err
|= __put_user(mflo1(), &sc
->sc_lo1
);
147 err
|= __put_user(mfhi2(), &sc
->sc_hi2
);
148 err
|= __put_user(mflo2(), &sc
->sc_lo2
);
149 err
|= __put_user(mfhi3(), &sc
->sc_hi3
);
150 err
|= __put_user(mflo3(), &sc
->sc_lo3
);
153 used_math
= !!used_math();
154 err
|= __put_user(used_math
, &sc
->sc_used_math
);
158 * Save FPU state to signal context. Signal handler
159 * will "inherit" current FPU state.
161 err
|= protected_save_fp_context32(sc
);
167 check_and_restore_fp_context32(struct sigcontext32 __user
*sc
)
171 err
= sig
= fpcsr_pending(&sc
->sc_fpc_csr
);
174 err
|= protected_restore_fp_context32(sc
);
178 static int restore_sigcontext32(struct pt_regs
*regs
,
179 struct sigcontext32 __user
*sc
)
186 /* Always make any pending restarted system calls return -EINTR */
187 current_thread_info()->restart_block
.fn
= do_no_restart_syscall
;
189 err
|= __get_user(regs
->cp0_epc
, &sc
->sc_pc
);
190 err
|= __get_user(regs
->hi
, &sc
->sc_mdhi
);
191 err
|= __get_user(regs
->lo
, &sc
->sc_mdlo
);
193 err
|= __get_user(treg
, &sc
->sc_hi1
); mthi1(treg
);
194 err
|= __get_user(treg
, &sc
->sc_lo1
); mtlo1(treg
);
195 err
|= __get_user(treg
, &sc
->sc_hi2
); mthi2(treg
);
196 err
|= __get_user(treg
, &sc
->sc_lo2
); mtlo2(treg
);
197 err
|= __get_user(treg
, &sc
->sc_hi3
); mthi3(treg
);
198 err
|= __get_user(treg
, &sc
->sc_lo3
); mtlo3(treg
);
199 err
|= __get_user(treg
, &sc
->sc_dsp
); wrdsp(treg
, DSP_MASK
);
202 for (i
= 1; i
< 32; i
++)
203 err
|= __get_user(regs
->regs
[i
], &sc
->sc_regs
[i
]);
205 err
|= __get_user(used_math
, &sc
->sc_used_math
);
206 conditional_used_math(used_math
);
209 /* restore fpu context if we have used it before */
211 err
= check_and_restore_fp_context32(sc
);
213 /* signal handler may have used FPU. Give it up. */
223 extern void __put_sigset_unknown_nsig(void);
224 extern void __get_sigset_unknown_nsig(void);
226 static inline int put_sigset(const sigset_t
*kbuf
, compat_sigset_t __user
*ubuf
)
230 if (!access_ok(VERIFY_WRITE
, ubuf
, sizeof(*ubuf
)))
233 switch (_NSIG_WORDS
) {
235 __put_sigset_unknown_nsig();
237 err
|= __put_user (kbuf
->sig
[1] >> 32, &ubuf
->sig
[3]);
238 err
|= __put_user (kbuf
->sig
[1] & 0xffffffff, &ubuf
->sig
[2]);
240 err
|= __put_user (kbuf
->sig
[0] >> 32, &ubuf
->sig
[1]);
241 err
|= __put_user (kbuf
->sig
[0] & 0xffffffff, &ubuf
->sig
[0]);
247 static inline int get_sigset(sigset_t
*kbuf
, const compat_sigset_t __user
*ubuf
)
250 unsigned long sig
[4];
252 if (!access_ok(VERIFY_READ
, ubuf
, sizeof(*ubuf
)))
255 switch (_NSIG_WORDS
) {
257 __get_sigset_unknown_nsig();
259 err
|= __get_user (sig
[3], &ubuf
->sig
[3]);
260 err
|= __get_user (sig
[2], &ubuf
->sig
[2]);
261 kbuf
->sig
[1] = sig
[2] | (sig
[3] << 32);
263 err
|= __get_user (sig
[1], &ubuf
->sig
[1]);
264 err
|= __get_user (sig
[0], &ubuf
->sig
[0]);
265 kbuf
->sig
[0] = sig
[0] | (sig
[1] << 32);
272 * Atomically swap in the new signal mask, and wait for a signal.
275 asmlinkage
int sys32_sigsuspend(nabi_no_regargs
struct pt_regs regs
)
277 compat_sigset_t __user
*uset
;
280 uset
= (compat_sigset_t __user
*) regs
.regs
[4];
281 if (get_sigset(&newset
, uset
))
283 sigdelsetmask(&newset
, ~_BLOCKABLE
);
285 spin_lock_irq(¤t
->sighand
->siglock
);
286 current
->saved_sigmask
= current
->blocked
;
287 current
->blocked
= newset
;
289 spin_unlock_irq(¤t
->sighand
->siglock
);
291 current
->state
= TASK_INTERRUPTIBLE
;
293 set_thread_flag(TIF_RESTORE_SIGMASK
);
294 return -ERESTARTNOHAND
;
297 asmlinkage
int sys32_rt_sigsuspend(nabi_no_regargs
struct pt_regs regs
)
299 compat_sigset_t __user
*uset
;
303 /* XXX Don't preclude handling different sized sigset_t's. */
304 sigsetsize
= regs
.regs
[5];
305 if (sigsetsize
!= sizeof(compat_sigset_t
))
308 uset
= (compat_sigset_t __user
*) regs
.regs
[4];
309 if (get_sigset(&newset
, uset
))
311 sigdelsetmask(&newset
, ~_BLOCKABLE
);
313 spin_lock_irq(¤t
->sighand
->siglock
);
314 current
->saved_sigmask
= current
->blocked
;
315 current
->blocked
= newset
;
317 spin_unlock_irq(¤t
->sighand
->siglock
);
319 current
->state
= TASK_INTERRUPTIBLE
;
321 set_thread_flag(TIF_RESTORE_SIGMASK
);
322 return -ERESTARTNOHAND
;
325 asmlinkage
int sys32_sigaction(int sig
, const struct sigaction32 __user
*act
,
326 struct sigaction32 __user
*oact
)
328 struct k_sigaction new_ka
, old_ka
;
336 if (!access_ok(VERIFY_READ
, act
, sizeof(*act
)))
338 err
|= __get_user(handler
, &act
->sa_handler
);
339 new_ka
.sa
.sa_handler
= (void __user
*)(s64
)handler
;
340 err
|= __get_user(new_ka
.sa
.sa_flags
, &act
->sa_flags
);
341 err
|= __get_user(mask
, &act
->sa_mask
.sig
[0]);
345 siginitset(&new_ka
.sa
.sa_mask
, mask
);
348 ret
= do_sigaction(sig
, act
? &new_ka
: NULL
, oact
? &old_ka
: NULL
);
351 if (!access_ok(VERIFY_WRITE
, oact
, sizeof(*oact
)))
353 err
|= __put_user(old_ka
.sa
.sa_flags
, &oact
->sa_flags
);
354 err
|= __put_user((u32
)(u64
)old_ka
.sa
.sa_handler
,
356 err
|= __put_user(old_ka
.sa
.sa_mask
.sig
[0], oact
->sa_mask
.sig
);
357 err
|= __put_user(0, &oact
->sa_mask
.sig
[1]);
358 err
|= __put_user(0, &oact
->sa_mask
.sig
[2]);
359 err
|= __put_user(0, &oact
->sa_mask
.sig
[3]);
367 asmlinkage
int sys32_sigaltstack(nabi_no_regargs
struct pt_regs regs
)
369 const stack32_t __user
*uss
= (const stack32_t __user
*) regs
.regs
[4];
370 stack32_t __user
*uoss
= (stack32_t __user
*) regs
.regs
[5];
371 unsigned long usp
= regs
.regs
[29];
374 mm_segment_t old_fs
= get_fs();
378 if (!access_ok(VERIFY_READ
, uss
, sizeof(*uss
)))
380 err
|= __get_user(sp
, &uss
->ss_sp
);
381 kss
.ss_sp
= (void __user
*) (long) sp
;
382 err
|= __get_user(kss
.ss_size
, &uss
->ss_size
);
383 err
|= __get_user(kss
.ss_flags
, &uss
->ss_flags
);
389 ret
= do_sigaltstack(uss
? (stack_t __user
*)&kss
: NULL
,
390 uoss
? (stack_t __user
*)&koss
: NULL
, usp
);
394 if (!access_ok(VERIFY_WRITE
, uoss
, sizeof(*uoss
)))
396 sp
= (int) (unsigned long) koss
.ss_sp
;
397 err
|= __put_user(sp
, &uoss
->ss_sp
);
398 err
|= __put_user(koss
.ss_size
, &uoss
->ss_size
);
399 err
|= __put_user(koss
.ss_flags
, &uoss
->ss_flags
);
406 int copy_siginfo_to_user32(compat_siginfo_t __user
*to
, siginfo_t
*from
)
410 if (!access_ok (VERIFY_WRITE
, to
, sizeof(compat_siginfo_t
)))
413 /* If you change siginfo_t structure, please be sure
414 this code is fixed accordingly.
415 It should never copy any pad contained in the structure
416 to avoid security leaks, but must copy the generic
417 3 ints plus the relevant union member.
418 This routine must convert siginfo from 64bit to 32bit as well
420 err
= __put_user(from
->si_signo
, &to
->si_signo
);
421 err
|= __put_user(from
->si_errno
, &to
->si_errno
);
422 err
|= __put_user((short)from
->si_code
, &to
->si_code
);
423 if (from
->si_code
< 0)
424 err
|= __copy_to_user(&to
->_sifields
._pad
, &from
->_sifields
._pad
, SI_PAD_SIZE
);
426 switch (from
->si_code
>> 16) {
427 case __SI_TIMER
>> 16:
428 err
|= __put_user(from
->si_tid
, &to
->si_tid
);
429 err
|= __put_user(from
->si_overrun
, &to
->si_overrun
);
430 err
|= __put_user(from
->si_int
, &to
->si_int
);
432 case __SI_CHLD
>> 16:
433 err
|= __put_user(from
->si_utime
, &to
->si_utime
);
434 err
|= __put_user(from
->si_stime
, &to
->si_stime
);
435 err
|= __put_user(from
->si_status
, &to
->si_status
);
437 err
|= __put_user(from
->si_pid
, &to
->si_pid
);
438 err
|= __put_user(from
->si_uid
, &to
->si_uid
);
440 case __SI_FAULT
>> 16:
441 err
|= __put_user((unsigned long)from
->si_addr
, &to
->si_addr
);
443 case __SI_POLL
>> 16:
444 err
|= __put_user(from
->si_band
, &to
->si_band
);
445 err
|= __put_user(from
->si_fd
, &to
->si_fd
);
447 case __SI_RT
>> 16: /* This is not generated by the kernel as of now. */
448 case __SI_MESGQ
>> 16:
449 err
|= __put_user(from
->si_pid
, &to
->si_pid
);
450 err
|= __put_user(from
->si_uid
, &to
->si_uid
);
451 err
|= __put_user(from
->si_int
, &to
->si_int
);
458 asmlinkage
void sys32_sigreturn(nabi_no_regargs
struct pt_regs regs
)
460 struct sigframe32 __user
*frame
;
464 frame
= (struct sigframe32 __user
*) regs
.regs
[29];
465 if (!access_ok(VERIFY_READ
, frame
, sizeof(*frame
)))
467 if (__copy_conv_sigset_from_user(&blocked
, &frame
->sf_mask
))
470 sigdelsetmask(&blocked
, ~_BLOCKABLE
);
471 spin_lock_irq(¤t
->sighand
->siglock
);
472 current
->blocked
= blocked
;
474 spin_unlock_irq(¤t
->sighand
->siglock
);
476 sig
= restore_sigcontext32(®s
, &frame
->sf_sc
);
480 force_sig(sig
, current
);
483 * Don't let your children do this ...
485 __asm__
__volatile__(
493 force_sig(SIGSEGV
, current
);
496 asmlinkage
void sys32_rt_sigreturn(nabi_no_regargs
struct pt_regs regs
)
498 struct rt_sigframe32 __user
*frame
;
505 frame
= (struct rt_sigframe32 __user
*) regs
.regs
[29];
506 if (!access_ok(VERIFY_READ
, frame
, sizeof(*frame
)))
508 if (__copy_conv_sigset_from_user(&set
, &frame
->rs_uc
.uc_sigmask
))
511 sigdelsetmask(&set
, ~_BLOCKABLE
);
512 spin_lock_irq(¤t
->sighand
->siglock
);
513 current
->blocked
= set
;
515 spin_unlock_irq(¤t
->sighand
->siglock
);
517 sig
= restore_sigcontext32(®s
, &frame
->rs_uc
.uc_mcontext
);
521 force_sig(sig
, current
);
523 /* The ucontext contains a stack32_t, so we must convert! */
524 if (__get_user(sp
, &frame
->rs_uc
.uc_stack
.ss_sp
))
526 st
.ss_sp
= (void __user
*)(long) sp
;
527 if (__get_user(st
.ss_size
, &frame
->rs_uc
.uc_stack
.ss_size
))
529 if (__get_user(st
.ss_flags
, &frame
->rs_uc
.uc_stack
.ss_flags
))
532 /* It is more difficult to avoid calling this function than to
533 call it and ignore errors. */
536 do_sigaltstack((stack_t __user
*)&st
, NULL
, regs
.regs
[29]);
540 * Don't let your children do this ...
542 __asm__
__volatile__(
550 force_sig(SIGSEGV
, current
);
553 static int setup_frame_32(void *sig_return
, struct k_sigaction
*ka
,
554 struct pt_regs
*regs
, int signr
, sigset_t
*set
)
556 struct sigframe32 __user
*frame
;
559 frame
= get_sigframe(ka
, regs
, sizeof(*frame
));
560 if (!access_ok(VERIFY_WRITE
, frame
, sizeof (*frame
)))
563 err
|= setup_sigcontext32(regs
, &frame
->sf_sc
);
564 err
|= __copy_conv_sigset_to_user(&frame
->sf_mask
, set
);
570 * Arguments to signal handler:
573 * a1 = 0 (should be cause)
574 * a2 = pointer to struct sigcontext
576 * $25 and c0_epc point to the signal handler, $29 points to the
579 regs
->regs
[ 4] = signr
;
581 regs
->regs
[ 6] = (unsigned long) &frame
->sf_sc
;
582 regs
->regs
[29] = (unsigned long) frame
;
583 regs
->regs
[31] = (unsigned long) sig_return
;
584 regs
->cp0_epc
= regs
->regs
[25] = (unsigned long) ka
->sa
.sa_handler
;
586 DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
587 current
->comm
, current
->pid
,
588 frame
, regs
->cp0_epc
, regs
->regs
[31]);
593 force_sigsegv(signr
, current
);
597 static int setup_rt_frame_32(void *sig_return
, struct k_sigaction
*ka
,
598 struct pt_regs
*regs
, int signr
, sigset_t
*set
,
601 struct rt_sigframe32 __user
*frame
;
605 frame
= get_sigframe(ka
, regs
, sizeof(*frame
));
606 if (!access_ok(VERIFY_WRITE
, frame
, sizeof (*frame
)))
609 /* Convert (siginfo_t -> compat_siginfo_t) and copy to user. */
610 err
|= copy_siginfo_to_user32(&frame
->rs_info
, info
);
612 /* Create the ucontext. */
613 err
|= __put_user(0, &frame
->rs_uc
.uc_flags
);
614 err
|= __put_user(0, &frame
->rs_uc
.uc_link
);
615 sp
= (int) (long) current
->sas_ss_sp
;
616 err
|= __put_user(sp
,
617 &frame
->rs_uc
.uc_stack
.ss_sp
);
618 err
|= __put_user(sas_ss_flags(regs
->regs
[29]),
619 &frame
->rs_uc
.uc_stack
.ss_flags
);
620 err
|= __put_user(current
->sas_ss_size
,
621 &frame
->rs_uc
.uc_stack
.ss_size
);
622 err
|= setup_sigcontext32(regs
, &frame
->rs_uc
.uc_mcontext
);
623 err
|= __copy_conv_sigset_to_user(&frame
->rs_uc
.uc_sigmask
, set
);
629 * Arguments to signal handler:
632 * a1 = 0 (should be cause)
633 * a2 = pointer to ucontext
635 * $25 and c0_epc point to the signal handler, $29 points to
636 * the struct rt_sigframe32.
638 regs
->regs
[ 4] = signr
;
639 regs
->regs
[ 5] = (unsigned long) &frame
->rs_info
;
640 regs
->regs
[ 6] = (unsigned long) &frame
->rs_uc
;
641 regs
->regs
[29] = (unsigned long) frame
;
642 regs
->regs
[31] = (unsigned long) sig_return
;
643 regs
->cp0_epc
= regs
->regs
[25] = (unsigned long) ka
->sa
.sa_handler
;
645 DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
646 current
->comm
, current
->pid
,
647 frame
, regs
->cp0_epc
, regs
->regs
[31]);
652 force_sigsegv(signr
, current
);
657 * o32 compatibility on 64-bit kernels, without DSP ASE
659 struct mips_abi mips_abi_32
= {
660 .setup_frame
= setup_frame_32
,
661 .signal_return_offset
=
662 offsetof(struct mips_vdso
, o32_signal_trampoline
),
663 .setup_rt_frame
= setup_rt_frame_32
,
664 .rt_signal_return_offset
=
665 offsetof(struct mips_vdso
, o32_rt_signal_trampoline
),
666 .restart
= __NR_O32_restart_syscall
669 asmlinkage
int sys32_rt_sigaction(int sig
, const struct sigaction32 __user
*act
,
670 struct sigaction32 __user
*oact
,
671 unsigned int sigsetsize
)
673 struct k_sigaction new_sa
, old_sa
;
676 /* XXX: Don't preclude handling different sized sigset_t's. */
677 if (sigsetsize
!= sizeof(sigset_t
))
684 if (!access_ok(VERIFY_READ
, act
, sizeof(*act
)))
686 err
|= __get_user(handler
, &act
->sa_handler
);
687 new_sa
.sa
.sa_handler
= (void __user
*)(s64
)handler
;
688 err
|= __get_user(new_sa
.sa
.sa_flags
, &act
->sa_flags
);
689 err
|= get_sigset(&new_sa
.sa
.sa_mask
, &act
->sa_mask
);
694 ret
= do_sigaction(sig
, act
? &new_sa
: NULL
, oact
? &old_sa
: NULL
);
699 if (!access_ok(VERIFY_WRITE
, oact
, sizeof(*oact
)))
702 err
|= __put_user((u32
)(u64
)old_sa
.sa
.sa_handler
,
704 err
|= __put_user(old_sa
.sa
.sa_flags
, &oact
->sa_flags
);
705 err
|= put_sigset(&old_sa
.sa
.sa_mask
, &oact
->sa_mask
);
713 asmlinkage
int sys32_rt_sigprocmask(int how
, compat_sigset_t __user
*set
,
714 compat_sigset_t __user
*oset
, unsigned int sigsetsize
)
716 sigset_t old_set
, new_set
;
718 mm_segment_t old_fs
= get_fs();
720 if (set
&& get_sigset(&new_set
, set
))
724 ret
= sys_rt_sigprocmask(how
, set
? (sigset_t __user
*)&new_set
: NULL
,
725 oset
? (sigset_t __user
*)&old_set
: NULL
,
729 if (!ret
&& oset
&& put_sigset(&old_set
, oset
))
735 asmlinkage
int sys32_rt_sigpending(compat_sigset_t __user
*uset
,
736 unsigned int sigsetsize
)
740 mm_segment_t old_fs
= get_fs();
743 ret
= sys_rt_sigpending((sigset_t __user
*)&set
, sigsetsize
);
746 if (!ret
&& put_sigset(&set
, uset
))
752 asmlinkage
int sys32_rt_sigqueueinfo(int pid
, int sig
, compat_siginfo_t __user
*uinfo
)
756 mm_segment_t old_fs
= get_fs();
758 if (copy_from_user (&info
, uinfo
, 3*sizeof(int)) ||
759 copy_from_user (info
._sifields
._pad
, uinfo
->_sifields
._pad
, SI_PAD_SIZE
))
762 ret
= sys_rt_sigqueueinfo(pid
, sig
, (siginfo_t __user
*)&info
);
768 sys32_waitid(int which
, compat_pid_t pid
,
769 compat_siginfo_t __user
*uinfo
, int options
,
770 struct compat_rusage __user
*uru
)
775 mm_segment_t old_fs
= get_fs();
779 ret
= sys_waitid(which
, pid
, (siginfo_t __user
*) &info
, options
,
780 uru
? (struct rusage __user
*) &ru
: NULL
);
783 if (ret
< 0 || info
.si_signo
== 0)
786 if (uru
&& (ret
= put_compat_rusage(&ru
, uru
)))
789 BUG_ON(info
.si_code
& __SI_MASK
);
790 info
.si_code
|= __SI_CHLD
;
791 return copy_siginfo_to_user32(uinfo
, &info
);