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/sched.h>
12 #include <linux/smp.h>
13 #include <linux/smp_lock.h>
14 #include <linux/kernel.h>
15 #include <linux/signal.h>
16 #include <linux/errno.h>
17 #include <linux/wait.h>
18 #include <linux/ptrace.h>
19 #include <linux/unistd.h>
20 #include <linux/stddef.h>
21 #include <linux/tty.h>
22 #include <linux/personality.h>
23 #include <asm/ucontext.h>
24 #include <asm/uaccess.h>
29 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
31 int FASTCALL(do_signal(struct pt_regs *regs, sigset_t *oldset));
33 int copy_siginfo_to_user(siginfo_t *to, siginfo_t *from)
35 if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t)))
37 if (from->si_code < 0)
38 return __copy_to_user(to, from, sizeof(siginfo_t));
42 /* If you change siginfo_t structure, please be sure
43 this code is fixed accordingly.
44 It should never copy any pad contained in the structure
45 to avoid security leaks, but must copy the generic
46 3 ints plus the relevant union member. */
47 err = __put_user(from->si_signo, &to->si_signo);
48 err |= __put_user(from->si_errno, &to->si_errno);
49 err |= __put_user((short)from->si_code, &to->si_code);
50 /* First 32bits of unions are always present. */
51 err |= __put_user(from->si_pid, &to->si_pid);
52 switch (from->si_code >> 16) {
53 case __SI_FAULT >> 16:
56 err |= __put_user(from->si_utime, &to->si_utime);
57 err |= __put_user(from->si_stime, &to->si_stime);
58 err |= __put_user(from->si_status, &to->si_status);
60 err |= __put_user(from->si_uid, &to->si_uid);
62 /* case __SI_RT: This is not generated by the kernel as of now. */
69 * Atomically swap in the new signal mask, and wait for a signal.
72 sys_sigsuspend(int history0, int history1, old_sigset_t mask)
74 struct pt_regs * regs = (struct pt_regs *) &history0;
78 spin_lock_irq(¤t->sigmask_lock);
79 saveset = current->blocked;
80 siginitset(¤t->blocked, mask);
81 recalc_sigpending(current);
82 spin_unlock_irq(¤t->sigmask_lock);
86 current->state = TASK_INTERRUPTIBLE;
88 if (do_signal(regs, &saveset))
94 sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize)
96 struct pt_regs * regs = (struct pt_regs *) &unewset;
97 sigset_t saveset, newset;
99 /* XXX: Don't preclude handling different sized sigset_t's. */
100 if (sigsetsize != sizeof(sigset_t))
103 if (copy_from_user(&newset, unewset, sizeof(newset)))
105 sigdelsetmask(&newset, ~_BLOCKABLE);
107 spin_lock_irq(¤t->sigmask_lock);
108 saveset = current->blocked;
109 current->blocked = newset;
110 recalc_sigpending(current);
111 spin_unlock_irq(¤t->sigmask_lock);
115 current->state = TASK_INTERRUPTIBLE;
117 if (do_signal(regs, &saveset))
123 sys_sigaction(int sig, const struct old_sigaction *act,
124 struct old_sigaction *oact)
126 struct k_sigaction new_ka, old_ka;
131 if (verify_area(VERIFY_READ, act, sizeof(*act)) ||
132 __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
133 __get_user(new_ka.sa.sa_restorer, &act->sa_restorer))
135 __get_user(new_ka.sa.sa_flags, &act->sa_flags);
136 __get_user(mask, &act->sa_mask);
137 siginitset(&new_ka.sa.sa_mask, mask);
140 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
143 if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) ||
144 __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
145 __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer))
147 __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
148 __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
155 sys_sigaltstack(const stack_t *uss, stack_t *uoss)
157 struct pt_regs *regs = (struct pt_regs *) &uss;
158 return do_sigaltstack(uss, uoss, regs->esp);
163 * Do a signal return; undo the signal stack.
170 struct sigcontext sc;
171 struct _fpstate fpstate;
172 unsigned long extramask[_NSIG_WORDS-1];
180 struct siginfo *pinfo;
184 struct _fpstate fpstate;
189 restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc, int *peax)
191 unsigned int err = 0;
193 #define COPY(x) err |= __get_user(regs->x, &sc->x)
195 #define COPY_SEG(seg) \
196 { unsigned short tmp; \
197 err |= __get_user(tmp, &sc->seg); \
198 regs->x##seg = tmp; }
200 #define COPY_SEG_STRICT(seg) \
201 { unsigned short tmp; \
202 err |= __get_user(tmp, &sc->seg); \
203 regs->x##seg = tmp|3; }
205 #define GET_SEG(seg) \
206 { unsigned short tmp; \
207 err |= __get_user(tmp, &sc->seg); \
208 loadsegment(seg,tmp); }
226 unsigned int tmpflags;
227 err |= __get_user(tmpflags, &sc->eflags);
228 regs->eflags = (regs->eflags & ~0x40DD5) | (tmpflags & 0x40DD5);
229 regs->orig_eax = -1; /* disable syscall checks */
233 struct _fpstate * buf;
234 err |= __get_user(buf, &sc->fpstate);
236 if (verify_area(VERIFY_READ, buf, sizeof(*buf)))
238 err |= restore_i387(buf);
242 err |= __get_user(*peax, &sc->eax);
249 asmlinkage int sys_sigreturn(unsigned long __unused)
251 struct pt_regs *regs = (struct pt_regs *) &__unused;
252 struct sigframe *frame = (struct sigframe *)(regs->esp - 8);
256 if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
258 if (__get_user(set.sig[0], &frame->sc.oldmask)
260 && __copy_from_user(&set.sig[1], &frame->extramask,
261 sizeof(frame->extramask))))
264 sigdelsetmask(&set, ~_BLOCKABLE);
265 spin_lock_irq(¤t->sigmask_lock);
266 current->blocked = set;
267 recalc_sigpending(current);
268 spin_unlock_irq(¤t->sigmask_lock);
270 if (restore_sigcontext(regs, &frame->sc, &eax))
275 force_sig(SIGSEGV, current);
279 asmlinkage int sys_rt_sigreturn(unsigned long __unused)
281 struct pt_regs *regs = (struct pt_regs *) &__unused;
282 struct rt_sigframe *frame = (struct rt_sigframe *)(regs->esp - 4);
287 if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
289 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
292 sigdelsetmask(&set, ~_BLOCKABLE);
293 spin_lock_irq(¤t->sigmask_lock);
294 current->blocked = set;
295 recalc_sigpending(current);
296 spin_unlock_irq(¤t->sigmask_lock);
298 if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &eax))
301 if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st)))
303 /* It is more difficult to avoid calling this function than to
304 call it and ignore errors. */
305 do_sigaltstack(&st, NULL, regs->esp);
310 force_sig(SIGSEGV, current);
315 * Set up a signal frame.
319 setup_sigcontext(struct sigcontext *sc, struct _fpstate *fpstate,
320 struct pt_regs *regs, unsigned long mask)
325 __asm__("movl %%gs,%0" : "=r"(tmp): "0"(tmp));
326 err |= __put_user(tmp, (unsigned int *)&sc->gs);
327 __asm__("movl %%fs,%0" : "=r"(tmp): "0"(tmp));
328 err |= __put_user(tmp, (unsigned int *)&sc->fs);
330 err |= __put_user(regs->xes, (unsigned int *)&sc->es);
331 err |= __put_user(regs->xds, (unsigned int *)&sc->ds);
332 err |= __put_user(regs->edi, &sc->edi);
333 err |= __put_user(regs->esi, &sc->esi);
334 err |= __put_user(regs->ebp, &sc->ebp);
335 err |= __put_user(regs->esp, &sc->esp);
336 err |= __put_user(regs->ebx, &sc->ebx);
337 err |= __put_user(regs->edx, &sc->edx);
338 err |= __put_user(regs->ecx, &sc->ecx);
339 err |= __put_user(regs->eax, &sc->eax);
340 err |= __put_user(current->thread.trap_no, &sc->trapno);
341 err |= __put_user(current->thread.error_code, &sc->err);
342 err |= __put_user(regs->eip, &sc->eip);
343 err |= __put_user(regs->xcs, (unsigned int *)&sc->cs);
344 err |= __put_user(regs->eflags, &sc->eflags);
345 err |= __put_user(regs->esp, &sc->esp_at_signal);
346 err |= __put_user(regs->xss, (unsigned int *)&sc->ss);
348 tmp = save_i387(fpstate);
352 err |= __put_user(tmp ? fpstate : NULL, &sc->fpstate);
354 /* non-iBCS2 extensions.. */
355 err |= __put_user(mask, &sc->oldmask);
356 err |= __put_user(current->thread.cr2, &sc->cr2);
362 * Determine which stack to use..
365 get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
369 /* Default to using normal stack */
372 /* This is the X/Open sanctioned signal stack switching. */
373 if (ka->sa.sa_flags & SA_ONSTACK) {
374 if (sas_ss_flags(esp) == 0)
375 esp = current->sas_ss_sp + current->sas_ss_size;
378 /* This is the legacy signal stack switching. */
379 else if ((regs->xss & 0xffff) != __USER_DS &&
380 !(ka->sa.sa_flags & SA_RESTORER) &&
381 ka->sa.sa_restorer) {
382 esp = (unsigned long) ka->sa.sa_restorer;
385 return (void *)((esp - frame_size) & -8ul);
388 static void setup_frame(int sig, struct k_sigaction *ka,
389 sigset_t *set, struct pt_regs * regs)
391 struct sigframe *frame;
394 frame = get_sigframe(ka, regs, sizeof(*frame));
396 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
399 err |= __put_user((current->exec_domain
400 && current->exec_domain->signal_invmap
402 ? current->exec_domain->signal_invmap[sig]
408 err |= setup_sigcontext(&frame->sc, &frame->fpstate, regs, set->sig[0]);
412 if (_NSIG_WORDS > 1) {
413 err |= __copy_to_user(frame->extramask, &set->sig[1],
414 sizeof(frame->extramask));
419 /* Set up to return from userspace. If provided, use a stub
420 already in userspace. */
421 if (ka->sa.sa_flags & SA_RESTORER) {
422 err |= __put_user(ka->sa.sa_restorer, &frame->pretcode);
424 err |= __put_user(frame->retcode, &frame->pretcode);
425 /* This is popl %eax ; movl $,%eax ; int $0x80 */
426 err |= __put_user(0xb858, (short *)(frame->retcode+0));
427 err |= __put_user(__NR_sigreturn, (int *)(frame->retcode+2));
428 err |= __put_user(0x80cd, (short *)(frame->retcode+6));
434 /* Set up registers for signal handler */
435 regs->esp = (unsigned long) frame;
436 regs->eip = (unsigned long) ka->sa.sa_handler;
439 regs->xds = __USER_DS;
440 regs->xes = __USER_DS;
441 regs->xss = __USER_DS;
442 regs->xcs = __USER_CS;
443 regs->eflags &= ~TF_MASK;
446 printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n",
447 current->comm, current->pid, frame, regs->eip, frame->pretcode);
454 ka->sa.sa_handler = SIG_DFL;
455 force_sig(SIGSEGV, current);
458 static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
459 sigset_t *set, struct pt_regs * regs)
461 struct rt_sigframe *frame;
464 frame = get_sigframe(ka, regs, sizeof(*frame));
466 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
469 err |= __put_user((current->exec_domain
470 && current->exec_domain->signal_invmap
472 ? current->exec_domain->signal_invmap[sig]
475 err |= __put_user(&frame->info, &frame->pinfo);
476 err |= __put_user(&frame->uc, &frame->puc);
477 err |= copy_siginfo_to_user(&frame->info, info);
481 /* Create the ucontext. */
482 err |= __put_user(0, &frame->uc.uc_flags);
483 err |= __put_user(0, &frame->uc.uc_link);
484 err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
485 err |= __put_user(sas_ss_flags(regs->esp),
486 &frame->uc.uc_stack.ss_flags);
487 err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
488 err |= setup_sigcontext(&frame->uc.uc_mcontext, &frame->fpstate,
490 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
494 /* Set up to return from userspace. If provided, use a stub
495 already in userspace. */
496 if (ka->sa.sa_flags & SA_RESTORER) {
497 err |= __put_user(ka->sa.sa_restorer, &frame->pretcode);
499 err |= __put_user(frame->retcode, &frame->pretcode);
500 /* This is movl $,%eax ; int $0x80 */
501 err |= __put_user(0xb8, (char *)(frame->retcode+0));
502 err |= __put_user(__NR_rt_sigreturn, (int *)(frame->retcode+1));
503 err |= __put_user(0x80cd, (short *)(frame->retcode+5));
509 /* Set up registers for signal handler */
510 regs->esp = (unsigned long) frame;
511 regs->eip = (unsigned long) ka->sa.sa_handler;
514 regs->xds = __USER_DS;
515 regs->xes = __USER_DS;
516 regs->xss = __USER_DS;
517 regs->xcs = __USER_CS;
518 regs->eflags &= ~TF_MASK;
521 printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n",
522 current->comm, current->pid, frame, regs->eip, frame->pretcode);
529 ka->sa.sa_handler = SIG_DFL;
530 force_sig(SIGSEGV, current);
534 * OK, we're invoking a handler
538 handle_signal(unsigned long sig, struct k_sigaction *ka,
539 siginfo_t *info, sigset_t *oldset, struct pt_regs * regs)
541 /* Are we from a system call? */
542 if (regs->orig_eax >= 0) {
543 /* If so, check system call restarting.. */
545 case -ERESTARTNOHAND:
550 if (!(ka->sa.sa_flags & SA_RESTART)) {
555 case -ERESTARTNOINTR:
556 regs->eax = regs->orig_eax;
561 /* Set up the stack frame */
562 if (ka->sa.sa_flags & SA_SIGINFO)
563 setup_rt_frame(sig, ka, info, oldset, regs);
565 setup_frame(sig, ka, oldset, regs);
567 if (ka->sa.sa_flags & SA_ONESHOT)
568 ka->sa.sa_handler = SIG_DFL;
570 if (!(ka->sa.sa_flags & SA_NODEFER)) {
571 spin_lock_irq(¤t->sigmask_lock);
572 sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
573 sigaddset(¤t->blocked,sig);
574 recalc_sigpending(current);
575 spin_unlock_irq(¤t->sigmask_lock);
580 * Note that 'init' is a special process: it doesn't get signals it doesn't
581 * want to handle. Thus you cannot kill init even with a SIGKILL even by
584 int fastcall do_signal(struct pt_regs *regs, sigset_t *oldset)
587 struct k_sigaction *ka;
590 * We want the common case to go fast, which
591 * is why we may in certain cases get here from
592 * kernel mode. Just return without doing anything
595 if ((regs->xcs & 3) != 3)
599 oldset = ¤t->blocked;
604 spin_lock_irq(¤t->sigmask_lock);
605 signr = dequeue_signal(¤t->blocked, &info);
606 spin_unlock_irq(¤t->sigmask_lock);
611 if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) {
612 /* Let the debugger run. */
613 current->exit_code = signr;
614 current->state = TASK_STOPPED;
615 notify_parent(current, SIGCHLD);
618 /* We're back. Did the debugger cancel the sig? */
619 if (!(signr = current->exit_code))
621 current->exit_code = 0;
623 /* The debugger continued. Ignore SIGSTOP. */
624 if (signr == SIGSTOP)
627 /* Update the siginfo structure. Is this good? */
628 if (signr != info.si_signo) {
629 info.si_signo = signr;
631 info.si_code = SI_USER;
632 info.si_pid = current->p_pptr->pid;
633 info.si_uid = current->p_pptr->uid;
636 /* If the (new) signal is now blocked, requeue it. */
637 if (sigismember(¤t->blocked, signr)) {
638 send_sig_info(signr, &info, current);
643 ka = ¤t->sig->action[signr-1];
644 if (ka->sa.sa_handler == SIG_IGN) {
645 if (signr != SIGCHLD)
647 /* Check for SIGCHLD: it's special. */
648 while (sys_wait4(-1, NULL, WNOHANG, NULL) > 0)
653 if (ka->sa.sa_handler == SIG_DFL) {
654 int exit_code = signr;
656 /* Init gets no signals it doesn't want. */
657 if (current->pid == 1)
661 case SIGCONT: case SIGCHLD: case SIGWINCH: case SIGURG:
664 case SIGTSTP: case SIGTTIN: case SIGTTOU:
665 if (is_orphaned_pgrp(current->pgrp))
670 struct signal_struct *sig;
671 current->state = TASK_STOPPED;
672 current->exit_code = signr;
673 sig = current->p_pptr->sig;
674 if (sig && !(sig->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDSTOP))
675 notify_parent(current, SIGCHLD);
680 case SIGQUIT: case SIGILL: case SIGTRAP:
681 case SIGABRT: case SIGFPE: case SIGSEGV:
682 case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ:
683 if (do_coredump(signr, regs))
688 sig_exit(signr, exit_code, &info);
693 /* Reenable any watchpoints before delivering the
694 * signal to user space. The processor register will
695 * have been cleared if the watchpoint triggered
698 __asm__("movl %0,%%db7" : : "r" (current->thread.debugreg[7]));
700 /* Whee! Actually deliver the signal. */
701 handle_signal(signr, ka, &info, oldset, regs);
705 /* Did we come from a system call? */
706 if (regs->orig_eax >= 0) {
707 /* Restart the system call - no handlers present */
708 if (regs->eax == -ERESTARTNOHAND ||
709 regs->eax == -ERESTARTSYS ||
710 regs->eax == -ERESTARTNOINTR) {
711 regs->eax = regs->orig_eax;