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/sched.h>
13 #include <linux/smp.h>
14 #include <linux/smp_lock.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>
27 #include <linux/bitops.h>
28 #include <asm/cacheflush.h>
30 #include <asm/uaccess.h>
31 #include <asm/ucontext.h>
32 #include <asm/system.h>
36 #define SI_PAD_SIZE32 ((SI_MAX_SIZE/sizeof(int)) - 3)
38 typedef struct compat_siginfo
{
44 int _pad
[SI_PAD_SIZE32
];
48 compat_pid_t _pid
; /* sender's pid */
49 compat_uid_t _uid
; /* sender's uid */
54 compat_pid_t _pid
; /* which child */
55 compat_uid_t _uid
; /* sender's uid */
56 int _status
; /* exit code */
57 compat_clock_t _utime
;
58 compat_clock_t _stime
;
63 compat_pid_t _pid
; /* which child */
64 compat_clock_t _utime
;
65 int _status
; /* exit code */
66 compat_clock_t _stime
;
69 /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
71 s32 _addr
; /* faulting insn/memory ref. */
74 /* SIGPOLL, SIGXFSZ (To do ...) */
76 int _band
; /* POLL_IN, POLL_OUT, POLL_MSG */
82 timer_t _tid
; /* timer id */
83 int _overrun
; /* overrun count */
84 compat_sigval_t _sigval
;/* same as below */
85 int _sys_private
; /* not to be passed to user */
88 /* POSIX.1b signals */
90 compat_pid_t _pid
; /* sender's pid */
91 compat_uid_t _uid
; /* sender's uid */
92 compat_sigval_t _sigval
;
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 /* 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 #if ICACHE_REFILLS_WORKAROUND_WAR == 0
144 struct rt_sigframe32
{
145 u32 rs_ass
[4]; /* argument save space for o32 */
146 u32 rs_code
[2]; /* signal trampoline */
147 compat_siginfo_t rs_info
;
148 struct ucontext32 rs_uc
;
151 #else /* ICACHE_REFILLS_WORKAROUND_WAR */
153 struct rt_sigframe32
{
154 u32 rs_ass
[4]; /* argument save space for o32 */
156 compat_siginfo_t rs_info
;
157 struct ucontext32 rs_uc
;
158 u32 rs_code
[8] __attribute__((aligned(32))); /* signal trampoline */
161 #endif /* !ICACHE_REFILLS_WORKAROUND_WAR */
163 extern void __put_sigset_unknown_nsig(void);
164 extern void __get_sigset_unknown_nsig(void);
166 static inline int put_sigset(const sigset_t
*kbuf
, compat_sigset_t __user
*ubuf
)
170 if (!access_ok(VERIFY_WRITE
, ubuf
, sizeof(*ubuf
)))
173 switch (_NSIG_WORDS
) {
175 __put_sigset_unknown_nsig();
177 err
|= __put_user (kbuf
->sig
[1] >> 32, &ubuf
->sig
[3]);
178 err
|= __put_user (kbuf
->sig
[1] & 0xffffffff, &ubuf
->sig
[2]);
180 err
|= __put_user (kbuf
->sig
[0] >> 32, &ubuf
->sig
[1]);
181 err
|= __put_user (kbuf
->sig
[0] & 0xffffffff, &ubuf
->sig
[0]);
187 static inline int get_sigset(sigset_t
*kbuf
, const compat_sigset_t __user
*ubuf
)
190 unsigned long sig
[4];
192 if (!access_ok(VERIFY_READ
, ubuf
, sizeof(*ubuf
)))
195 switch (_NSIG_WORDS
) {
197 __get_sigset_unknown_nsig();
199 err
|= __get_user (sig
[3], &ubuf
->sig
[3]);
200 err
|= __get_user (sig
[2], &ubuf
->sig
[2]);
201 kbuf
->sig
[1] = sig
[2] | (sig
[3] << 32);
203 err
|= __get_user (sig
[1], &ubuf
->sig
[1]);
204 err
|= __get_user (sig
[0], &ubuf
->sig
[0]);
205 kbuf
->sig
[0] = sig
[0] | (sig
[1] << 32);
212 * Atomically swap in the new signal mask, and wait for a signal.
215 save_static_function(sys32_sigsuspend
);
216 __attribute_used__ noinline
static int
217 _sys32_sigsuspend(nabi_no_regargs
struct pt_regs regs
)
219 compat_sigset_t __user
*uset
;
222 uset
= (compat_sigset_t __user
*) regs
.regs
[4];
223 if (get_sigset(&newset
, uset
))
225 sigdelsetmask(&newset
, ~_BLOCKABLE
);
227 spin_lock_irq(¤t
->sighand
->siglock
);
228 current
->saved_sigmask
= current
->blocked
;
229 current
->blocked
= newset
;
231 spin_unlock_irq(¤t
->sighand
->siglock
);
233 current
->state
= TASK_INTERRUPTIBLE
;
235 set_thread_flag(TIF_RESTORE_SIGMASK
);
236 return -ERESTARTNOHAND
;
239 save_static_function(sys32_rt_sigsuspend
);
240 __attribute_used__ noinline
static int
241 _sys32_rt_sigsuspend(nabi_no_regargs
struct pt_regs regs
)
243 compat_sigset_t __user
*uset
;
247 /* XXX Don't preclude handling different sized sigset_t's. */
248 sigsetsize
= regs
.regs
[5];
249 if (sigsetsize
!= sizeof(compat_sigset_t
))
252 uset
= (compat_sigset_t __user
*) regs
.regs
[4];
253 if (get_sigset(&newset
, uset
))
255 sigdelsetmask(&newset
, ~_BLOCKABLE
);
257 spin_lock_irq(¤t
->sighand
->siglock
);
258 current
->saved_sigmask
= current
->blocked
;
259 current
->blocked
= newset
;
261 spin_unlock_irq(¤t
->sighand
->siglock
);
263 current
->state
= TASK_INTERRUPTIBLE
;
265 set_thread_flag(TIF_RESTORE_SIGMASK
);
266 return -ERESTARTNOHAND
;
269 asmlinkage
int sys32_sigaction(int sig
, const struct sigaction32 __user
*act
,
270 struct sigaction32 __user
*oact
)
272 struct k_sigaction new_ka
, old_ka
;
280 if (!access_ok(VERIFY_READ
, act
, sizeof(*act
)))
282 err
|= __get_user(handler
, &act
->sa_handler
);
283 new_ka
.sa
.sa_handler
= (void __user
*)(s64
)handler
;
284 err
|= __get_user(new_ka
.sa
.sa_flags
, &act
->sa_flags
);
285 err
|= __get_user(mask
, &act
->sa_mask
.sig
[0]);
289 siginitset(&new_ka
.sa
.sa_mask
, mask
);
292 ret
= do_sigaction(sig
, act
? &new_ka
: NULL
, oact
? &old_ka
: NULL
);
295 if (!access_ok(VERIFY_WRITE
, oact
, sizeof(*oact
)))
297 err
|= __put_user(old_ka
.sa
.sa_flags
, &oact
->sa_flags
);
298 err
|= __put_user((u32
)(u64
)old_ka
.sa
.sa_handler
,
300 err
|= __put_user(old_ka
.sa
.sa_mask
.sig
[0], oact
->sa_mask
.sig
);
301 err
|= __put_user(0, &oact
->sa_mask
.sig
[1]);
302 err
|= __put_user(0, &oact
->sa_mask
.sig
[2]);
303 err
|= __put_user(0, &oact
->sa_mask
.sig
[3]);
311 asmlinkage
int sys32_sigaltstack(nabi_no_regargs
struct pt_regs regs
)
313 const stack32_t __user
*uss
= (const stack32_t __user
*) regs
.regs
[4];
314 stack32_t __user
*uoss
= (stack32_t __user
*) regs
.regs
[5];
315 unsigned long usp
= regs
.regs
[29];
318 mm_segment_t old_fs
= get_fs();
322 if (!access_ok(VERIFY_READ
, uss
, sizeof(*uss
)))
324 err
|= __get_user(sp
, &uss
->ss_sp
);
325 kss
.ss_sp
= (void __user
*) (long) sp
;
326 err
|= __get_user(kss
.ss_size
, &uss
->ss_size
);
327 err
|= __get_user(kss
.ss_flags
, &uss
->ss_flags
);
333 ret
= do_sigaltstack(uss
? (stack_t __user
*)&kss
: NULL
,
334 uoss
? (stack_t __user
*)&koss
: NULL
, usp
);
338 if (!access_ok(VERIFY_WRITE
, uoss
, sizeof(*uoss
)))
340 sp
= (int) (unsigned long) koss
.ss_sp
;
341 err
|= __put_user(sp
, &uoss
->ss_sp
);
342 err
|= __put_user(koss
.ss_size
, &uoss
->ss_size
);
343 err
|= __put_user(koss
.ss_flags
, &uoss
->ss_flags
);
350 static int restore_sigcontext32(struct pt_regs
*regs
, struct sigcontext32 __user
*sc
)
356 /* Always make any pending restarted system calls return -EINTR */
357 current_thread_info()->restart_block
.fn
= do_no_restart_syscall
;
359 err
|= __get_user(regs
->cp0_epc
, &sc
->sc_pc
);
360 err
|= __get_user(regs
->hi
, &sc
->sc_mdhi
);
361 err
|= __get_user(regs
->lo
, &sc
->sc_mdlo
);
363 err
|= __get_user(treg
, &sc
->sc_hi1
); mthi1(treg
);
364 err
|= __get_user(treg
, &sc
->sc_lo1
); mtlo1(treg
);
365 err
|= __get_user(treg
, &sc
->sc_hi2
); mthi2(treg
);
366 err
|= __get_user(treg
, &sc
->sc_lo2
); mtlo2(treg
);
367 err
|= __get_user(treg
, &sc
->sc_hi3
); mthi3(treg
);
368 err
|= __get_user(treg
, &sc
->sc_lo3
); mtlo3(treg
);
369 err
|= __get_user(treg
, &sc
->sc_dsp
); wrdsp(treg
, DSP_MASK
);
372 #define restore_gp_reg(i) do { \
373 err |= __get_user(regs->regs[i], &sc->sc_regs[i]); \
375 restore_gp_reg( 1); restore_gp_reg( 2); restore_gp_reg( 3);
376 restore_gp_reg( 4); restore_gp_reg( 5); restore_gp_reg( 6);
377 restore_gp_reg( 7); restore_gp_reg( 8); restore_gp_reg( 9);
378 restore_gp_reg(10); restore_gp_reg(11); restore_gp_reg(12);
379 restore_gp_reg(13); restore_gp_reg(14); restore_gp_reg(15);
380 restore_gp_reg(16); restore_gp_reg(17); restore_gp_reg(18);
381 restore_gp_reg(19); restore_gp_reg(20); restore_gp_reg(21);
382 restore_gp_reg(22); restore_gp_reg(23); restore_gp_reg(24);
383 restore_gp_reg(25); restore_gp_reg(26); restore_gp_reg(27);
384 restore_gp_reg(28); restore_gp_reg(29); restore_gp_reg(30);
386 #undef restore_gp_reg
388 err
|= __get_user(used_math
, &sc
->sc_used_math
);
389 conditional_used_math(used_math
);
394 /* restore fpu context if we have used it before */
396 err
|= restore_fp_context32(sc
);
398 /* signal handler may have used FPU. Give it up. */
407 int copy_siginfo_to_user32(compat_siginfo_t __user
*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((unsigned 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 __user
*frame
;
466 frame
= (struct sigframe __user
*) 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 __asm__
__volatile__(
492 force_sig(SIGSEGV
, current
);
495 save_static_function(sys32_rt_sigreturn
);
496 __attribute_used__ noinline
static void
497 _sys32_rt_sigreturn(nabi_no_regargs
struct pt_regs regs
)
499 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_from_user(&set
, &frame
->rs_uc
.uc_sigmask
, sizeof(set
)))
511 sigdelsetmask(&set
, ~_BLOCKABLE
);
512 spin_lock_irq(¤t
->sighand
->siglock
);
513 current
->blocked
= set
;
515 spin_unlock_irq(¤t
->sighand
->siglock
);
517 if (restore_sigcontext32(®s
, &frame
->rs_uc
.uc_mcontext
))
520 /* The ucontext contains a stack32_t, so we must convert! */
521 if (__get_user(sp
, &frame
->rs_uc
.uc_stack
.ss_sp
))
523 st
.ss_sp
= (void __user
*)(long) sp
;
524 if (__get_user(st
.ss_size
, &frame
->rs_uc
.uc_stack
.ss_size
))
526 if (__get_user(st
.ss_flags
, &frame
->rs_uc
.uc_stack
.ss_flags
))
529 /* It is more difficult to avoid calling this function than to
530 call it and ignore errors. */
533 do_sigaltstack((stack_t __user
*)&st
, NULL
, regs
.regs
[29]);
537 * Don't let your children do this ...
539 __asm__
__volatile__(
547 force_sig(SIGSEGV
, current
);
550 static inline int setup_sigcontext32(struct pt_regs
*regs
,
551 struct sigcontext32 __user
*sc
)
555 err
|= __put_user(regs
->cp0_epc
, &sc
->sc_pc
);
556 err
|= __put_user(regs
->cp0_status
, &sc
->sc_status
);
558 #define save_gp_reg(i) { \
559 err |= __put_user(regs->regs[i], &sc->sc_regs[i]); \
561 __put_user(0, &sc
->sc_regs
[0]); save_gp_reg(1); save_gp_reg(2);
562 save_gp_reg(3); save_gp_reg(4); save_gp_reg(5); save_gp_reg(6);
563 save_gp_reg(7); save_gp_reg(8); save_gp_reg(9); save_gp_reg(10);
564 save_gp_reg(11); save_gp_reg(12); save_gp_reg(13); save_gp_reg(14);
565 save_gp_reg(15); save_gp_reg(16); save_gp_reg(17); save_gp_reg(18);
566 save_gp_reg(19); save_gp_reg(20); save_gp_reg(21); save_gp_reg(22);
567 save_gp_reg(23); save_gp_reg(24); save_gp_reg(25); save_gp_reg(26);
568 save_gp_reg(27); save_gp_reg(28); save_gp_reg(29); save_gp_reg(30);
572 err
|= __put_user(regs
->hi
, &sc
->sc_mdhi
);
573 err
|= __put_user(regs
->lo
, &sc
->sc_mdlo
);
575 err
|= __put_user(rddsp(DSP_MASK
), &sc
->sc_dsp
);
576 err
|= __put_user(mfhi1(), &sc
->sc_hi1
);
577 err
|= __put_user(mflo1(), &sc
->sc_lo1
);
578 err
|= __put_user(mfhi2(), &sc
->sc_hi2
);
579 err
|= __put_user(mflo2(), &sc
->sc_lo2
);
580 err
|= __put_user(mfhi3(), &sc
->sc_hi3
);
581 err
|= __put_user(mflo3(), &sc
->sc_lo3
);
584 err
|= __put_user(!!used_math(), &sc
->sc_used_math
);
590 * Save FPU state to signal context. Signal handler will "inherit"
595 if (!is_fpu_owner()) {
599 err
|= save_fp_context32(sc
);
608 * Determine which stack to use..
610 static inline void __user
*get_sigframe(struct k_sigaction
*ka
,
611 struct pt_regs
*regs
,
616 /* Default to using normal stack */
620 * FPU emulator may have it's own trampoline active just
621 * above the user stack, 16-bytes before the next lowest
622 * 16 byte boundary. Try to avoid trashing it.
626 /* This is the X/Open sanctioned signal stack switching. */
627 if ((ka
->sa
.sa_flags
& SA_ONSTACK
) && (sas_ss_flags (sp
) == 0))
628 sp
= current
->sas_ss_sp
+ current
->sas_ss_size
;
630 return (void __user
*)((sp
- frame_size
) & ALMASK
);
633 int setup_frame_32(struct k_sigaction
* ka
, struct pt_regs
*regs
,
634 int signr
, sigset_t
*set
)
636 struct sigframe __user
*frame
;
639 frame
= get_sigframe(ka
, regs
, sizeof(*frame
));
640 if (!access_ok(VERIFY_WRITE
, frame
, sizeof (*frame
)))
644 * Set up the return code ...
646 * li v0, __NR_O32_sigreturn
649 err
|= __put_user(0x24020000 + __NR_O32_sigreturn
, frame
->sf_code
+ 0);
650 err
|= __put_user(0x0000000c , frame
->sf_code
+ 1);
651 flush_cache_sigtramp((unsigned long) frame
->sf_code
);
653 err
|= setup_sigcontext32(regs
, &frame
->sf_sc
);
654 err
|= __copy_to_user(&frame
->sf_mask
, set
, sizeof(*set
));
659 * Arguments to signal handler:
662 * a1 = 0 (should be cause)
663 * a2 = pointer to struct sigcontext
665 * $25 and c0_epc point to the signal handler, $29 points to the
668 regs
->regs
[ 4] = signr
;
670 regs
->regs
[ 6] = (unsigned long) &frame
->sf_sc
;
671 regs
->regs
[29] = (unsigned long) frame
;
672 regs
->regs
[31] = (unsigned long) frame
->sf_code
;
673 regs
->cp0_epc
= regs
->regs
[25] = (unsigned long) ka
->sa
.sa_handler
;
676 printk("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%p\n",
677 current
->comm
, current
->pid
,
678 frame
, regs
->cp0_epc
, frame
->sf_code
);
683 force_sigsegv(signr
, current
);
687 int setup_rt_frame_32(struct k_sigaction
* ka
, struct pt_regs
*regs
,
688 int signr
, sigset_t
*set
, siginfo_t
*info
)
690 struct rt_sigframe32 __user
*frame
;
694 frame
= get_sigframe(ka
, regs
, sizeof(*frame
));
695 if (!access_ok(VERIFY_WRITE
, frame
, sizeof (*frame
)))
698 /* Set up to return from userspace. If provided, use a stub already
701 * Set up the return code ...
703 * li v0, __NR_O32_rt_sigreturn
706 err
|= __put_user(0x24020000 + __NR_O32_rt_sigreturn
, frame
->rs_code
+ 0);
707 err
|= __put_user(0x0000000c , frame
->rs_code
+ 1);
708 flush_cache_sigtramp((unsigned long) frame
->rs_code
);
710 /* Convert (siginfo_t -> compat_siginfo_t) and copy to user. */
711 err
|= copy_siginfo_to_user32(&frame
->rs_info
, info
);
713 /* Create the ucontext. */
714 err
|= __put_user(0, &frame
->rs_uc
.uc_flags
);
715 err
|= __put_user(0, &frame
->rs_uc
.uc_link
);
716 sp
= (int) (long) current
->sas_ss_sp
;
717 err
|= __put_user(sp
,
718 &frame
->rs_uc
.uc_stack
.ss_sp
);
719 err
|= __put_user(sas_ss_flags(regs
->regs
[29]),
720 &frame
->rs_uc
.uc_stack
.ss_flags
);
721 err
|= __put_user(current
->sas_ss_size
,
722 &frame
->rs_uc
.uc_stack
.ss_size
);
723 err
|= setup_sigcontext32(regs
, &frame
->rs_uc
.uc_mcontext
);
724 err
|= __copy_to_user(&frame
->rs_uc
.uc_sigmask
, set
, sizeof(*set
));
730 * Arguments to signal handler:
733 * a1 = 0 (should be cause)
734 * a2 = pointer to ucontext
736 * $25 and c0_epc point to the signal handler, $29 points to
737 * the struct rt_sigframe32.
739 regs
->regs
[ 4] = signr
;
740 regs
->regs
[ 5] = (unsigned long) &frame
->rs_info
;
741 regs
->regs
[ 6] = (unsigned long) &frame
->rs_uc
;
742 regs
->regs
[29] = (unsigned long) frame
;
743 regs
->regs
[31] = (unsigned long) frame
->rs_code
;
744 regs
->cp0_epc
= regs
->regs
[25] = (unsigned long) ka
->sa
.sa_handler
;
747 printk("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%p\n",
748 current
->comm
, current
->pid
,
749 frame
, regs
->cp0_epc
, frame
->rs_code
);
754 force_sigsegv(signr
, current
);
758 static inline int handle_signal(unsigned long sig
, siginfo_t
*info
,
759 struct k_sigaction
*ka
, sigset_t
*oldset
, struct pt_regs
* regs
)
763 switch (regs
->regs
[0]) {
764 case ERESTART_RESTARTBLOCK
:
766 regs
->regs
[2] = EINTR
;
769 if (!(ka
->sa
.sa_flags
& SA_RESTART
)) {
770 regs
->regs
[2] = EINTR
;
774 case ERESTARTNOINTR
: /* Userland will reload $v0. */
775 regs
->regs
[7] = regs
->regs
[26];
779 regs
->regs
[0] = 0; /* Don't deal with this again. */
781 if (ka
->sa
.sa_flags
& SA_SIGINFO
)
782 ret
= current
->thread
.abi
->setup_rt_frame(ka
, regs
, sig
, oldset
, info
);
784 ret
= current
->thread
.abi
->setup_frame(ka
, regs
, sig
, oldset
);
786 spin_lock_irq(¤t
->sighand
->siglock
);
787 sigorsets(¤t
->blocked
,¤t
->blocked
,&ka
->sa
.sa_mask
);
788 if (!(ka
->sa
.sa_flags
& SA_NODEFER
))
789 sigaddset(¤t
->blocked
,sig
);
791 spin_unlock_irq(¤t
->sighand
->siglock
);
796 void do_signal32(struct pt_regs
*regs
)
798 struct k_sigaction ka
;
804 * We want the common case to go fast, which is why we may in certain
805 * cases get here from kernel mode. Just return without doing anything
808 if (!user_mode(regs
))
811 if (test_thread_flag(TIF_RESTORE_SIGMASK
))
812 oldset
= ¤t
->saved_sigmask
;
814 oldset
= ¤t
->blocked
;
816 signr
= get_signal_to_deliver(&info
, &ka
, regs
, NULL
);
818 /* Whee! Actually deliver the signal. */
819 if (handle_signal(signr
, &info
, &ka
, oldset
, regs
) == 0) {
821 * A signal was successfully delivered; the saved
822 * sigmask will have been stored in the signal frame,
823 * and will be restored by sigreturn, so we can simply
824 * clear the TIF_RESTORE_SIGMASK flag.
826 if (test_thread_flag(TIF_RESTORE_SIGMASK
))
827 clear_thread_flag(TIF_RESTORE_SIGMASK
);
834 * Who's code doesn't conform to the restartable syscall convention
835 * dies here!!! The li instruction, a single machine instruction,
836 * must directly be followed by the syscall instruction.
839 if (regs
->regs
[2] == ERESTARTNOHAND
||
840 regs
->regs
[2] == ERESTARTSYS
||
841 regs
->regs
[2] == ERESTARTNOINTR
) {
842 regs
->regs
[7] = regs
->regs
[26];
845 if (regs
->regs
[2] == ERESTART_RESTARTBLOCK
) {
846 regs
->regs
[2] = __NR_O32_restart_syscall
;
847 regs
->regs
[7] = regs
->regs
[26];
850 regs
->regs
[0] = 0; /* Don't deal with this again. */
854 * If there's no signal to deliver, we just put the saved sigmask
857 if (test_thread_flag(TIF_RESTORE_SIGMASK
)) {
858 clear_thread_flag(TIF_RESTORE_SIGMASK
);
859 sigprocmask(SIG_SETMASK
, ¤t
->saved_sigmask
, NULL
);
863 asmlinkage
int sys32_rt_sigaction(int sig
, const struct sigaction32 __user
*act
,
864 struct sigaction32 __user
*oact
,
865 unsigned int sigsetsize
)
867 struct k_sigaction new_sa
, old_sa
;
870 /* XXX: Don't preclude handling different sized sigset_t's. */
871 if (sigsetsize
!= sizeof(sigset_t
))
878 if (!access_ok(VERIFY_READ
, act
, sizeof(*act
)))
880 err
|= __get_user(handler
, &act
->sa_handler
);
881 new_sa
.sa
.sa_handler
= (void __user
*)(s64
)handler
;
882 err
|= __get_user(new_sa
.sa
.sa_flags
, &act
->sa_flags
);
883 err
|= get_sigset(&new_sa
.sa
.sa_mask
, &act
->sa_mask
);
888 ret
= do_sigaction(sig
, act
? &new_sa
: NULL
, oact
? &old_sa
: NULL
);
893 if (!access_ok(VERIFY_WRITE
, oact
, sizeof(*oact
)))
896 err
|= __put_user((u32
)(u64
)old_sa
.sa
.sa_handler
,
898 err
|= __put_user(old_sa
.sa
.sa_flags
, &oact
->sa_flags
);
899 err
|= put_sigset(&old_sa
.sa
.sa_mask
, &oact
->sa_mask
);
907 asmlinkage
int sys32_rt_sigprocmask(int how
, compat_sigset_t __user
*set
,
908 compat_sigset_t __user
*oset
, unsigned int sigsetsize
)
910 sigset_t old_set
, new_set
;
912 mm_segment_t old_fs
= get_fs();
914 if (set
&& get_sigset(&new_set
, set
))
918 ret
= sys_rt_sigprocmask(how
, set
? (sigset_t __user
*)&new_set
: NULL
,
919 oset
? (sigset_t __user
*)&old_set
: NULL
,
923 if (!ret
&& oset
&& put_sigset(&old_set
, oset
))
929 asmlinkage
int sys32_rt_sigpending(compat_sigset_t __user
*uset
,
930 unsigned int sigsetsize
)
934 mm_segment_t old_fs
= get_fs();
937 ret
= sys_rt_sigpending((sigset_t __user
*)&set
, sigsetsize
);
940 if (!ret
&& put_sigset(&set
, uset
))
946 asmlinkage
int sys32_rt_sigqueueinfo(int pid
, int sig
, compat_siginfo_t __user
*uinfo
)
950 mm_segment_t old_fs
= get_fs();
952 if (copy_from_user (&info
, uinfo
, 3*sizeof(int)) ||
953 copy_from_user (info
._sifields
._pad
, uinfo
->_sifields
._pad
, SI_PAD_SIZE
))
956 ret
= sys_rt_sigqueueinfo(pid
, sig
, (siginfo_t __user
*)&info
);
962 sys32_waitid(int which
, compat_pid_t pid
,
963 compat_siginfo_t __user
*uinfo
, int options
,
964 struct compat_rusage __user
*uru
)
969 mm_segment_t old_fs
= get_fs();
973 ret
= sys_waitid(which
, pid
, (siginfo_t __user
*) &info
, options
,
974 uru
? (struct rusage __user
*) &ru
: NULL
);
977 if (ret
< 0 || info
.si_signo
== 0)
980 if (uru
&& (ret
= put_compat_rusage(&ru
, uru
)))
983 BUG_ON(info
.si_code
& __SI_MASK
);
984 info
.si_code
|= __SI_CHLD
;
985 return copy_siginfo_to_user32(uinfo
, &info
);