2 * linux/arch/i386/kernel/signal.c
4 * Copyright (C) 1991, 1992 Linus Torvalds
6 * 1997-11-28 Modified for POSIX.1b signals by Richard Henderson
7 * 2000-06-20 Pentium III FXSR, SSE support by Gareth Hughes
10 #include <linux/config.h>
12 #include <linux/sched.h>
14 #include <linux/smp.h>
15 #include <linux/smp_lock.h>
16 #include <linux/kernel.h>
17 #include <linux/signal.h>
18 #include <linux/errno.h>
19 #include <linux/wait.h>
20 #include <linux/ptrace.h>
21 #include <linux/unistd.h>
22 #include <linux/stddef.h>
23 #include <asm/ucontext.h>
24 #include <asm/uaccess.h>
29 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
31 asmlinkage
int sys_wait4(pid_t pid
, unsigned long *stat_addr
,
32 int options
, unsigned long *ru
);
33 asmlinkage
int FASTCALL(do_signal(struct pt_regs
*regs
, sigset_t
*oldset
));
35 int copy_siginfo_to_user(siginfo_t
*to
, siginfo_t
*from
)
37 if (!access_ok (VERIFY_WRITE
, to
, sizeof(siginfo_t
)))
39 if (from
->si_code
< 0)
40 return __copy_to_user(to
, from
, sizeof(siginfo_t
));
44 /* If you change siginfo_t structure, please be sure
45 this code is fixed accordingly.
46 It should never copy any pad contained in the structure
47 to avoid security leaks, but must copy the generic
48 3 ints plus the relevant union member. */
49 err
= __put_user(from
->si_signo
, &to
->si_signo
);
50 err
|= __put_user(from
->si_errno
, &to
->si_errno
);
51 err
|= __put_user((short)from
->si_code
, &to
->si_code
);
52 /* First 32bits of unions are always present. */
53 err
|= __put_user(from
->si_pid
, &to
->si_pid
);
54 switch (from
->si_code
>> 16) {
55 case __SI_FAULT
>> 16:
58 err
|= __put_user(from
->si_utime
, &to
->si_utime
);
59 err
|= __put_user(from
->si_stime
, &to
->si_stime
);
60 err
|= __put_user(from
->si_status
, &to
->si_status
);
62 err
|= __put_user(from
->si_uid
, &to
->si_uid
);
64 /* case __SI_RT: This is not generated by the kernel as of now. */
71 * Atomically swap in the new signal mask, and wait for a signal.
74 sys_sigsuspend(int history0
, int history1
, old_sigset_t mask
)
76 struct pt_regs
* regs
= (struct pt_regs
*) &history0
;
80 spin_lock_irq(¤t
->sigmask_lock
);
81 saveset
= current
->blocked
;
82 siginitset(¤t
->blocked
, mask
);
83 recalc_sigpending(current
);
84 spin_unlock_irq(¤t
->sigmask_lock
);
88 current
->state
= TASK_INTERRUPTIBLE
;
90 if (do_signal(regs
, &saveset
))
96 sys_rt_sigsuspend(sigset_t
*unewset
, size_t sigsetsize
)
98 struct pt_regs
* regs
= (struct pt_regs
*) &unewset
;
99 sigset_t saveset
, newset
;
101 /* XXX: Don't preclude handling different sized sigset_t's. */
102 if (sigsetsize
!= sizeof(sigset_t
))
105 if (copy_from_user(&newset
, unewset
, sizeof(newset
)))
107 sigdelsetmask(&newset
, ~_BLOCKABLE
);
109 spin_lock_irq(¤t
->sigmask_lock
);
110 saveset
= current
->blocked
;
111 current
->blocked
= newset
;
112 recalc_sigpending(current
);
113 spin_unlock_irq(¤t
->sigmask_lock
);
117 current
->state
= TASK_INTERRUPTIBLE
;
119 if (do_signal(regs
, &saveset
))
125 sys_sigaction(int sig
, const struct old_sigaction
*act
,
126 struct old_sigaction
*oact
)
128 struct k_sigaction new_ka
, old_ka
;
133 if (verify_area(VERIFY_READ
, act
, sizeof(*act
)) ||
134 __get_user(new_ka
.sa
.sa_handler
, &act
->sa_handler
) ||
135 __get_user(new_ka
.sa
.sa_restorer
, &act
->sa_restorer
))
137 __get_user(new_ka
.sa
.sa_flags
, &act
->sa_flags
);
138 __get_user(mask
, &act
->sa_mask
);
139 siginitset(&new_ka
.sa
.sa_mask
, mask
);
142 ret
= do_sigaction(sig
, act
? &new_ka
: NULL
, oact
? &old_ka
: NULL
);
145 if (verify_area(VERIFY_WRITE
, oact
, sizeof(*oact
)) ||
146 __put_user(old_ka
.sa
.sa_handler
, &oact
->sa_handler
) ||
147 __put_user(old_ka
.sa
.sa_restorer
, &oact
->sa_restorer
))
149 __put_user(old_ka
.sa
.sa_flags
, &oact
->sa_flags
);
150 __put_user(old_ka
.sa
.sa_mask
.sig
[0], &oact
->sa_mask
);
157 sys_sigaltstack(const stack_t
*uss
, stack_t
*uoss
)
159 struct pt_regs
*regs
= (struct pt_regs
*) &uss
;
160 return do_sigaltstack(uss
, uoss
, regs
->esp
);
165 * Do a signal return; undo the signal stack.
172 struct sigcontext sc
;
173 struct _fpstate fpstate
;
174 unsigned long extramask
[_NSIG_WORDS
-1];
182 struct siginfo
*pinfo
;
186 struct _fpstate fpstate
;
191 restore_sigcontext(struct pt_regs
*regs
, struct sigcontext
*sc
, int *peax
)
193 unsigned int err
= 0;
195 #define COPY(x) err |= __get_user(regs->x, &sc->x)
197 #define COPY_SEG(seg) \
198 { unsigned short tmp; \
199 err |= __get_user(tmp, &sc->seg); \
200 regs->x##seg = tmp; }
202 #define COPY_SEG_STRICT(seg) \
203 { unsigned short tmp; \
204 err |= __get_user(tmp, &sc->seg); \
205 regs->x##seg = tmp|3; }
207 #define GET_SEG(seg) \
208 { unsigned short tmp; \
209 err |= __get_user(tmp, &sc->seg); \
210 loadsegment(seg,tmp); }
228 unsigned int tmpflags
;
229 err
|= __get_user(tmpflags
, &sc
->eflags
);
230 regs
->eflags
= (regs
->eflags
& ~0x40DD5) | (tmpflags
& 0x40DD5);
231 regs
->orig_eax
= -1; /* disable syscall checks */
235 struct _fpstate
* buf
;
236 err
|= __get_user(buf
, &sc
->fpstate
);
238 if (verify_area(VERIFY_READ
, buf
, sizeof(*buf
)))
240 err
|= restore_i387(buf
);
244 err
|= __get_user(*peax
, &sc
->eax
);
251 asmlinkage
int sys_sigreturn(unsigned long __unused
)
253 struct pt_regs
*regs
= (struct pt_regs
*) &__unused
;
254 struct sigframe
*frame
= (struct sigframe
*)(regs
->esp
- 8);
258 if (verify_area(VERIFY_READ
, frame
, sizeof(*frame
)))
260 if (__get_user(set
.sig
[0], &frame
->sc
.oldmask
)
262 && __copy_from_user(&set
.sig
[1], &frame
->extramask
,
263 sizeof(frame
->extramask
))))
266 sigdelsetmask(&set
, ~_BLOCKABLE
);
267 spin_lock_irq(¤t
->sigmask_lock
);
268 current
->blocked
= set
;
269 recalc_sigpending(current
);
270 spin_unlock_irq(¤t
->sigmask_lock
);
272 if (restore_sigcontext(regs
, &frame
->sc
, &eax
))
277 force_sig(SIGSEGV
, current
);
281 asmlinkage
int sys_rt_sigreturn(unsigned long __unused
)
283 struct pt_regs
*regs
= (struct pt_regs
*) &__unused
;
284 struct rt_sigframe
*frame
= (struct rt_sigframe
*)(regs
->esp
- 4);
289 if (verify_area(VERIFY_READ
, frame
, sizeof(*frame
)))
291 if (__copy_from_user(&set
, &frame
->uc
.uc_sigmask
, sizeof(set
)))
294 sigdelsetmask(&set
, ~_BLOCKABLE
);
295 spin_lock_irq(¤t
->sigmask_lock
);
296 current
->blocked
= set
;
297 recalc_sigpending(current
);
298 spin_unlock_irq(¤t
->sigmask_lock
);
300 if (restore_sigcontext(regs
, &frame
->uc
.uc_mcontext
, &eax
))
303 if (__copy_from_user(&st
, &frame
->uc
.uc_stack
, sizeof(st
)))
305 /* It is more difficult to avoid calling this function than to
306 call it and ignore errors. */
307 do_sigaltstack(&st
, NULL
, regs
->esp
);
312 force_sig(SIGSEGV
, current
);
317 * Set up a signal frame.
321 setup_sigcontext(struct sigcontext
*sc
, struct _fpstate
*fpstate
,
322 struct pt_regs
*regs
, unsigned long mask
)
327 __asm__("movl %%gs,%0" : "=r"(tmp
): "0"(tmp
));
328 err
|= __put_user(tmp
, (unsigned int *)&sc
->gs
);
329 __asm__("movl %%fs,%0" : "=r"(tmp
): "0"(tmp
));
330 err
|= __put_user(tmp
, (unsigned int *)&sc
->fs
);
332 err
|= __put_user(regs
->xes
, (unsigned int *)&sc
->es
);
333 err
|= __put_user(regs
->xds
, (unsigned int *)&sc
->ds
);
334 err
|= __put_user(regs
->edi
, &sc
->edi
);
335 err
|= __put_user(regs
->esi
, &sc
->esi
);
336 err
|= __put_user(regs
->ebp
, &sc
->ebp
);
337 err
|= __put_user(regs
->esp
, &sc
->esp
);
338 err
|= __put_user(regs
->ebx
, &sc
->ebx
);
339 err
|= __put_user(regs
->edx
, &sc
->edx
);
340 err
|= __put_user(regs
->ecx
, &sc
->ecx
);
341 err
|= __put_user(regs
->eax
, &sc
->eax
);
342 err
|= __put_user(current
->thread
.trap_no
, &sc
->trapno
);
343 err
|= __put_user(current
->thread
.error_code
, &sc
->err
);
344 err
|= __put_user(regs
->eip
, &sc
->eip
);
345 err
|= __put_user(regs
->xcs
, (unsigned int *)&sc
->cs
);
346 err
|= __put_user(regs
->eflags
, &sc
->eflags
);
347 err
|= __put_user(regs
->esp
, &sc
->esp_at_signal
);
348 err
|= __put_user(regs
->xss
, (unsigned int *)&sc
->ss
);
350 tmp
= save_i387(fpstate
);
354 err
|= __put_user(tmp
? fpstate
: NULL
, &sc
->fpstate
);
356 /* non-iBCS2 extensions.. */
357 err
|= __put_user(mask
, &sc
->oldmask
);
358 err
|= __put_user(current
->thread
.cr2
, &sc
->cr2
);
364 * Determine which stack to use..
367 get_sigframe(struct k_sigaction
*ka
, struct pt_regs
* regs
, size_t frame_size
)
371 /* Default to using normal stack */
374 /* This is the X/Open sanctioned signal stack switching. */
375 if (ka
->sa
.sa_flags
& SA_ONSTACK
) {
376 if (! on_sig_stack(esp
))
377 esp
= current
->sas_ss_sp
+ current
->sas_ss_size
;
380 /* This is the legacy signal stack switching. */
381 else if ((regs
->xss
& 0xffff) != __USER_DS
&&
382 !(ka
->sa
.sa_flags
& SA_RESTORER
) &&
383 ka
->sa
.sa_restorer
) {
384 esp
= (unsigned long) ka
->sa
.sa_restorer
;
387 return (void *)((esp
- frame_size
) & -8ul);
390 static void setup_frame(int sig
, struct k_sigaction
*ka
,
391 sigset_t
*set
, struct pt_regs
* regs
)
393 struct sigframe
*frame
;
396 frame
= get_sigframe(ka
, regs
, sizeof(*frame
));
398 if (!access_ok(VERIFY_WRITE
, frame
, sizeof(*frame
)))
401 err
|= __put_user((current
->exec_domain
402 && current
->exec_domain
->signal_invmap
404 ? current
->exec_domain
->signal_invmap
[sig
]
410 err
|= setup_sigcontext(&frame
->sc
, &frame
->fpstate
, regs
, set
->sig
[0]);
414 if (_NSIG_WORDS
> 1) {
415 err
|= __copy_to_user(frame
->extramask
, &set
->sig
[1],
416 sizeof(frame
->extramask
));
421 /* Set up to return from userspace. If provided, use a stub
422 already in userspace. */
423 if (ka
->sa
.sa_flags
& SA_RESTORER
) {
424 err
|= __put_user(ka
->sa
.sa_restorer
, &frame
->pretcode
);
426 err
|= __put_user(frame
->retcode
, &frame
->pretcode
);
427 /* This is popl %eax ; movl $,%eax ; int $0x80 */
428 err
|= __put_user(0xb858, (short *)(frame
->retcode
+0));
429 err
|= __put_user(__NR_sigreturn
, (int *)(frame
->retcode
+2));
430 err
|= __put_user(0x80cd, (short *)(frame
->retcode
+6));
436 /* Set up registers for signal handler */
437 regs
->esp
= (unsigned long) frame
;
438 regs
->eip
= (unsigned long) ka
->sa
.sa_handler
;
441 regs
->xds
= __USER_DS
;
442 regs
->xes
= __USER_DS
;
443 regs
->xss
= __USER_DS
;
444 regs
->xcs
= __USER_CS
;
445 regs
->eflags
&= ~TF_MASK
;
448 printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n",
449 current
->comm
, current
->pid
, frame
, regs
->eip
, frame
->pretcode
);
456 ka
->sa
.sa_handler
= SIG_DFL
;
457 force_sig(SIGSEGV
, current
);
460 static void setup_rt_frame(int sig
, struct k_sigaction
*ka
, siginfo_t
*info
,
461 sigset_t
*set
, struct pt_regs
* regs
)
463 struct rt_sigframe
*frame
;
466 frame
= get_sigframe(ka
, regs
, sizeof(*frame
));
468 if (!access_ok(VERIFY_WRITE
, frame
, sizeof(*frame
)))
471 err
|= __put_user((current
->exec_domain
472 && current
->exec_domain
->signal_invmap
474 ? current
->exec_domain
->signal_invmap
[sig
]
477 err
|= __put_user(&frame
->info
, &frame
->pinfo
);
478 err
|= __put_user(&frame
->uc
, &frame
->puc
);
479 err
|= copy_siginfo_to_user(&frame
->info
, info
);
483 /* Create the ucontext. */
484 err
|= __put_user(0, &frame
->uc
.uc_flags
);
485 err
|= __put_user(0, &frame
->uc
.uc_link
);
486 err
|= __put_user(current
->sas_ss_sp
, &frame
->uc
.uc_stack
.ss_sp
);
487 err
|= __put_user(sas_ss_flags(regs
->esp
),
488 &frame
->uc
.uc_stack
.ss_flags
);
489 err
|= __put_user(current
->sas_ss_size
, &frame
->uc
.uc_stack
.ss_size
);
490 err
|= setup_sigcontext(&frame
->uc
.uc_mcontext
, &frame
->fpstate
,
492 err
|= __copy_to_user(&frame
->uc
.uc_sigmask
, set
, sizeof(*set
));
496 /* Set up to return from userspace. If provided, use a stub
497 already in userspace. */
498 if (ka
->sa
.sa_flags
& SA_RESTORER
) {
499 err
|= __put_user(ka
->sa
.sa_restorer
, &frame
->pretcode
);
501 err
|= __put_user(frame
->retcode
, &frame
->pretcode
);
502 /* This is movl $,%eax ; int $0x80 */
503 err
|= __put_user(0xb8, (char *)(frame
->retcode
+0));
504 err
|= __put_user(__NR_rt_sigreturn
, (int *)(frame
->retcode
+1));
505 err
|= __put_user(0x80cd, (short *)(frame
->retcode
+5));
511 /* Set up registers for signal handler */
512 regs
->esp
= (unsigned long) frame
;
513 regs
->eip
= (unsigned long) ka
->sa
.sa_handler
;
516 regs
->xds
= __USER_DS
;
517 regs
->xes
= __USER_DS
;
518 regs
->xss
= __USER_DS
;
519 regs
->xcs
= __USER_CS
;
520 regs
->eflags
&= ~TF_MASK
;
523 printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n",
524 current
->comm
, current
->pid
, frame
, regs
->eip
, frame
->pretcode
);
531 ka
->sa
.sa_handler
= SIG_DFL
;
532 force_sig(SIGSEGV
, current
);
536 * OK, we're invoking a handler
540 handle_signal(unsigned long sig
, struct k_sigaction
*ka
,
541 siginfo_t
*info
, sigset_t
*oldset
, struct pt_regs
* regs
)
543 /* Are we from a system call? */
544 if (regs
->orig_eax
>= 0) {
545 /* If so, check system call restarting.. */
547 case -ERESTARTNOHAND
:
552 if (!(ka
->sa
.sa_flags
& SA_RESTART
)) {
557 case -ERESTARTNOINTR
:
558 regs
->eax
= regs
->orig_eax
;
563 /* Set up the stack frame */
564 if (ka
->sa
.sa_flags
& SA_SIGINFO
)
565 setup_rt_frame(sig
, ka
, info
, oldset
, regs
);
567 setup_frame(sig
, ka
, oldset
, regs
);
569 if (ka
->sa
.sa_flags
& SA_ONESHOT
)
570 ka
->sa
.sa_handler
= SIG_DFL
;
572 if (!(ka
->sa
.sa_flags
& SA_NODEFER
)) {
573 spin_lock_irq(¤t
->sigmask_lock
);
574 sigorsets(¤t
->blocked
,¤t
->blocked
,&ka
->sa
.sa_mask
);
575 sigaddset(¤t
->blocked
,sig
);
576 recalc_sigpending(current
);
577 spin_unlock_irq(¤t
->sigmask_lock
);
582 * Note that 'init' is a special process: it doesn't get signals it doesn't
583 * want to handle. Thus you cannot kill init even with a SIGKILL even by
586 int do_signal(struct pt_regs
*regs
, sigset_t
*oldset
)
589 struct k_sigaction
*ka
;
592 * We want the common case to go fast, which
593 * is why we may in certain cases get here from
594 * kernel mode. Just return without doing anything
597 if ((regs
->xcs
& 3) != 3)
601 oldset
= ¤t
->blocked
;
606 spin_lock_irq(¤t
->sigmask_lock
);
607 signr
= dequeue_signal(¤t
->blocked
, &info
);
608 spin_unlock_irq(¤t
->sigmask_lock
);
613 if ((current
->ptrace
& PT_PTRACED
) && signr
!= SIGKILL
) {
614 /* Let the debugger run. */
615 current
->exit_code
= signr
;
616 current
->state
= TASK_STOPPED
;
617 notify_parent(current
, SIGCHLD
);
620 /* We're back. Did the debugger cancel the sig? */
621 if (!(signr
= current
->exit_code
))
623 current
->exit_code
= 0;
625 /* The debugger continued. Ignore SIGSTOP. */
626 if (signr
== SIGSTOP
)
629 /* Update the siginfo structure. Is this good? */
630 if (signr
!= info
.si_signo
) {
631 info
.si_signo
= signr
;
633 info
.si_code
= SI_USER
;
634 info
.si_pid
= current
->p_pptr
->pid
;
635 info
.si_uid
= current
->p_pptr
->uid
;
638 /* If the (new) signal is now blocked, requeue it. */
639 if (sigismember(¤t
->blocked
, signr
)) {
640 send_sig_info(signr
, &info
, current
);
645 ka
= ¤t
->sig
->action
[signr
-1];
646 if (ka
->sa
.sa_handler
== SIG_IGN
) {
647 if (signr
!= SIGCHLD
)
649 /* Check for SIGCHLD: it's special. */
650 while (sys_wait4(-1, NULL
, WNOHANG
, NULL
) > 0)
655 if (ka
->sa
.sa_handler
== SIG_DFL
) {
656 int exit_code
= signr
;
658 /* Init gets no signals it doesn't want. */
659 if (current
->pid
== 1)
663 case SIGCONT
: case SIGCHLD
: case SIGWINCH
:
666 case SIGTSTP
: case SIGTTIN
: case SIGTTOU
:
667 if (is_orphaned_pgrp(current
->pgrp
))
672 current
->state
= TASK_STOPPED
;
673 current
->exit_code
= signr
;
674 if (!(current
->p_pptr
->sig
->action
[SIGCHLD
-1].sa
.sa_flags
& SA_NOCLDSTOP
))
675 notify_parent(current
, SIGCHLD
);
679 case SIGQUIT
: case SIGILL
: case SIGTRAP
:
680 case SIGABRT
: case SIGFPE
: case SIGSEGV
:
681 case SIGBUS
: case SIGSYS
: case SIGXCPU
: case SIGXFSZ
:
682 if (do_coredump(signr
, regs
))
688 sigaddset(¤t
->signal
, signr
);
689 recalc_sigpending(current
);
690 current
->flags
|= PF_SIGNALED
;
696 /* Whee! Actually deliver the signal. */
697 handle_signal(signr
, ka
, &info
, oldset
, regs
);
701 /* Did we come from a system call? */
702 if (regs
->orig_eax
>= 0) {
703 /* Restart the system call - no handlers present */
704 if (regs
->eax
== -ERESTARTNOHAND
||
705 regs
->eax
== -ERESTARTSYS
||
706 regs
->eax
== -ERESTARTNOINTR
) {
707 regs
->eax
= regs
->orig_eax
;