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 - 1999 Ralf Baechle
8 * Copyright (C) 1999 Silicon Graphics, Inc.
10 #include <linux/config.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/errno.h>
18 #include <linux/wait.h>
19 #include <linux/ptrace.h>
20 #include <linux/unistd.h>
23 #include <asm/bitops.h>
24 #include <asm/pgalloc.h>
25 #include <asm/stackframe.h>
26 #include <asm/uaccess.h>
27 #include <asm/ucontext.h>
31 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
33 extern asmlinkage
int sys_wait4(pid_t pid
, unsigned long *stat_addr
,
34 int options
, unsigned long *ru
);
35 extern asmlinkage
int do_signal(sigset_t
*oldset
, struct pt_regs
*regs
);
36 extern asmlinkage
int save_fp_context(struct sigcontext
*sc
);
37 extern asmlinkage
int restore_fp_context(struct sigcontext
*sc
);
39 extern asmlinkage
void syscall_trace(void);
41 int copy_siginfo_to_user(siginfo_t
*to
, siginfo_t
*from
)
43 if (!access_ok (VERIFY_WRITE
, to
, sizeof(siginfo_t
)))
45 if (from
->si_code
< 0)
46 return __copy_to_user(to
, from
, sizeof(siginfo_t
));
50 /* If you change siginfo_t structure, please be sure
51 this code is fixed accordingly.
52 It should never copy any pad contained in the structure
53 to avoid security leaks, but must copy the generic
54 3 ints plus the relevant union member. */
55 err
= __put_user(from
->si_signo
, &to
->si_signo
);
56 err
|= __put_user(from
->si_errno
, &to
->si_errno
);
57 err
|= __put_user((short)from
->si_code
, &to
->si_code
);
58 /* First 32bits of unions are always present. */
59 err
|= __put_user(from
->si_pid
, &to
->si_pid
);
60 switch (from
->si_code
>> 16) {
61 case __SI_FAULT
>> 16:
64 err
|= __put_user(from
->si_utime
, &to
->si_utime
);
65 err
|= __put_user(from
->si_stime
, &to
->si_stime
);
66 err
|= __put_user(from
->si_status
, &to
->si_status
);
68 err
|= __put_user(from
->si_uid
, &to
->si_uid
);
70 /* case __SI_RT: This is not generated by the kernel as of now. */
77 * Atomically swap in the new signal mask, and wait for a signal.
80 sys_sigsuspend(struct pt_regs regs
)
82 sigset_t
*uset
, saveset
, newset
;
85 uset
= (sigset_t
*) regs
.regs
[4];
86 if (copy_from_user(&newset
, uset
, sizeof(sigset_t
)))
88 sigdelsetmask(&newset
, ~_BLOCKABLE
);
90 spin_lock_irq(¤t
->sigmask_lock
);
91 saveset
= current
->blocked
;
92 current
->blocked
= newset
;
93 recalc_sigpending(current
);
94 spin_unlock_irq(¤t
->sigmask_lock
);
99 current
->state
= TASK_INTERRUPTIBLE
;
101 if (do_signal(&saveset
, ®s
))
107 sys_rt_sigsuspend(struct pt_regs regs
)
109 sigset_t
*unewset
, saveset
, newset
;
114 /* XXX Don't preclude handling different sized sigset_t's. */
115 sigsetsize
= regs
.regs
[5];
116 if (sigsetsize
!= sizeof(sigset_t
))
119 unewset
= (sigset_t
*) regs
.regs
[4];
120 if (copy_from_user(&newset
, unewset
, sizeof(newset
)))
122 sigdelsetmask(&newset
, ~_BLOCKABLE
);
124 spin_lock_irq(¤t
->sigmask_lock
);
125 saveset
= current
->blocked
;
126 current
->blocked
= newset
;
127 recalc_sigpending(current
);
128 spin_unlock_irq(¤t
->sigmask_lock
);
130 regs
.regs
[2] = EINTR
;
133 current
->state
= TASK_INTERRUPTIBLE
;
135 if (do_signal(&saveset
, ®s
))
141 sys_sigaction(int sig
, const struct sigaction
*act
, struct sigaction
*oact
)
143 struct k_sigaction new_ka
, old_ka
;
150 if (!access_ok(VERIFY_READ
, act
, sizeof(*act
)))
152 err
|= __get_user(new_ka
.sa
.sa_handler
, &act
->sa_handler
);
153 err
|= __get_user(new_ka
.sa
.sa_flags
, &act
->sa_flags
);
154 err
|= __get_user(mask
, &act
->sa_mask
.sig
[0]);
155 err
|= __get_user(new_ka
.sa
.sa_restorer
, &act
->sa_restorer
);
159 siginitset(&new_ka
.sa
.sa_mask
, mask
);
162 ret
= do_sigaction(sig
, act
? &new_ka
: NULL
, oact
? &old_ka
: NULL
);
165 if (!access_ok(VERIFY_WRITE
, oact
, sizeof(*oact
)))
167 err
|= __put_user(old_ka
.sa
.sa_flags
, &oact
->sa_flags
);
168 err
|= __put_user(old_ka
.sa
.sa_handler
, &oact
->sa_handler
);
169 err
|= __put_user(old_ka
.sa
.sa_mask
.sig
[0], oact
->sa_mask
.sig
);
170 err
|= __put_user(0, &oact
->sa_mask
.sig
[1]);
171 err
|= __put_user(0, &oact
->sa_mask
.sig
[2]);
172 err
|= __put_user(0, &oact
->sa_mask
.sig
[3]);
173 err
|= __put_user(old_ka
.sa
.sa_restorer
, &oact
->sa_restorer
);
182 sys_sigaltstack(struct pt_regs regs
)
184 const stack_t
*uss
= (const stack_t
*) regs
.regs
[4];
185 stack_t
*uoss
= (stack_t
*) regs
.regs
[5];
186 unsigned long usp
= regs
.regs
[29];
188 return do_sigaltstack(uss
, uoss
, usp
);
192 restore_sigcontext(struct pt_regs
*regs
, struct sigcontext
*sc
)
198 err
|= __get_user(regs
->cp0_epc
, &sc
->sc_pc
);
200 err
|= __get_user(reg
, &sc
->sc_mdhi
);
201 regs
->hi
= (int) reg
;
202 err
|= __get_user(reg
, &sc
->sc_mdlo
);
203 regs
->lo
= (int) reg
;
205 #define restore_gp_reg(i) do { \
206 err |= __get_user(reg, &sc->sc_regs[i]); \
207 regs->regs[i] = reg; \
209 restore_gp_reg( 1); restore_gp_reg( 2); restore_gp_reg( 3);
210 restore_gp_reg( 4); restore_gp_reg( 5); restore_gp_reg( 6);
211 restore_gp_reg( 7); restore_gp_reg( 8); restore_gp_reg( 9);
212 restore_gp_reg(10); restore_gp_reg(11); restore_gp_reg(12);
213 restore_gp_reg(13); restore_gp_reg(14); restore_gp_reg(15);
214 restore_gp_reg(16); restore_gp_reg(17); restore_gp_reg(18);
215 restore_gp_reg(19); restore_gp_reg(20); restore_gp_reg(21);
216 restore_gp_reg(22); restore_gp_reg(23); restore_gp_reg(24);
217 restore_gp_reg(25); restore_gp_reg(26); restore_gp_reg(27);
218 restore_gp_reg(28); restore_gp_reg(29); restore_gp_reg(30);
220 #undef restore_gp_reg
222 err
|= __get_user(owned_fp
, &sc
->sc_ownedfp
);
224 err
|= restore_fp_context(sc
);
225 last_task_used_math
= current
;
232 u32 sf_ass
[4]; /* argument save space for o32 */
233 u32 sf_code
[2]; /* signal trampoline */
234 struct sigcontext sf_sc
;
239 u32 rs_ass
[4]; /* argument save space for o32 */
240 u32 rs_code
[2]; /* signal trampoline */
241 struct siginfo rs_info
;
242 struct ucontext rs_uc
;
246 sys_sigreturn(struct pt_regs regs
)
248 struct sigframe
*frame
;
251 frame
= (struct sigframe
*) regs
.regs
[29];
252 if (!access_ok(VERIFY_READ
, frame
, sizeof(*frame
)))
254 if (__copy_from_user(&blocked
, &frame
->sf_mask
, sizeof(blocked
)))
257 sigdelsetmask(&blocked
, ~_BLOCKABLE
);
258 spin_lock_irq(¤t
->sigmask_lock
);
259 current
->blocked
= blocked
;
260 recalc_sigpending(current
);
261 spin_unlock_irq(¤t
->sigmask_lock
);
263 if (restore_sigcontext(®s
, &frame
->sf_sc
))
267 * Don't let your children do this ...
269 if (current
->ptrace
& PT_TRACESYS
)
271 __asm__
__volatile__(
273 "j\tret_from_sys_call"
279 force_sig(SIGSEGV
, current
);
283 sys_rt_sigreturn(struct pt_regs regs
)
285 struct rt_sigframe
*frame
;
289 frame
= (struct rt_sigframe
*) regs
.regs
[29];
290 if (!access_ok(VERIFY_READ
, frame
, sizeof(*frame
)))
292 if (__copy_from_user(&set
, &frame
->rs_uc
.uc_sigmask
, sizeof(set
)))
295 sigdelsetmask(&set
, ~_BLOCKABLE
);
296 spin_lock_irq(¤t
->sigmask_lock
);
297 current
->blocked
= set
;
298 recalc_sigpending(current
);
299 spin_unlock_irq(¤t
->sigmask_lock
);
301 if (restore_sigcontext(®s
, &frame
->rs_uc
.uc_mcontext
))
304 if (__copy_from_user(&st
, &frame
->rs_uc
.uc_stack
, sizeof(st
)))
306 /* It is more difficult to avoid calling this function than to
307 call it and ignore errors. */
308 do_sigaltstack(&st
, NULL
, regs
.regs
[29]);
311 * Don't let your children do this ...
313 __asm__
__volatile__(
315 "j\tret_from_sys_call"
321 force_sig(SIGSEGV
, current
);
325 setup_sigcontext(struct pt_regs
*regs
, struct sigcontext
*sc
)
331 err
|= __put_user(regs
->cp0_epc
, &sc
->sc_pc
);
332 err
|= __put_user(regs
->cp0_status
, &sc
->sc_status
);
334 #define save_gp_reg(i) { \
335 reg = regs->regs[i]; \
336 err |= __put_user(reg, &sc->sc_regs[i]); \
338 __put_user(0, &sc
->sc_regs
[0]); save_gp_reg(1); save_gp_reg(2);
339 save_gp_reg(3); save_gp_reg(4); save_gp_reg(5); save_gp_reg(6);
340 save_gp_reg(7); save_gp_reg(8); save_gp_reg(9); save_gp_reg(10);
341 save_gp_reg(11); save_gp_reg(12); save_gp_reg(13); save_gp_reg(14);
342 save_gp_reg(15); save_gp_reg(16); save_gp_reg(17); save_gp_reg(18);
343 save_gp_reg(19); save_gp_reg(20); save_gp_reg(21); save_gp_reg(22);
344 save_gp_reg(23); save_gp_reg(24); save_gp_reg(25); save_gp_reg(26);
345 save_gp_reg(27); save_gp_reg(28); save_gp_reg(29); save_gp_reg(30);
349 err
|= __put_user(regs
->hi
, &sc
->sc_mdhi
);
350 err
|= __put_user(regs
->lo
, &sc
->sc_mdlo
);
351 err
|= __put_user(regs
->cp0_cause
, &sc
->sc_cause
);
352 err
|= __put_user(regs
->cp0_badvaddr
, &sc
->sc_badvaddr
);
354 owned_fp
= (current
== last_task_used_math
);
355 err
|= __put_user(owned_fp
, &sc
->sc_ownedfp
);
357 if (current
->used_math
) { /* fp is active. */
358 set_cp0_status(ST0_CU1
, ST0_CU1
);
359 err
|= save_fp_context(sc
);
360 last_task_used_math
= NULL
;
361 regs
->cp0_status
&= ~ST0_CU1
;
362 current
->used_math
= 0;
369 * Determine which stack to use..
372 get_sigframe(struct k_sigaction
*ka
, struct pt_regs
*regs
, size_t frame_size
)
376 /* Default to using normal stack */
379 /* This is the X/Open sanctioned signal stack switching. */
380 if ((ka
->sa
.sa_flags
& SA_ONSTACK
) && ! on_sig_stack(sp
))
381 sp
= current
->sas_ss_sp
+ current
->sas_ss_size
;
383 return (void *)((sp
- frame_size
) & ALMASK
);
387 setup_frame(struct k_sigaction
* ka
, struct pt_regs
*regs
,
388 int signr
, sigset_t
*set
)
390 struct sigframe
*frame
;
393 frame
= get_sigframe(ka
, regs
, sizeof(*frame
));
394 if (!access_ok(VERIFY_WRITE
, frame
, sizeof (*frame
)))
397 /* Set up to return from userspace. If provided, use a stub already
399 if (ka
->sa
.sa_flags
& SA_RESTORER
)
400 regs
->regs
[31] = (unsigned long) ka
->sa
.sa_restorer
;
403 * Set up the return code ...
405 * li v0, __NR_sigreturn
408 err
|= __put_user(0x24020000 + __NR_sigreturn
,
410 err
|= __put_user(0x0000000c ,
412 flush_cache_sigtramp((unsigned long) frame
->sf_code
);
415 err
|= setup_sigcontext(regs
, &frame
->sf_sc
);
416 err
|= __copy_to_user(&frame
->sf_mask
, set
, sizeof(*set
));
421 * Arguments to signal handler:
424 * a1 = 0 (should be cause)
425 * a2 = pointer to struct sigcontext
427 * $25 and c0_epc point to the signal handler, $29 points to the
430 regs
->regs
[ 4] = signr
;
432 regs
->regs
[ 6] = (unsigned long) &frame
->sf_sc
;
433 regs
->regs
[29] = (unsigned long) frame
;
434 regs
->regs
[31] = (unsigned long) frame
->sf_code
;
435 regs
->cp0_epc
= regs
->regs
[25] = (unsigned long) ka
->sa
.sa_handler
;
438 printk("SIG deliver (%s:%d): sp=0x%p pc=0x%p ra=0x%p\n",
439 current
->comm
, current
->pid
, frame
, regs
->cp0_epc
, frame
->code
);
444 if (signr
== SIGSEGV
)
445 ka
->sa
.sa_handler
= SIG_DFL
;
446 force_sig(SIGSEGV
, current
);
450 setup_rt_frame(struct k_sigaction
* ka
, struct pt_regs
*regs
,
451 int signr
, sigset_t
*set
, siginfo_t
*info
)
453 struct rt_sigframe
*frame
;
456 frame
= get_sigframe(ka
, regs
, sizeof(*frame
));
457 if (!access_ok(VERIFY_WRITE
, frame
, sizeof (*frame
)))
460 /* Set up to return from userspace. If provided, use a stub already
462 if (ka
->sa
.sa_flags
& SA_RESTORER
)
463 regs
->regs
[31] = (unsigned long) ka
->sa
.sa_restorer
;
466 * Set up the return code ...
468 * li v0, __NR_sigreturn
471 err
|= __put_user(0x24020000 + __NR_sigreturn
,
473 err
|= __put_user(0x0000000c ,
475 flush_cache_sigtramp((unsigned long) frame
->rs_code
);
478 /* Create siginfo. */
479 err
|= copy_siginfo_to_user(&frame
->rs_info
, info
);
481 /* Create the ucontext. */
482 err
|= __put_user(0, &frame
->rs_uc
.uc_flags
);
483 err
|= __put_user(0, &frame
->rs_uc
.uc_link
);
484 err
|= __put_user((void *)current
->sas_ss_sp
,
485 &frame
->rs_uc
.uc_stack
.ss_sp
);
486 err
|= __put_user(sas_ss_flags(regs
->regs
[29]),
487 &frame
->rs_uc
.uc_stack
.ss_flags
);
488 err
|= __put_user(current
->sas_ss_size
,
489 &frame
->rs_uc
.uc_stack
.ss_size
);
490 err
|= setup_sigcontext(regs
, &frame
->rs_uc
.uc_mcontext
);
491 err
|= __copy_to_user(&frame
->rs_uc
.uc_sigmask
, set
, sizeof(*set
));
497 * Arguments to signal handler:
500 * a1 = 0 (should be cause)
501 * a2 = pointer to ucontext
503 * $25 and c0_epc point to the signal handler, $29 points to
504 * the struct rt_sigframe.
506 regs
->regs
[ 4] = signr
;
507 regs
->regs
[ 5] = (unsigned long) &frame
->rs_info
;
508 regs
->regs
[ 6] = (unsigned long) &frame
->rs_uc
;
509 regs
->regs
[29] = (unsigned long) frame
;
510 regs
->regs
[31] = (unsigned long) frame
->rs_code
;
511 regs
->cp0_epc
= regs
->regs
[25] = (unsigned long) ka
->sa
.sa_handler
;
514 printk("SIG deliver (%s:%d): sp=0x%p pc=0x%p ra=0x%p\n",
515 current
->comm
, current
->pid
, frame
, regs
->cp0_epc
, frame
->code
);
520 if (signr
== SIGSEGV
)
521 ka
->sa
.sa_handler
= SIG_DFL
;
522 force_sig(SIGSEGV
, current
);
526 handle_signal(unsigned long sig
, struct k_sigaction
*ka
,
527 siginfo_t
*info
, sigset_t
*oldset
, struct pt_regs
* regs
)
529 if (ka
->sa
.sa_flags
& SA_SIGINFO
)
530 setup_rt_frame(ka
, regs
, sig
, oldset
, info
);
532 setup_frame(ka
, regs
, sig
, oldset
);
534 if (ka
->sa
.sa_flags
& SA_ONESHOT
)
535 ka
->sa
.sa_handler
= SIG_DFL
;
536 if (!(ka
->sa
.sa_flags
& SA_NODEFER
)) {
537 spin_lock_irq(¤t
->sigmask_lock
);
538 sigorsets(¤t
->blocked
,¤t
->blocked
,&ka
->sa
.sa_mask
);
539 sigaddset(¤t
->blocked
,sig
);
540 recalc_sigpending(current
);
541 spin_unlock_irq(¤t
->sigmask_lock
);
546 syscall_restart(struct pt_regs
*regs
, struct k_sigaction
*ka
)
548 switch(regs
->regs
[0]) {
550 regs
->regs
[2] = EINTR
;
553 if(!(ka
->sa
.sa_flags
& SA_RESTART
)) {
554 regs
->regs
[2] = EINTR
;
558 case ERESTARTNOINTR
: /* Userland will reload $v0. */
559 regs
->regs
[7] = regs
->regs
[26];
563 regs
->regs
[0] = 0; /* Don't deal with this again. */
566 extern int do_irix_signal(sigset_t
*oldset
, struct pt_regs
*regs
);
568 asmlinkage
int do_signal(sigset_t
*oldset
, struct pt_regs
*regs
)
570 struct k_sigaction
*ka
;
573 #ifdef CONFIG_BINFMT_IRIX
574 if (current
->personality
!= PER_LINUX
)
575 return do_irix_signal(oldset
, regs
);
579 oldset
= ¤t
->blocked
;
584 spin_lock_irq(¤t
->sigmask_lock
);
585 signr
= dequeue_signal(¤t
->blocked
, &info
);
586 spin_unlock_irq(¤t
->sigmask_lock
);
591 if ((current
->ptrace
& PT_PTRACED
) && signr
!= SIGKILL
) {
592 /* Let the debugger run. */
593 current
->exit_code
= signr
;
594 current
->state
= TASK_STOPPED
;
595 notify_parent(current
, SIGCHLD
);
598 /* We're back. Did the debugger cancel the sig? */
599 if (!(signr
= current
->exit_code
))
601 current
->exit_code
= 0;
603 /* The debugger continued. Ignore SIGSTOP. */
604 if (signr
== SIGSTOP
)
607 /* Update the siginfo structure. Is this good? */
608 if (signr
!= info
.si_signo
) {
609 info
.si_signo
= signr
;
611 info
.si_code
= SI_USER
;
612 info
.si_pid
= current
->p_pptr
->pid
;
613 info
.si_uid
= current
->p_pptr
->uid
;
616 /* If the (new) signal is now blocked, requeue it. */
617 if (sigismember(¤t
->blocked
, signr
)) {
618 send_sig_info(signr
, &info
, current
);
623 ka
= ¤t
->sig
->action
[signr
-1];
624 if (ka
->sa
.sa_handler
== SIG_IGN
) {
625 if (signr
!= SIGCHLD
)
627 /* Check for SIGCHLD: it's special. */
628 while (sys_wait4(-1, NULL
, WNOHANG
, NULL
) > 0)
633 if (ka
->sa
.sa_handler
== SIG_DFL
) {
634 int exit_code
= signr
;
636 /* Init gets no signals it doesn't want. */
637 if (current
->pid
== 1)
641 case SIGCONT
: case SIGCHLD
: case SIGWINCH
:
644 case SIGTSTP
: case SIGTTIN
: case SIGTTOU
:
645 if (is_orphaned_pgrp(current
->pgrp
))
650 current
->state
= TASK_STOPPED
;
651 current
->exit_code
= signr
;
652 if (!(current
->p_pptr
->sig
->action
[SIGCHLD
-1].sa
.sa_flags
& SA_NOCLDSTOP
))
653 notify_parent(current
, SIGCHLD
);
657 case SIGQUIT
: case SIGILL
: case SIGTRAP
:
658 case SIGABRT
: case SIGFPE
: case SIGSEGV
:
659 case SIGBUS
: case SIGSYS
: case SIGXCPU
: case SIGXFSZ
:
660 if (do_coredump(signr
, regs
))
665 sigaddset(¤t
->pending
.signal
, signr
);
666 recalc_sigpending(current
);
667 current
->flags
|= PF_SIGNALED
;
674 syscall_restart(regs
, ka
);
675 /* Whee! Actually deliver the signal. */
676 handle_signal(signr
, ka
, &info
, oldset
, regs
);
681 * Who's code doesn't conform to the restartable syscall convention
682 * dies here!!! The li instruction, a single machine instruction,
683 * must directly be followed by the syscall instruction.
686 if (regs
->regs
[2] == ERESTARTNOHAND
||
687 regs
->regs
[2] == ERESTARTSYS
||
688 regs
->regs
[2] == ERESTARTNOINTR
) {
689 regs
->regs
[7] = regs
->regs
[26];