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/proto.h>
37 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
39 #define FIX_EFLAGS (X86_EFLAGS_AC | X86_EFLAGS_OF | \
40 X86_EFLAGS_DF | X86_EFLAGS_TF | X86_EFLAGS_SF | \
41 X86_EFLAGS_ZF | X86_EFLAGS_AF | X86_EFLAGS_PF | \
44 asmlinkage int do_signal(struct pt_regs *regs, sigset_t *oldset);
45 void signal_fault(struct pt_regs *regs, void __user *frame, char *where);
47 int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
51 if (!access_ok(VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
54 /* If you change siginfo_t structure, please make sure that
55 this code is fixed accordingly.
56 It should never copy any pad contained in the structure
57 to avoid security leaks, but must copy the generic
58 3 ints plus the relevant union member. */
59 err = __put_user(from->si_signo, &to->si_signo);
60 err |= __put_user(from->si_errno, &to->si_errno);
61 err |= __put_user((short)from->si_code, &to->si_code);
63 if (from->si_code < 0) {
64 err |= __put_user(from->si_pid, &to->si_pid);
65 err |= __put_user(from->si_uid, &to->si_uid);
66 err |= __put_user(ptr_to_compat(from->si_ptr), &to->si_ptr);
69 * First 32bits of unions are always present:
70 * si_pid === si_band === si_tid === si_addr(LS half)
72 err |= __put_user(from->_sifields._pad[0],
73 &to->_sifields._pad[0]);
74 switch (from->si_code >> 16) {
75 case __SI_FAULT >> 16:
78 err |= __put_user(from->si_utime, &to->si_utime);
79 err |= __put_user(from->si_stime, &to->si_stime);
80 err |= __put_user(from->si_status, &to->si_status);
84 err |= __put_user(from->si_uid, &to->si_uid);
87 err |= __put_user(from->si_fd, &to->si_fd);
89 case __SI_TIMER >> 16:
90 err |= __put_user(from->si_overrun, &to->si_overrun);
91 err |= __put_user(ptr_to_compat(from->si_ptr),
94 /* This is not generated by the kernel as of now. */
96 case __SI_MESGQ >> 16:
97 err |= __put_user(from->si_uid, &to->si_uid);
98 err |= __put_user(from->si_int, &to->si_int);
105 int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
110 if (!access_ok(VERIFY_READ, from, sizeof(compat_siginfo_t)))
113 err = __get_user(to->si_signo, &from->si_signo);
114 err |= __get_user(to->si_errno, &from->si_errno);
115 err |= __get_user(to->si_code, &from->si_code);
117 err |= __get_user(to->si_pid, &from->si_pid);
118 err |= __get_user(to->si_uid, &from->si_uid);
119 err |= __get_user(ptr32, &from->si_ptr);
120 to->si_ptr = compat_ptr(ptr32);
125 asmlinkage long sys32_sigsuspend(int history0, int history1, old_sigset_t mask)
128 spin_lock_irq(¤t->sighand->siglock);
129 current->saved_sigmask = current->blocked;
130 siginitset(¤t->blocked, mask);
132 spin_unlock_irq(¤t->sighand->siglock);
134 current->state = TASK_INTERRUPTIBLE;
136 set_restore_sigmask();
137 return -ERESTARTNOHAND;
140 asmlinkage long sys32_sigaltstack(const stack_ia32_t __user *uss_ptr,
141 stack_ia32_t __user *uoss_ptr,
142 struct pt_regs *regs)
151 memset(&uss, 0, sizeof(stack_t));
152 if (!access_ok(VERIFY_READ, uss_ptr, sizeof(stack_ia32_t)) ||
153 __get_user(ptr, &uss_ptr->ss_sp) ||
154 __get_user(uss.ss_flags, &uss_ptr->ss_flags) ||
155 __get_user(uss.ss_size, &uss_ptr->ss_size))
157 uss.ss_sp = compat_ptr(ptr);
161 ret = do_sigaltstack(uss_ptr ? &uss : NULL, &uoss, regs->sp);
163 if (ret >= 0 && uoss_ptr) {
164 if (!access_ok(VERIFY_WRITE, uoss_ptr, sizeof(stack_ia32_t)) ||
165 __put_user(ptr_to_compat(uoss.ss_sp), &uoss_ptr->ss_sp) ||
166 __put_user(uoss.ss_flags, &uoss_ptr->ss_flags) ||
167 __put_user(uoss.ss_size, &uoss_ptr->ss_size))
174 * Do a signal return; undo the signal stack.
181 struct sigcontext_ia32 sc;
182 struct _fpstate_ia32 fpstate;
183 unsigned int extramask[_COMPAT_NSIG_WORDS-1];
193 compat_siginfo_t info;
194 struct ucontext_ia32 uc;
195 struct _fpstate_ia32 fpstate;
201 err |= __get_user(reg, &sc->x); \
205 #define RELOAD_SEG(seg,mask) \
206 { unsigned int cur; \
207 unsigned short pre; \
208 err |= __get_user(pre, &sc->seg); \
209 asm volatile("movl %%" #seg ",%0" : "=r" (cur)); \
211 if (pre != cur) loadsegment(seg, pre); }
213 static int ia32_restore_sigcontext(struct pt_regs *regs,
214 struct sigcontext_ia32 __user *sc,
217 unsigned int tmpflags, gs, oldgs, err = 0;
218 struct _fpstate_ia32 __user *buf;
221 /* Always make any pending restarted system calls return -EINTR */
222 current_thread_info()->restart_block.fn = do_no_restart_syscall;
225 printk(KERN_DEBUG "SIG restore_sigcontext: "
226 "sc=%p err(%x) eip(%x) cs(%x) flg(%x)\n",
227 sc, sc->err, sc->ip, sc->cs, sc->flags);
231 * Reload fs and gs if they have changed in the signal
232 * handler. This does not handle long fs/gs base changes in
233 * the handler, but does not clobber them at least in the
236 err |= __get_user(gs, &sc->gs);
238 asm("movl %%gs,%0" : "=r" (oldgs));
246 COPY(di); COPY(si); COPY(bp); COPY(sp); COPY(bx);
247 COPY(dx); COPY(cx); COPY(ip);
248 /* Don't touch extended registers */
250 err |= __get_user(regs->cs, &sc->cs);
252 err |= __get_user(regs->ss, &sc->ss);
255 err |= __get_user(tmpflags, &sc->flags);
256 regs->flags = (regs->flags & ~FIX_EFLAGS) | (tmpflags & FIX_EFLAGS);
257 /* disable syscall checks */
260 err |= __get_user(tmp, &sc->fpstate);
261 buf = compat_ptr(tmp);
263 if (!access_ok(VERIFY_READ, buf, sizeof(*buf)))
265 err |= restore_i387_ia32(buf);
267 struct task_struct *me = current;
275 err |= __get_user(tmp, &sc->ax);
284 asmlinkage long sys32_sigreturn(struct pt_regs *regs)
286 struct sigframe __user *frame = (struct sigframe __user *)(regs->sp-8);
290 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
292 if (__get_user(set.sig[0], &frame->sc.oldmask)
293 || (_COMPAT_NSIG_WORDS > 1
294 && __copy_from_user((((char *) &set.sig) + 4),
296 sizeof(frame->extramask))))
299 sigdelsetmask(&set, ~_BLOCKABLE);
300 spin_lock_irq(¤t->sighand->siglock);
301 current->blocked = set;
303 spin_unlock_irq(¤t->sighand->siglock);
305 if (ia32_restore_sigcontext(regs, &frame->sc, &ax))
310 signal_fault(regs, frame, "32bit sigreturn");
314 asmlinkage long sys32_rt_sigreturn(struct pt_regs *regs)
316 struct rt_sigframe __user *frame;
319 struct pt_regs tregs;
321 frame = (struct rt_sigframe __user *)(regs->sp - 4);
323 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
325 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
328 sigdelsetmask(&set, ~_BLOCKABLE);
329 spin_lock_irq(¤t->sighand->siglock);
330 current->blocked = set;
332 spin_unlock_irq(¤t->sighand->siglock);
334 if (ia32_restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax))
338 if (sys32_sigaltstack(&frame->uc.uc_stack, NULL, &tregs) == -EFAULT)
344 signal_fault(regs, frame, "32bit rt sigreturn");
349 * Set up a signal frame.
352 static int ia32_setup_sigcontext(struct sigcontext_ia32 __user *sc,
353 struct _fpstate_ia32 __user *fpstate,
354 struct pt_regs *regs, unsigned int mask)
359 __asm__("movl %%gs,%0" : "=r"(tmp): "0"(tmp));
360 err |= __put_user(tmp, (unsigned int __user *)&sc->gs);
361 __asm__("movl %%fs,%0" : "=r"(tmp): "0"(tmp));
362 err |= __put_user(tmp, (unsigned int __user *)&sc->fs);
363 __asm__("movl %%ds,%0" : "=r"(tmp): "0"(tmp));
364 err |= __put_user(tmp, (unsigned int __user *)&sc->ds);
365 __asm__("movl %%es,%0" : "=r"(tmp): "0"(tmp));
366 err |= __put_user(tmp, (unsigned int __user *)&sc->es);
368 err |= __put_user((u32)regs->di, &sc->di);
369 err |= __put_user((u32)regs->si, &sc->si);
370 err |= __put_user((u32)regs->bp, &sc->bp);
371 err |= __put_user((u32)regs->sp, &sc->sp);
372 err |= __put_user((u32)regs->bx, &sc->bx);
373 err |= __put_user((u32)regs->dx, &sc->dx);
374 err |= __put_user((u32)regs->cx, &sc->cx);
375 err |= __put_user((u32)regs->ax, &sc->ax);
376 err |= __put_user((u32)regs->cs, &sc->cs);
377 err |= __put_user((u32)regs->ss, &sc->ss);
378 err |= __put_user(current->thread.trap_no, &sc->trapno);
379 err |= __put_user(current->thread.error_code, &sc->err);
380 err |= __put_user((u32)regs->ip, &sc->ip);
381 err |= __put_user((u32)regs->flags, &sc->flags);
382 err |= __put_user((u32)regs->sp, &sc->sp_at_signal);
384 tmp = save_i387_ia32(fpstate);
390 err |= __put_user(ptr_to_compat(tmp ? fpstate : NULL),
394 /* non-iBCS2 extensions.. */
395 err |= __put_user(mask, &sc->oldmask);
396 err |= __put_user(current->thread.cr2, &sc->cr2);
402 * Determine which stack to use..
404 static void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
409 /* Default to using normal stack */
412 /* This is the X/Open sanctioned signal stack switching. */
413 if (ka->sa.sa_flags & SA_ONSTACK) {
414 if (sas_ss_flags(sp) == 0)
415 sp = current->sas_ss_sp + current->sas_ss_size;
418 /* This is the legacy signal stack switching. */
419 else if ((regs->ss & 0xffff) != __USER_DS &&
420 !(ka->sa.sa_flags & SA_RESTORER) &&
422 sp = (unsigned long) ka->sa.sa_restorer;
425 /* Align the stack pointer according to the i386 ABI,
426 * i.e. so that on function entry ((sp + 4) & 15) == 0. */
427 sp = ((sp + 4) & -16ul) - 4;
428 return (void __user *) sp;
431 int ia32_setup_frame(int sig, struct k_sigaction *ka,
432 compat_sigset_t *set, struct pt_regs *regs)
434 struct sigframe __user *frame;
435 void __user *restorer;
438 /* copy_to_user optimizes that into a single 8 byte store */
439 static const struct {
444 } __attribute__((packed)) code = {
445 0xb858, /* popl %eax ; movl $...,%eax */
447 0x80cd, /* int $0x80 */
451 frame = get_sigframe(ka, regs, sizeof(*frame));
453 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
456 err |= __put_user(sig, &frame->sig);
460 err |= ia32_setup_sigcontext(&frame->sc, &frame->fpstate, regs,
465 if (_COMPAT_NSIG_WORDS > 1) {
466 err |= __copy_to_user(frame->extramask, &set->sig[1],
467 sizeof(frame->extramask));
472 if (ka->sa.sa_flags & SA_RESTORER) {
473 restorer = ka->sa.sa_restorer;
475 /* Return stub is in 32bit vsyscall page */
476 if (current->mm->context.vdso)
477 restorer = VDSO32_SYMBOL(current->mm->context.vdso,
480 restorer = &frame->retcode;
482 err |= __put_user(ptr_to_compat(restorer), &frame->pretcode);
485 * These are actually not used anymore, but left because some
486 * gdb versions depend on them as a marker.
488 err |= __copy_to_user(frame->retcode, &code, 8);
492 /* Set up registers for signal handler */
493 regs->sp = (unsigned long) frame;
494 regs->ip = (unsigned long) ka->sa.sa_handler;
496 /* Make -mregparm=3 work */
501 asm volatile("movl %0,%%ds" :: "r" (__USER32_DS));
502 asm volatile("movl %0,%%es" :: "r" (__USER32_DS));
504 regs->cs = __USER32_CS;
505 regs->ss = __USER32_DS;
508 printk(KERN_DEBUG "SIG deliver (%s:%d): sp=%p pc=%lx ra=%u\n",
509 current->comm, current->pid, frame, regs->ip, frame->pretcode);
515 force_sigsegv(sig, current);
519 int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
520 compat_sigset_t *set, struct pt_regs *regs)
522 struct rt_sigframe __user *frame;
523 void __user *restorer;
526 /* __copy_to_user optimizes that into a single 8 byte store */
527 static const struct {
533 } __attribute__((packed)) code = {
535 __NR_ia32_rt_sigreturn,
540 frame = get_sigframe(ka, regs, sizeof(*frame));
542 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
545 err |= __put_user(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->sp),
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;
568 restorer = VDSO32_SYMBOL(current->mm->context.vdso,
570 err |= __put_user(ptr_to_compat(restorer), &frame->pretcode);
573 * Not actually used anymore, but left because some gdb
576 err |= __copy_to_user(frame->retcode, &code, 8);
580 /* Set up registers for signal handler */
581 regs->sp = (unsigned long) frame;
582 regs->ip = (unsigned long) ka->sa.sa_handler;
584 /* Make -mregparm=3 work */
586 regs->dx = (unsigned long) &frame->info;
587 regs->cx = (unsigned long) &frame->uc;
589 /* Make -mregparm=3 work */
591 regs->dx = (unsigned long) &frame->info;
592 regs->cx = (unsigned long) &frame->uc;
594 asm volatile("movl %0,%%ds" :: "r" (__USER32_DS));
595 asm volatile("movl %0,%%es" :: "r" (__USER32_DS));
597 regs->cs = __USER32_CS;
598 regs->ss = __USER32_DS;
601 printk(KERN_DEBUG "SIG deliver (%s:%d): sp=%p pc=%lx ra=%u\n",
602 current->comm, current->pid, frame, regs->ip, frame->pretcode);
608 force_sigsegv(sig, current);