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 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 & 2) != 2)
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
if ( current->thread.debugreg[7] != 0 )
699
HYPERVISOR_set_debugreg(7, current->thread.debugreg[7]);
701
/* Whee! Actually deliver the signal. */
702
handle_signal(signr, ka, &info, oldset, regs);
706
/* Did we come from a system call? */
707
if (regs->orig_eax >= 0) {
708
/* Restart the system call - no handlers present */
709
if (regs->eax == -ERESTARTNOHAND ||
710
regs->eax == -ERESTARTSYS ||
711
regs->eax == -ERESTARTNOINTR) {
712
regs->eax = regs->orig_eax;