2 * linux/arch/x86_64/ia32/ia32_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
8 * 2000-12-* x86-64 compatibility mode signal handling by Andi Kleen
11 #include <linux/sched.h>
13 #include <linux/smp.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/personality.h>
22 #include <linux/compat.h>
23 #include <linux/binfmts.h>
24 #include <asm/ucontext.h>
25 #include <asm/uaccess.h>
28 #include <asm/ptrace.h>
29 #include <asm/ia32_unistd.h>
30 #include <asm/user32.h>
31 #include <asm/sigcontext32.h>
32 #include <asm/fpu32.h>
33 #include <asm/proto.h>
38 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
40 asmlinkage int do_signal(struct pt_regs *regs, sigset_t *oldset);
41 void signal_fault(struct pt_regs *regs, void __user *frame, char *where);
43 int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
47 if (!access_ok(VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
50 /* If you change siginfo_t structure, please make sure that
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);
59 if (from->si_code < 0) {
60 err |= __put_user(from->si_pid, &to->si_pid);
61 err |= __put_user(from->si_uid, &to->si_uid);
62 err |= __put_user(ptr_to_compat(from->si_ptr), &to->si_ptr);
65 * First 32bits of unions are always present:
66 * si_pid === si_band === si_tid === si_addr(LS half)
68 err |= __put_user(from->_sifields._pad[0],
69 &to->_sifields._pad[0]);
70 switch (from->si_code >> 16) {
71 case __SI_FAULT >> 16:
74 err |= __put_user(from->si_utime, &to->si_utime);
75 err |= __put_user(from->si_stime, &to->si_stime);
76 err |= __put_user(from->si_status, &to->si_status);
80 err |= __put_user(from->si_uid, &to->si_uid);
83 err |= __put_user(from->si_fd, &to->si_fd);
85 case __SI_TIMER >> 16:
86 err |= __put_user(from->si_overrun, &to->si_overrun);
87 err |= __put_user(ptr_to_compat(from->si_ptr),
90 /* This is not generated by the kernel as of now. */
92 case __SI_MESGQ >> 16:
93 err |= __put_user(from->si_uid, &to->si_uid);
94 err |= __put_user(from->si_int, &to->si_int);
101 int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
106 if (!access_ok(VERIFY_READ, from, sizeof(compat_siginfo_t)))
109 err = __get_user(to->si_signo, &from->si_signo);
110 err |= __get_user(to->si_errno, &from->si_errno);
111 err |= __get_user(to->si_code, &from->si_code);
113 err |= __get_user(to->si_pid, &from->si_pid);
114 err |= __get_user(to->si_uid, &from->si_uid);
115 err |= __get_user(ptr32, &from->si_ptr);
116 to->si_ptr = compat_ptr(ptr32);
121 asmlinkage long sys32_sigsuspend(int history0, int history1, old_sigset_t mask)
124 spin_lock_irq(¤t->sighand->siglock);
125 current->saved_sigmask = current->blocked;
126 siginitset(¤t->blocked, mask);
128 spin_unlock_irq(¤t->sighand->siglock);
130 current->state = TASK_INTERRUPTIBLE;
132 set_thread_flag(TIF_RESTORE_SIGMASK);
133 return -ERESTARTNOHAND;
136 asmlinkage long sys32_sigaltstack(const stack_ia32_t __user *uss_ptr,
137 stack_ia32_t __user *uoss_ptr,
138 struct pt_regs *regs)
147 memset(&uss, 0, sizeof(stack_t));
148 if (!access_ok(VERIFY_READ, uss_ptr, sizeof(stack_ia32_t)) ||
149 __get_user(ptr, &uss_ptr->ss_sp) ||
150 __get_user(uss.ss_flags, &uss_ptr->ss_flags) ||
151 __get_user(uss.ss_size, &uss_ptr->ss_size))
153 uss.ss_sp = compat_ptr(ptr);
157 ret = do_sigaltstack(uss_ptr ? &uss : NULL, &uoss, regs->rsp);
159 if (ret >= 0 && uoss_ptr) {
160 if (!access_ok(VERIFY_WRITE, uoss_ptr, sizeof(stack_ia32_t)) ||
161 __put_user(ptr_to_compat(uoss.ss_sp), &uoss_ptr->ss_sp) ||
162 __put_user(uoss.ss_flags, &uoss_ptr->ss_flags) ||
163 __put_user(uoss.ss_size, &uoss_ptr->ss_size))
170 * Do a signal return; undo the signal stack.
177 struct sigcontext_ia32 sc;
178 struct _fpstate_ia32 fpstate;
179 unsigned int extramask[_COMPAT_NSIG_WORDS-1];
189 compat_siginfo_t info;
190 struct ucontext_ia32 uc;
191 struct _fpstate_ia32 fpstate;
197 err |= __get_user(reg, &sc->e ##x); \
198 regs->r ## x = reg; \
201 #define RELOAD_SEG(seg,mask) \
202 { unsigned int cur; \
203 unsigned short pre; \
204 err |= __get_user(pre, &sc->seg); \
205 asm volatile("movl %%" #seg ",%0" : "=r" (cur)); \
207 if (pre != cur) loadsegment(seg, pre); }
209 static int ia32_restore_sigcontext(struct pt_regs *regs,
210 struct sigcontext_ia32 __user *sc,
213 unsigned int tmpflags, gs, oldgs, err = 0;
214 struct _fpstate_ia32 __user *buf;
217 /* Always make any pending restarted system calls return -EINTR */
218 current_thread_info()->restart_block.fn = do_no_restart_syscall;
221 printk(KERN_DEBUG "SIG restore_sigcontext: "
222 "sc=%p err(%x) eip(%x) cs(%x) flg(%x)\n",
223 sc, sc->err, sc->eip, sc->cs, sc->eflags);
227 * Reload fs and gs if they have changed in the signal
228 * handler. This does not handle long fs/gs base changes in
229 * the handler, but does not clobber them at least in the
232 err |= __get_user(gs, &sc->gs);
234 asm("movl %%gs,%0" : "=r" (oldgs));
242 COPY(di); COPY(si); COPY(bp); COPY(sp); COPY(bx);
243 COPY(dx); COPY(cx); COPY(ip);
244 /* Don't touch extended registers */
246 err |= __get_user(regs->cs, &sc->cs);
248 err |= __get_user(regs->ss, &sc->ss);
251 err |= __get_user(tmpflags, &sc->eflags);
252 regs->eflags = (regs->eflags & ~0x40DD5) | (tmpflags & 0x40DD5);
253 /* disable syscall checks */
256 err |= __get_user(tmp, &sc->fpstate);
257 buf = compat_ptr(tmp);
259 if (!access_ok(VERIFY_READ, buf, sizeof(*buf)))
261 err |= restore_i387_ia32(current, buf, 0);
263 struct task_struct *me = current;
271 err |= __get_user(tmp, &sc->eax);
280 asmlinkage long sys32_sigreturn(struct pt_regs *regs)
282 struct sigframe __user *frame = (struct sigframe __user *)(regs->rsp-8);
286 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
288 if (__get_user(set.sig[0], &frame->sc.oldmask)
289 || (_COMPAT_NSIG_WORDS > 1
290 && __copy_from_user((((char *) &set.sig) + 4),
292 sizeof(frame->extramask))))
295 sigdelsetmask(&set, ~_BLOCKABLE);
296 spin_lock_irq(¤t->sighand->siglock);
297 current->blocked = set;
299 spin_unlock_irq(¤t->sighand->siglock);
301 if (ia32_restore_sigcontext(regs, &frame->sc, &eax))
306 signal_fault(regs, frame, "32bit sigreturn");
310 asmlinkage long sys32_rt_sigreturn(struct pt_regs *regs)
312 struct rt_sigframe __user *frame;
315 struct pt_regs tregs;
317 frame = (struct rt_sigframe __user *)(regs->rsp - 4);
319 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
321 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
324 sigdelsetmask(&set, ~_BLOCKABLE);
325 spin_lock_irq(¤t->sighand->siglock);
326 current->blocked = set;
328 spin_unlock_irq(¤t->sighand->siglock);
330 if (ia32_restore_sigcontext(regs, &frame->uc.uc_mcontext, &eax))
334 if (sys32_sigaltstack(&frame->uc.uc_stack, NULL, &tregs) == -EFAULT)
340 signal_fault(regs, frame, "32bit rt sigreturn");
345 * Set up a signal frame.
348 static int ia32_setup_sigcontext(struct sigcontext_ia32 __user *sc,
349 struct _fpstate_ia32 __user *fpstate,
350 struct pt_regs *regs, unsigned int mask)
355 __asm__("movl %%gs,%0" : "=r"(tmp): "0"(tmp));
356 err |= __put_user(tmp, (unsigned int __user *)&sc->gs);
357 __asm__("movl %%fs,%0" : "=r"(tmp): "0"(tmp));
358 err |= __put_user(tmp, (unsigned int __user *)&sc->fs);
359 __asm__("movl %%ds,%0" : "=r"(tmp): "0"(tmp));
360 err |= __put_user(tmp, (unsigned int __user *)&sc->ds);
361 __asm__("movl %%es,%0" : "=r"(tmp): "0"(tmp));
362 err |= __put_user(tmp, (unsigned int __user *)&sc->es);
364 err |= __put_user((u32)regs->rdi, &sc->edi);
365 err |= __put_user((u32)regs->rsi, &sc->esi);
366 err |= __put_user((u32)regs->rbp, &sc->ebp);
367 err |= __put_user((u32)regs->rsp, &sc->esp);
368 err |= __put_user((u32)regs->rbx, &sc->ebx);
369 err |= __put_user((u32)regs->rdx, &sc->edx);
370 err |= __put_user((u32)regs->rcx, &sc->ecx);
371 err |= __put_user((u32)regs->rax, &sc->eax);
372 err |= __put_user((u32)regs->cs, &sc->cs);
373 err |= __put_user((u32)regs->ss, &sc->ss);
374 err |= __put_user(current->thread.trap_no, &sc->trapno);
375 err |= __put_user(current->thread.error_code, &sc->err);
376 err |= __put_user((u32)regs->rip, &sc->eip);
377 err |= __put_user((u32)regs->eflags, &sc->eflags);
378 err |= __put_user((u32)regs->rsp, &sc->esp_at_signal);
380 tmp = save_i387_ia32(current, fpstate, regs, 0);
386 err |= __put_user(ptr_to_compat(tmp ? fpstate : NULL),
390 /* non-iBCS2 extensions.. */
391 err |= __put_user(mask, &sc->oldmask);
392 err |= __put_user(current->thread.cr2, &sc->cr2);
398 * Determine which stack to use..
400 static void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
405 /* Default to using normal stack */
408 /* This is the X/Open sanctioned signal stack switching. */
409 if (ka->sa.sa_flags & SA_ONSTACK) {
410 if (sas_ss_flags(rsp) == 0)
411 rsp = current->sas_ss_sp + current->sas_ss_size;
414 /* This is the legacy signal stack switching. */
415 else if ((regs->ss & 0xffff) != __USER_DS &&
416 !(ka->sa.sa_flags & SA_RESTORER) &&
418 rsp = (unsigned long) ka->sa.sa_restorer;
421 /* Align the stack pointer according to the i386 ABI,
422 * i.e. so that on function entry ((sp + 4) & 15) == 0. */
423 rsp = ((rsp + 4) & -16ul) - 4;
424 return (void __user *) rsp;
427 int ia32_setup_frame(int sig, struct k_sigaction *ka,
428 compat_sigset_t *set, struct pt_regs *regs)
430 struct sigframe __user *frame;
431 void __user *restorer;
434 /* copy_to_user optimizes that into a single 8 byte store */
435 static const struct {
440 } __attribute__((packed)) code = {
441 0xb858, /* popl %eax ; movl $...,%eax */
443 0x80cd, /* int $0x80 */
447 frame = get_sigframe(ka, regs, sizeof(*frame));
449 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
452 err |= __put_user(sig, &frame->sig);
456 err |= ia32_setup_sigcontext(&frame->sc, &frame->fpstate, regs,
461 if (_COMPAT_NSIG_WORDS > 1) {
462 err |= __copy_to_user(frame->extramask, &set->sig[1],
463 sizeof(frame->extramask));
468 if (ka->sa.sa_flags & SA_RESTORER) {
469 restorer = ka->sa.sa_restorer;
471 /* Return stub is in 32bit vsyscall page */
472 if (current->binfmt->hasvdso)
473 restorer = VDSO32_SYMBOL(current->mm->context.vdso,
476 restorer = (void *)&frame->retcode;
478 err |= __put_user(ptr_to_compat(restorer), &frame->pretcode);
481 * These are actually not used anymore, but left because some
482 * gdb versions depend on them as a marker.
484 err |= __copy_to_user(frame->retcode, &code, 8);
488 /* Set up registers for signal handler */
489 regs->rsp = (unsigned long) frame;
490 regs->rip = (unsigned long) ka->sa.sa_handler;
492 /* Make -mregparm=3 work */
497 asm volatile("movl %0,%%ds" :: "r" (__USER32_DS));
498 asm volatile("movl %0,%%es" :: "r" (__USER32_DS));
500 regs->cs = __USER32_CS;
501 regs->ss = __USER32_DS;
504 regs->eflags &= ~TF_MASK;
505 if (test_thread_flag(TIF_SINGLESTEP))
506 ptrace_notify(SIGTRAP);
509 printk(KERN_DEBUG "SIG deliver (%s:%d): sp=%p pc=%lx ra=%u\n",
510 current->comm, current->pid, frame, regs->rip, frame->pretcode);
516 force_sigsegv(sig, current);
520 int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
521 compat_sigset_t *set, struct pt_regs *regs)
523 struct rt_sigframe __user *frame;
524 struct exec_domain *ed = current_thread_info()->exec_domain;
525 void __user *restorer;
528 /* __copy_to_user optimizes that into a single 8 byte store */
529 static const struct {
535 } __attribute__((packed)) code = {
537 __NR_ia32_rt_sigreturn,
542 frame = get_sigframe(ka, regs, sizeof(*frame));
544 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
547 err |= __put_user((ed && ed->signal_invmap && sig < 32
548 ? ed->signal_invmap[sig] : sig), &frame->sig);
549 err |= __put_user(ptr_to_compat(&frame->info), &frame->pinfo);
550 err |= __put_user(ptr_to_compat(&frame->uc), &frame->puc);
551 err |= copy_siginfo_to_user32(&frame->info, info);
555 /* Create the ucontext. */
556 err |= __put_user(0, &frame->uc.uc_flags);
557 err |= __put_user(0, &frame->uc.uc_link);
558 err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
559 err |= __put_user(sas_ss_flags(regs->rsp),
560 &frame->uc.uc_stack.ss_flags);
561 err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
562 err |= ia32_setup_sigcontext(&frame->uc.uc_mcontext, &frame->fpstate,
564 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
568 if (ka->sa.sa_flags & SA_RESTORER)
569 restorer = ka->sa.sa_restorer;
571 restorer = VDSO32_SYMBOL(current->mm->context.vdso,
573 err |= __put_user(ptr_to_compat(restorer), &frame->pretcode);
576 * Not actually used anymore, but left because some gdb
579 err |= __copy_to_user(frame->retcode, &code, 8);
583 /* Set up registers for signal handler */
584 regs->rsp = (unsigned long) frame;
585 regs->rip = (unsigned long) ka->sa.sa_handler;
587 /* Make -mregparm=3 work */
589 regs->rdx = (unsigned long) &frame->info;
590 regs->rcx = (unsigned long) &frame->uc;
592 /* Make -mregparm=3 work */
594 regs->rdx = (unsigned long) &frame->info;
595 regs->rcx = (unsigned long) &frame->uc;
597 asm volatile("movl %0,%%ds" :: "r" (__USER32_DS));
598 asm volatile("movl %0,%%es" :: "r" (__USER32_DS));
600 regs->cs = __USER32_CS;
601 regs->ss = __USER32_DS;
604 regs->eflags &= ~TF_MASK;
605 if (test_thread_flag(TIF_SINGLESTEP))
606 ptrace_notify(SIGTRAP);
609 printk(KERN_DEBUG "SIG deliver (%s:%d): sp=%p pc=%lx ra=%u\n",
610 current->comm, current->pid, frame, regs->rip, frame->pretcode);
616 force_sigsegv(sig, current);