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>
34 #include <asm/vsyscall32.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 /* Return stub is in 32bit vsyscall page */
469 if (current->binfmt->hasvdso)
470 restorer = VSYSCALL32_SIGRETURN;
472 restorer = (void *)&frame->retcode;
473 if (ka->sa.sa_flags & SA_RESTORER)
474 restorer = ka->sa.sa_restorer;
475 err |= __put_user(ptr_to_compat(restorer), &frame->pretcode);
478 * These are actually not used anymore, but left because some
479 * gdb versions depend on them as a marker.
481 err |= __copy_to_user(frame->retcode, &code, 8);
485 /* Set up registers for signal handler */
486 regs->rsp = (unsigned long) frame;
487 regs->rip = (unsigned long) ka->sa.sa_handler;
489 /* Make -mregparm=3 work */
494 asm volatile("movl %0,%%ds" :: "r" (__USER32_DS));
495 asm volatile("movl %0,%%es" :: "r" (__USER32_DS));
497 regs->cs = __USER32_CS;
498 regs->ss = __USER32_DS;
501 regs->eflags &= ~TF_MASK;
502 if (test_thread_flag(TIF_SINGLESTEP))
503 ptrace_notify(SIGTRAP);
506 printk(KERN_DEBUG "SIG deliver (%s:%d): sp=%p pc=%lx ra=%u\n",
507 current->comm, current->pid, frame, regs->rip, frame->pretcode);
513 force_sigsegv(sig, current);
517 int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
518 compat_sigset_t *set, struct pt_regs *regs)
520 struct rt_sigframe __user *frame;
521 struct exec_domain *ed = current_thread_info()->exec_domain;
522 void __user *restorer = VSYSCALL32_RTSIGRETURN;
525 /* __copy_to_user optimizes that into a single 8 byte store */
526 static const struct {
532 } __attribute__((packed)) code = {
534 __NR_ia32_rt_sigreturn,
539 frame = get_sigframe(ka, regs, sizeof(*frame));
541 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
544 err |= __put_user((ed && ed->signal_invmap && sig < 32
545 ? ed->signal_invmap[sig] : sig), &frame->sig);
546 err |= __put_user(ptr_to_compat(&frame->info), &frame->pinfo);
547 err |= __put_user(ptr_to_compat(&frame->uc), &frame->puc);
548 err |= copy_siginfo_to_user32(&frame->info, info);
552 /* Create the ucontext. */
553 err |= __put_user(0, &frame->uc.uc_flags);
554 err |= __put_user(0, &frame->uc.uc_link);
555 err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
556 err |= __put_user(sas_ss_flags(regs->rsp),
557 &frame->uc.uc_stack.ss_flags);
558 err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
559 err |= ia32_setup_sigcontext(&frame->uc.uc_mcontext, &frame->fpstate,
561 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
565 if (ka->sa.sa_flags & SA_RESTORER)
566 restorer = ka->sa.sa_restorer;
567 err |= __put_user(ptr_to_compat(restorer), &frame->pretcode);
570 * Not actually used anymore, but left because some gdb
573 err |= __copy_to_user(frame->retcode, &code, 8);
577 /* Set up registers for signal handler */
578 regs->rsp = (unsigned long) frame;
579 regs->rip = (unsigned long) ka->sa.sa_handler;
581 /* Make -mregparm=3 work */
583 regs->rdx = (unsigned long) &frame->info;
584 regs->rcx = (unsigned long) &frame->uc;
586 /* Make -mregparm=3 work */
588 regs->rdx = (unsigned long) &frame->info;
589 regs->rcx = (unsigned long) &frame->uc;
591 asm volatile("movl %0,%%ds" :: "r" (__USER32_DS));
592 asm volatile("movl %0,%%es" :: "r" (__USER32_DS));
594 regs->cs = __USER32_CS;
595 regs->ss = __USER32_DS;
598 regs->eflags &= ~TF_MASK;
599 if (test_thread_flag(TIF_SINGLESTEP))
600 ptrace_notify(SIGTRAP);
603 printk(KERN_DEBUG "SIG deliver (%s:%d): sp=%p pc=%lx ra=%u\n",
604 current->comm, current->pid, frame, regs->rip, frame->pretcode);
610 force_sigsegv(sig, current);