2 * linux/arch/alpha/kernel/signal.c
4 * Copyright (C) 1995 Linus Torvalds
6 * 1997-11-02 Modified for POSIX.1b signals by Richard Henderson
9 #include <linux/sched.h>
10 #include <linux/kernel.h>
11 #include <linux/signal.h>
12 #include <linux/errno.h>
13 #include <linux/wait.h>
14 #include <linux/ptrace.h>
15 #include <linux/unistd.h>
17 #include <linux/smp.h>
18 #include <linux/smp_lock.h>
19 #include <linux/stddef.h>
20 #include <linux/tty.h>
21 #include <linux/binfmts.h>
22 #include <linux/bitops.h>
24 #include <asm/uaccess.h>
25 #include <asm/sigcontext.h>
26 #include <asm/ucontext.h>
33 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
35 asmlinkage
void ret_from_sys_call(void);
36 static int do_signal(sigset_t
*, struct pt_regs
*, struct switch_stack
*,
37 unsigned long, unsigned long);
41 * The OSF/1 sigprocmask calling sequence is different from the
42 * C sigprocmask() sequence..
49 * We change the range to -1 .. 1 in order to let gcc easily
50 * use the conditional move instructions.
52 * Note that we don't need to acquire the kernel lock for SMP
53 * operation, as all of this is local to this thread.
55 asmlinkage
unsigned long
56 do_osf_sigprocmask(int how
, unsigned long newmask
, struct pt_regs
*regs
)
58 unsigned long oldmask
= -EINVAL
;
60 if ((unsigned long)how
-1 <= 2) {
61 long sign
= how
-2; /* -1 .. 1 */
62 unsigned long block
, unblock
;
64 newmask
&= _BLOCKABLE
;
65 spin_lock_irq(¤t
->sighand
->siglock
);
66 oldmask
= current
->blocked
.sig
[0];
68 unblock
= oldmask
& ~newmask
;
69 block
= oldmask
| newmask
;
74 if (_NSIG_WORDS
> 1 && sign
> 0)
75 sigemptyset(¤t
->blocked
);
76 current
->blocked
.sig
[0] = newmask
;
78 spin_unlock_irq(¤t
->sighand
->siglock
);
80 regs
->r0
= 0; /* special no error return */
86 osf_sigaction(int sig
, const struct osf_sigaction __user
*act
,
87 struct osf_sigaction __user
*oact
)
89 struct k_sigaction new_ka
, old_ka
;
94 if (!access_ok(VERIFY_READ
, act
, sizeof(*act
)) ||
95 __get_user(new_ka
.sa
.sa_handler
, &act
->sa_handler
) ||
96 __get_user(new_ka
.sa
.sa_flags
, &act
->sa_flags
))
98 __get_user(mask
, &act
->sa_mask
);
99 siginitset(&new_ka
.sa
.sa_mask
, mask
);
100 new_ka
.ka_restorer
= NULL
;
103 ret
= do_sigaction(sig
, act
? &new_ka
: NULL
, oact
? &old_ka
: NULL
);
106 if (!access_ok(VERIFY_WRITE
, oact
, sizeof(*oact
)) ||
107 __put_user(old_ka
.sa
.sa_handler
, &oact
->sa_handler
) ||
108 __put_user(old_ka
.sa
.sa_flags
, &oact
->sa_flags
))
110 __put_user(old_ka
.sa
.sa_mask
.sig
[0], &oact
->sa_mask
);
117 sys_rt_sigaction(int sig
, const struct sigaction __user
*act
,
118 struct sigaction __user
*oact
,
119 size_t sigsetsize
, void __user
*restorer
)
121 struct k_sigaction new_ka
, old_ka
;
124 /* XXX: Don't preclude handling different sized sigset_t's. */
125 if (sigsetsize
!= sizeof(sigset_t
))
129 new_ka
.ka_restorer
= restorer
;
130 if (copy_from_user(&new_ka
.sa
, act
, sizeof(*act
)))
134 ret
= do_sigaction(sig
, act
? &new_ka
: NULL
, oact
? &old_ka
: NULL
);
137 if (copy_to_user(oact
, &old_ka
.sa
, sizeof(*oact
)))
145 * Atomically swap in the new signal mask, and wait for a signal.
148 do_sigsuspend(old_sigset_t mask
, struct pt_regs
*regs
, struct switch_stack
*sw
)
153 spin_lock_irq(¤t
->sighand
->siglock
);
154 oldset
= current
->blocked
;
155 siginitset(¤t
->blocked
, mask
);
157 spin_unlock_irq(¤t
->sighand
->siglock
);
159 /* Indicate EINTR on return from any possible signal handler,
160 which will not come back through here, but via sigreturn. */
165 current
->state
= TASK_INTERRUPTIBLE
;
167 if (do_signal(&oldset
, regs
, sw
, 0, 0))
173 do_rt_sigsuspend(sigset_t __user
*uset
, size_t sigsetsize
,
174 struct pt_regs
*regs
, struct switch_stack
*sw
)
176 sigset_t oldset
, set
;
178 /* XXX: Don't preclude handling different sized sigset_t's. */
179 if (sigsetsize
!= sizeof(sigset_t
))
181 if (copy_from_user(&set
, uset
, sizeof(set
)))
184 sigdelsetmask(&set
, ~_BLOCKABLE
);
185 spin_lock_irq(¤t
->sighand
->siglock
);
186 oldset
= current
->blocked
;
187 current
->blocked
= set
;
189 spin_unlock_irq(¤t
->sighand
->siglock
);
191 /* Indicate EINTR on return from any possible signal handler,
192 which will not come back through here, but via sigreturn. */
197 current
->state
= TASK_INTERRUPTIBLE
;
199 if (do_signal(&oldset
, regs
, sw
, 0, 0))
205 sys_sigaltstack(const stack_t __user
*uss
, stack_t __user
*uoss
)
207 return do_sigaltstack(uss
, uoss
, rdusp());
211 * Do a signal return; undo the signal stack.
215 # error "Non SA_SIGINFO frame needs rearranging"
220 struct sigcontext sc
;
221 unsigned int retcode
[3];
228 unsigned int retcode
[3];
231 /* If this changes, userland unwinders that Know Things about our signal
232 frame will break. Do not undertake lightly. It also implies an ABI
233 change wrt the size of siginfo_t, which may cause some pain. */
234 extern char compile_time_assert
235 [offsetof(struct rt_sigframe
, uc
.uc_mcontext
) == 176 ? 1 : -1];
237 #define INSN_MOV_R30_R16 0x47fe0410
238 #define INSN_LDI_R0 0x201f0000
239 #define INSN_CALLSYS 0x00000083
242 restore_sigcontext(struct sigcontext __user
*sc
, struct pt_regs
*regs
,
243 struct switch_stack
*sw
)
246 long i
, err
= __get_user(regs
->pc
, &sc
->sc_pc
);
248 sw
->r26
= (unsigned long) ret_from_sys_call
;
250 err
|= __get_user(regs
->r0
, sc
->sc_regs
+0);
251 err
|= __get_user(regs
->r1
, sc
->sc_regs
+1);
252 err
|= __get_user(regs
->r2
, sc
->sc_regs
+2);
253 err
|= __get_user(regs
->r3
, sc
->sc_regs
+3);
254 err
|= __get_user(regs
->r4
, sc
->sc_regs
+4);
255 err
|= __get_user(regs
->r5
, sc
->sc_regs
+5);
256 err
|= __get_user(regs
->r6
, sc
->sc_regs
+6);
257 err
|= __get_user(regs
->r7
, sc
->sc_regs
+7);
258 err
|= __get_user(regs
->r8
, sc
->sc_regs
+8);
259 err
|= __get_user(sw
->r9
, sc
->sc_regs
+9);
260 err
|= __get_user(sw
->r10
, sc
->sc_regs
+10);
261 err
|= __get_user(sw
->r11
, sc
->sc_regs
+11);
262 err
|= __get_user(sw
->r12
, sc
->sc_regs
+12);
263 err
|= __get_user(sw
->r13
, sc
->sc_regs
+13);
264 err
|= __get_user(sw
->r14
, sc
->sc_regs
+14);
265 err
|= __get_user(sw
->r15
, sc
->sc_regs
+15);
266 err
|= __get_user(regs
->r16
, sc
->sc_regs
+16);
267 err
|= __get_user(regs
->r17
, sc
->sc_regs
+17);
268 err
|= __get_user(regs
->r18
, sc
->sc_regs
+18);
269 err
|= __get_user(regs
->r19
, sc
->sc_regs
+19);
270 err
|= __get_user(regs
->r20
, sc
->sc_regs
+20);
271 err
|= __get_user(regs
->r21
, sc
->sc_regs
+21);
272 err
|= __get_user(regs
->r22
, sc
->sc_regs
+22);
273 err
|= __get_user(regs
->r23
, sc
->sc_regs
+23);
274 err
|= __get_user(regs
->r24
, sc
->sc_regs
+24);
275 err
|= __get_user(regs
->r25
, sc
->sc_regs
+25);
276 err
|= __get_user(regs
->r26
, sc
->sc_regs
+26);
277 err
|= __get_user(regs
->r27
, sc
->sc_regs
+27);
278 err
|= __get_user(regs
->r28
, sc
->sc_regs
+28);
279 err
|= __get_user(regs
->gp
, sc
->sc_regs
+29);
280 err
|= __get_user(usp
, sc
->sc_regs
+30);
283 for (i
= 0; i
< 31; i
++)
284 err
|= __get_user(sw
->fp
[i
], sc
->sc_fpregs
+i
);
285 err
|= __get_user(sw
->fp
[31], &sc
->sc_fpcr
);
290 /* Note that this syscall is also used by setcontext(3) to install
291 a given sigcontext. This because it's impossible to set *all*
292 registers and transfer control from userland. */
295 do_sigreturn(struct sigcontext __user
*sc
, struct pt_regs
*regs
,
296 struct switch_stack
*sw
)
300 /* Verify that it's a good sigcontext before using it */
301 if (!access_ok(VERIFY_READ
, sc
, sizeof(*sc
)))
303 if (__get_user(set
.sig
[0], &sc
->sc_mask
))
306 sigdelsetmask(&set
, ~_BLOCKABLE
);
307 spin_lock_irq(¤t
->sighand
->siglock
);
308 current
->blocked
= set
;
310 spin_unlock_irq(¤t
->sighand
->siglock
);
312 if (restore_sigcontext(sc
, regs
, sw
))
315 /* Send SIGTRAP if we're single-stepping: */
316 if (ptrace_cancel_bpt (current
)) {
319 info
.si_signo
= SIGTRAP
;
321 info
.si_code
= TRAP_BRKPT
;
322 info
.si_addr
= (void __user
*) regs
->pc
;
324 send_sig_info(SIGTRAP
, &info
, current
);
329 force_sig(SIGSEGV
, current
);
333 do_rt_sigreturn(struct rt_sigframe __user
*frame
, struct pt_regs
*regs
,
334 struct switch_stack
*sw
)
338 /* Verify that it's a good ucontext_t before using it */
339 if (!access_ok(VERIFY_READ
, &frame
->uc
, sizeof(frame
->uc
)))
341 if (__copy_from_user(&set
, &frame
->uc
.uc_sigmask
, sizeof(set
)))
344 sigdelsetmask(&set
, ~_BLOCKABLE
);
345 spin_lock_irq(¤t
->sighand
->siglock
);
346 current
->blocked
= set
;
348 spin_unlock_irq(¤t
->sighand
->siglock
);
350 if (restore_sigcontext(&frame
->uc
.uc_mcontext
, regs
, sw
))
353 /* Send SIGTRAP if we're single-stepping: */
354 if (ptrace_cancel_bpt (current
)) {
357 info
.si_signo
= SIGTRAP
;
359 info
.si_code
= TRAP_BRKPT
;
360 info
.si_addr
= (void __user
*) regs
->pc
;
362 send_sig_info(SIGTRAP
, &info
, current
);
367 force_sig(SIGSEGV
, current
);
372 * Set up a signal frame.
375 static inline void __user
*
376 get_sigframe(struct k_sigaction
*ka
, unsigned long sp
, size_t frame_size
)
378 if ((ka
->sa
.sa_flags
& SA_ONSTACK
) != 0 && ! sas_ss_flags(sp
))
379 sp
= current
->sas_ss_sp
+ current
->sas_ss_size
;
381 return (void __user
*)((sp
- frame_size
) & -32ul);
385 setup_sigcontext(struct sigcontext __user
*sc
, struct pt_regs
*regs
,
386 struct switch_stack
*sw
, unsigned long mask
, unsigned long sp
)
390 err
|= __put_user(on_sig_stack((unsigned long)sc
), &sc
->sc_onstack
);
391 err
|= __put_user(mask
, &sc
->sc_mask
);
392 err
|= __put_user(regs
->pc
, &sc
->sc_pc
);
393 err
|= __put_user(8, &sc
->sc_ps
);
395 err
|= __put_user(regs
->r0
, sc
->sc_regs
+0);
396 err
|= __put_user(regs
->r1
, sc
->sc_regs
+1);
397 err
|= __put_user(regs
->r2
, sc
->sc_regs
+2);
398 err
|= __put_user(regs
->r3
, sc
->sc_regs
+3);
399 err
|= __put_user(regs
->r4
, sc
->sc_regs
+4);
400 err
|= __put_user(regs
->r5
, sc
->sc_regs
+5);
401 err
|= __put_user(regs
->r6
, sc
->sc_regs
+6);
402 err
|= __put_user(regs
->r7
, sc
->sc_regs
+7);
403 err
|= __put_user(regs
->r8
, sc
->sc_regs
+8);
404 err
|= __put_user(sw
->r9
, sc
->sc_regs
+9);
405 err
|= __put_user(sw
->r10
, sc
->sc_regs
+10);
406 err
|= __put_user(sw
->r11
, sc
->sc_regs
+11);
407 err
|= __put_user(sw
->r12
, sc
->sc_regs
+12);
408 err
|= __put_user(sw
->r13
, sc
->sc_regs
+13);
409 err
|= __put_user(sw
->r14
, sc
->sc_regs
+14);
410 err
|= __put_user(sw
->r15
, sc
->sc_regs
+15);
411 err
|= __put_user(regs
->r16
, sc
->sc_regs
+16);
412 err
|= __put_user(regs
->r17
, sc
->sc_regs
+17);
413 err
|= __put_user(regs
->r18
, sc
->sc_regs
+18);
414 err
|= __put_user(regs
->r19
, sc
->sc_regs
+19);
415 err
|= __put_user(regs
->r20
, sc
->sc_regs
+20);
416 err
|= __put_user(regs
->r21
, sc
->sc_regs
+21);
417 err
|= __put_user(regs
->r22
, sc
->sc_regs
+22);
418 err
|= __put_user(regs
->r23
, sc
->sc_regs
+23);
419 err
|= __put_user(regs
->r24
, sc
->sc_regs
+24);
420 err
|= __put_user(regs
->r25
, sc
->sc_regs
+25);
421 err
|= __put_user(regs
->r26
, sc
->sc_regs
+26);
422 err
|= __put_user(regs
->r27
, sc
->sc_regs
+27);
423 err
|= __put_user(regs
->r28
, sc
->sc_regs
+28);
424 err
|= __put_user(regs
->gp
, sc
->sc_regs
+29);
425 err
|= __put_user(sp
, sc
->sc_regs
+30);
426 err
|= __put_user(0, sc
->sc_regs
+31);
428 for (i
= 0; i
< 31; i
++)
429 err
|= __put_user(sw
->fp
[i
], sc
->sc_fpregs
+i
);
430 err
|= __put_user(0, sc
->sc_fpregs
+31);
431 err
|= __put_user(sw
->fp
[31], &sc
->sc_fpcr
);
433 err
|= __put_user(regs
->trap_a0
, &sc
->sc_traparg_a0
);
434 err
|= __put_user(regs
->trap_a1
, &sc
->sc_traparg_a1
);
435 err
|= __put_user(regs
->trap_a2
, &sc
->sc_traparg_a2
);
441 setup_frame(int sig
, struct k_sigaction
*ka
, sigset_t
*set
,
442 struct pt_regs
*regs
, struct switch_stack
* sw
)
444 unsigned long oldsp
, r26
, err
= 0;
445 struct sigframe __user
*frame
;
448 frame
= get_sigframe(ka
, oldsp
, sizeof(*frame
));
449 if (!access_ok(VERIFY_WRITE
, frame
, sizeof(*frame
)))
452 err
|= setup_sigcontext(&frame
->sc
, regs
, sw
, set
->sig
[0], oldsp
);
456 /* Set up to return from userspace. If provided, use a stub
457 already in userspace. */
458 if (ka
->ka_restorer
) {
459 r26
= (unsigned long) ka
->ka_restorer
;
461 err
|= __put_user(INSN_MOV_R30_R16
, frame
->retcode
+0);
462 err
|= __put_user(INSN_LDI_R0
+__NR_sigreturn
, frame
->retcode
+1);
463 err
|= __put_user(INSN_CALLSYS
, frame
->retcode
+2);
465 r26
= (unsigned long) frame
->retcode
;
468 /* Check that everything was written properly. */
472 /* "Return" to the handler */
474 regs
->r27
= regs
->pc
= (unsigned long) ka
->sa
.sa_handler
;
475 regs
->r16
= sig
; /* a0: signal number */
476 regs
->r17
= 0; /* a1: exception code */
477 regs
->r18
= (unsigned long) &frame
->sc
; /* a2: sigcontext pointer */
478 wrusp((unsigned long) frame
);
481 printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n",
482 current
->comm
, current
->pid
, frame
, regs
->pc
, regs
->r26
);
488 force_sigsegv(sig
, current
);
492 setup_rt_frame(int sig
, struct k_sigaction
*ka
, siginfo_t
*info
,
493 sigset_t
*set
, struct pt_regs
*regs
, struct switch_stack
* sw
)
495 unsigned long oldsp
, r26
, err
= 0;
496 struct rt_sigframe __user
*frame
;
499 frame
= get_sigframe(ka
, oldsp
, sizeof(*frame
));
500 if (!access_ok(VERIFY_WRITE
, frame
, sizeof(*frame
)))
503 err
|= copy_siginfo_to_user(&frame
->info
, info
);
505 /* Create the ucontext. */
506 err
|= __put_user(0, &frame
->uc
.uc_flags
);
507 err
|= __put_user(0, &frame
->uc
.uc_link
);
508 err
|= __put_user(set
->sig
[0], &frame
->uc
.uc_osf_sigmask
);
509 err
|= __put_user(current
->sas_ss_sp
, &frame
->uc
.uc_stack
.ss_sp
);
510 err
|= __put_user(sas_ss_flags(oldsp
), &frame
->uc
.uc_stack
.ss_flags
);
511 err
|= __put_user(current
->sas_ss_size
, &frame
->uc
.uc_stack
.ss_size
);
512 err
|= setup_sigcontext(&frame
->uc
.uc_mcontext
, regs
, sw
,
514 err
|= __copy_to_user(&frame
->uc
.uc_sigmask
, set
, sizeof(*set
));
518 /* Set up to return from userspace. If provided, use a stub
519 already in userspace. */
520 if (ka
->ka_restorer
) {
521 r26
= (unsigned long) ka
->ka_restorer
;
523 err
|= __put_user(INSN_MOV_R30_R16
, frame
->retcode
+0);
524 err
|= __put_user(INSN_LDI_R0
+__NR_rt_sigreturn
,
526 err
|= __put_user(INSN_CALLSYS
, frame
->retcode
+2);
528 r26
= (unsigned long) frame
->retcode
;
534 /* "Return" to the handler */
536 regs
->r27
= regs
->pc
= (unsigned long) ka
->sa
.sa_handler
;
537 regs
->r16
= sig
; /* a0: signal number */
538 regs
->r17
= (unsigned long) &frame
->info
; /* a1: siginfo pointer */
539 regs
->r18
= (unsigned long) &frame
->uc
; /* a2: ucontext pointer */
540 wrusp((unsigned long) frame
);
543 printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n",
544 current
->comm
, current
->pid
, frame
, regs
->pc
, regs
->r26
);
550 force_sigsegv(sig
, current
);
555 * OK, we're invoking a handler.
558 handle_signal(int sig
, struct k_sigaction
*ka
, siginfo_t
*info
,
559 sigset_t
*oldset
, struct pt_regs
* regs
, struct switch_stack
*sw
)
561 if (ka
->sa
.sa_flags
& SA_SIGINFO
)
562 setup_rt_frame(sig
, ka
, info
, oldset
, regs
, sw
);
564 setup_frame(sig
, ka
, oldset
, regs
, sw
);
566 if (ka
->sa
.sa_flags
& SA_RESETHAND
)
567 ka
->sa
.sa_handler
= SIG_DFL
;
569 spin_lock_irq(¤t
->sighand
->siglock
);
570 sigorsets(¤t
->blocked
,¤t
->blocked
,&ka
->sa
.sa_mask
);
571 if (!(ka
->sa
.sa_flags
& SA_NODEFER
))
572 sigaddset(¤t
->blocked
,sig
);
574 spin_unlock_irq(¤t
->sighand
->siglock
);
578 syscall_restart(unsigned long r0
, unsigned long r19
,
579 struct pt_regs
*regs
, struct k_sigaction
*ka
)
583 if (!(ka
->sa
.sa_flags
& SA_RESTART
)) {
590 regs
->r0
= r0
; /* reset v0 and a3 and replay syscall */
594 case ERESTART_RESTARTBLOCK
:
595 current_thread_info()->restart_block
.fn
= do_no_restart_syscall
;
603 * Note that 'init' is a special process: it doesn't get signals it doesn't
604 * want to handle. Thus you cannot kill init even with a SIGKILL even by
607 * Note that we go through the signals twice: once to check the signals that
608 * the kernel can handle, and then we build all the user-level signal handling
609 * stack-frames in one go after that.
611 * "r0" and "r19" are the registers we need to restore for system call
612 * restart. "r0" is also used as an indicator whether we can restart at
613 * all (if we get here from anything but a syscall return, it will be 0)
616 do_signal(sigset_t
*oldset
, struct pt_regs
* regs
, struct switch_stack
* sw
,
617 unsigned long r0
, unsigned long r19
)
621 unsigned long single_stepping
= ptrace_cancel_bpt(current
);
622 struct k_sigaction ka
;
625 oldset
= ¤t
->blocked
;
627 /* This lets the debugger run, ... */
628 signr
= get_signal_to_deliver(&info
, &ka
, regs
, NULL
);
629 /* ... so re-check the single stepping. */
630 single_stepping
|= ptrace_cancel_bpt(current
);
633 /* Whee! Actually deliver the signal. */
634 if (r0
) syscall_restart(r0
, r19
, regs
, &ka
);
635 handle_signal(signr
, &ka
, &info
, oldset
, regs
, sw
);
637 ptrace_set_bpt(current
); /* re-set bpt */
646 /* Reset v0 and a3 and replay syscall. */
651 case ERESTART_RESTARTBLOCK
:
652 /* Force v0 to the restart syscall and reply. */
653 regs
->r0
= __NR_restart_syscall
;
659 ptrace_set_bpt(current
); /* re-set breakpoint */
665 do_notify_resume(sigset_t
*oldset
, struct pt_regs
*regs
,
666 struct switch_stack
*sw
, unsigned long r0
,
667 unsigned long r19
, unsigned long thread_info_flags
)
669 if (thread_info_flags
& _TIF_SIGPENDING
)
670 do_signal(oldset
, regs
, sw
, r0
, r19
);