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>
35 #include <asm/sigframe.h>
39 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
41 #define FIX_EFLAGS (X86_EFLAGS_AC | X86_EFLAGS_OF | \
42 X86_EFLAGS_DF | X86_EFLAGS_TF | X86_EFLAGS_SF | \
43 X86_EFLAGS_ZF | X86_EFLAGS_AF | X86_EFLAGS_PF | \
46 void signal_fault(struct pt_regs *regs, void __user *frame, char *where);
48 int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
52 if (!access_ok(VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
55 /* If you change siginfo_t structure, please make sure that
56 this code is fixed accordingly.
57 It should never copy any pad contained in the structure
58 to avoid security leaks, but must copy the generic
59 3 ints plus the relevant union member. */
60 err = __put_user(from->si_signo, &to->si_signo);
61 err |= __put_user(from->si_errno, &to->si_errno);
62 err |= __put_user((short)from->si_code, &to->si_code);
64 if (from->si_code < 0) {
65 err |= __put_user(from->si_pid, &to->si_pid);
66 err |= __put_user(from->si_uid, &to->si_uid);
67 err |= __put_user(ptr_to_compat(from->si_ptr), &to->si_ptr);
70 * First 32bits of unions are always present:
71 * si_pid === si_band === si_tid === si_addr(LS half)
73 err |= __put_user(from->_sifields._pad[0],
74 &to->_sifields._pad[0]);
75 switch (from->si_code >> 16) {
76 case __SI_FAULT >> 16:
79 err |= __put_user(from->si_utime, &to->si_utime);
80 err |= __put_user(from->si_stime, &to->si_stime);
81 err |= __put_user(from->si_status, &to->si_status);
85 err |= __put_user(from->si_uid, &to->si_uid);
88 err |= __put_user(from->si_fd, &to->si_fd);
90 case __SI_TIMER >> 16:
91 err |= __put_user(from->si_overrun, &to->si_overrun);
92 err |= __put_user(ptr_to_compat(from->si_ptr),
95 /* This is not generated by the kernel as of now. */
97 case __SI_MESGQ >> 16:
98 err |= __put_user(from->si_uid, &to->si_uid);
99 err |= __put_user(from->si_int, &to->si_int);
106 int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
111 if (!access_ok(VERIFY_READ, from, sizeof(compat_siginfo_t)))
114 err = __get_user(to->si_signo, &from->si_signo);
115 err |= __get_user(to->si_errno, &from->si_errno);
116 err |= __get_user(to->si_code, &from->si_code);
118 err |= __get_user(to->si_pid, &from->si_pid);
119 err |= __get_user(to->si_uid, &from->si_uid);
120 err |= __get_user(ptr32, &from->si_ptr);
121 to->si_ptr = compat_ptr(ptr32);
126 asmlinkage long sys32_sigsuspend(int history0, int history1, old_sigset_t mask)
129 spin_lock_irq(¤t->sighand->siglock);
130 current->saved_sigmask = current->blocked;
131 siginitset(¤t->blocked, mask);
133 spin_unlock_irq(¤t->sighand->siglock);
135 current->state = TASK_INTERRUPTIBLE;
137 set_restore_sigmask();
138 return -ERESTARTNOHAND;
141 asmlinkage long sys32_sigaltstack(const stack_ia32_t __user *uss_ptr,
142 stack_ia32_t __user *uoss_ptr,
143 struct pt_regs *regs)
152 memset(&uss, 0, sizeof(stack_t));
153 if (!access_ok(VERIFY_READ, uss_ptr, sizeof(stack_ia32_t)) ||
154 __get_user(ptr, &uss_ptr->ss_sp) ||
155 __get_user(uss.ss_flags, &uss_ptr->ss_flags) ||
156 __get_user(uss.ss_size, &uss_ptr->ss_size))
158 uss.ss_sp = compat_ptr(ptr);
162 ret = do_sigaltstack(uss_ptr ? &uss : NULL, &uoss, regs->sp);
164 if (ret >= 0 && uoss_ptr) {
165 if (!access_ok(VERIFY_WRITE, uoss_ptr, sizeof(stack_ia32_t)) ||
166 __put_user(ptr_to_compat(uoss.ss_sp), &uoss_ptr->ss_sp) ||
167 __put_user(uoss.ss_flags, &uoss_ptr->ss_flags) ||
168 __put_user(uoss.ss_size, &uoss_ptr->ss_size))
175 * Do a signal return; undo the signal stack.
178 err |= __get_user(regs->x, &sc->x); \
181 #define COPY_SEG_CPL3(seg) { \
182 unsigned short tmp; \
183 err |= __get_user(tmp, &sc->seg); \
184 regs->seg = tmp | 3; \
187 #define RELOAD_SEG(seg) { \
188 unsigned int cur, pre; \
189 err |= __get_user(pre, &sc->seg); \
190 savesegment(seg, cur); \
193 loadsegment(seg, pre); \
196 static int ia32_restore_sigcontext(struct pt_regs *regs,
197 struct sigcontext_ia32 __user *sc,
200 unsigned int tmpflags, gs, oldgs, err = 0;
204 /* Always make any pending restarted system calls return -EINTR */
205 current_thread_info()->restart_block.fn = do_no_restart_syscall;
208 printk(KERN_DEBUG "SIG restore_sigcontext: "
209 "sc=%p err(%x) eip(%x) cs(%x) flg(%x)\n",
210 sc, sc->err, sc->ip, sc->cs, sc->flags);
214 * Reload fs and gs if they have changed in the signal
215 * handler. This does not handle long fs/gs base changes in
216 * the handler, but does not clobber them at least in the
219 err |= __get_user(gs, &sc->gs);
221 savesegment(gs, oldgs);
229 COPY(di); COPY(si); COPY(bp); COPY(sp); COPY(bx);
230 COPY(dx); COPY(cx); COPY(ip);
231 /* Don't touch extended registers */
236 err |= __get_user(tmpflags, &sc->flags);
237 regs->flags = (regs->flags & ~FIX_EFLAGS) | (tmpflags & FIX_EFLAGS);
238 /* disable syscall checks */
241 err |= __get_user(tmp, &sc->fpstate);
242 buf = compat_ptr(tmp);
243 err |= restore_i387_xstate_ia32(buf);
245 err |= __get_user(*pax, &sc->ax);
249 asmlinkage long sys32_sigreturn(struct pt_regs *regs)
251 struct sigframe_ia32 __user *frame = (struct sigframe_ia32 __user *)(regs->sp-8);
255 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
257 if (__get_user(set.sig[0], &frame->sc.oldmask)
258 || (_COMPAT_NSIG_WORDS > 1
259 && __copy_from_user((((char *) &set.sig) + 4),
261 sizeof(frame->extramask))))
264 sigdelsetmask(&set, ~_BLOCKABLE);
265 spin_lock_irq(¤t->sighand->siglock);
266 current->blocked = set;
268 spin_unlock_irq(¤t->sighand->siglock);
270 if (ia32_restore_sigcontext(regs, &frame->sc, &ax))
275 signal_fault(regs, frame, "32bit sigreturn");
279 asmlinkage long sys32_rt_sigreturn(struct pt_regs *regs)
281 struct rt_sigframe_ia32 __user *frame;
284 struct pt_regs tregs;
286 frame = (struct rt_sigframe_ia32 __user *)(regs->sp - 4);
288 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
290 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
293 sigdelsetmask(&set, ~_BLOCKABLE);
294 spin_lock_irq(¤t->sighand->siglock);
295 current->blocked = set;
297 spin_unlock_irq(¤t->sighand->siglock);
299 if (ia32_restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax))
303 if (sys32_sigaltstack(&frame->uc.uc_stack, NULL, &tregs) == -EFAULT)
309 signal_fault(regs, frame, "32bit rt sigreturn");
314 * Set up a signal frame.
317 static int ia32_setup_sigcontext(struct sigcontext_ia32 __user *sc,
318 void __user *fpstate,
319 struct pt_regs *regs, unsigned int mask)
323 savesegment(gs, tmp);
324 err |= __put_user(tmp, (unsigned int __user *)&sc->gs);
325 savesegment(fs, tmp);
326 err |= __put_user(tmp, (unsigned int __user *)&sc->fs);
327 savesegment(ds, tmp);
328 err |= __put_user(tmp, (unsigned int __user *)&sc->ds);
329 savesegment(es, tmp);
330 err |= __put_user(tmp, (unsigned int __user *)&sc->es);
332 err |= __put_user(regs->di, &sc->di);
333 err |= __put_user(regs->si, &sc->si);
334 err |= __put_user(regs->bp, &sc->bp);
335 err |= __put_user(regs->sp, &sc->sp);
336 err |= __put_user(regs->bx, &sc->bx);
337 err |= __put_user(regs->dx, &sc->dx);
338 err |= __put_user(regs->cx, &sc->cx);
339 err |= __put_user(regs->ax, &sc->ax);
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->ip, &sc->ip);
343 err |= __put_user(regs->cs, (unsigned int __user *)&sc->cs);
344 err |= __put_user(regs->flags, &sc->flags);
345 err |= __put_user(regs->sp, &sc->sp_at_signal);
346 err |= __put_user(regs->ss, (unsigned int __user *)&sc->ss);
348 err |= __put_user(ptr_to_compat(fpstate), &sc->fpstate);
350 /* non-iBCS2 extensions.. */
351 err |= __put_user(mask, &sc->oldmask);
352 err |= __put_user(current->thread.cr2, &sc->cr2);
358 * Determine which stack to use..
360 static void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
366 /* Default to using normal stack */
369 /* This is the X/Open sanctioned signal stack switching. */
370 if (ka->sa.sa_flags & SA_ONSTACK) {
371 if (sas_ss_flags(sp) == 0)
372 sp = current->sas_ss_sp + current->sas_ss_size;
375 /* This is the legacy signal stack switching. */
376 else if ((regs->ss & 0xffff) != __USER32_DS &&
377 !(ka->sa.sa_flags & SA_RESTORER) &&
379 sp = (unsigned long) ka->sa.sa_restorer;
382 sp = sp - sig_xstate_ia32_size;
383 *fpstate = (struct _fpstate_ia32 *) sp;
384 if (save_i387_xstate_ia32(*fpstate) < 0)
385 return (void __user *) -1L;
389 /* Align the stack pointer according to the i386 ABI,
390 * i.e. so that on function entry ((sp + 4) & 15) == 0. */
391 sp = ((sp + 4) & -16ul) - 4;
392 return (void __user *) sp;
395 int ia32_setup_frame(int sig, struct k_sigaction *ka,
396 compat_sigset_t *set, struct pt_regs *regs)
398 struct sigframe_ia32 __user *frame;
399 void __user *restorer;
401 void __user *fpstate = NULL;
403 /* copy_to_user optimizes that into a single 8 byte store */
404 static const struct {
408 } __attribute__((packed)) code = {
409 0xb858, /* popl %eax ; movl $...,%eax */
411 0x80cd, /* int $0x80 */
414 frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate);
416 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
419 if (__put_user(sig, &frame->sig))
422 if (ia32_setup_sigcontext(&frame->sc, fpstate, regs, set->sig[0]))
425 if (_COMPAT_NSIG_WORDS > 1) {
426 if (__copy_to_user(frame->extramask, &set->sig[1],
427 sizeof(frame->extramask)))
431 if (ka->sa.sa_flags & SA_RESTORER) {
432 restorer = ka->sa.sa_restorer;
434 /* Return stub is in 32bit vsyscall page */
435 if (current->mm->context.vdso)
436 restorer = VDSO32_SYMBOL(current->mm->context.vdso,
439 restorer = &frame->retcode;
441 err |= __put_user(ptr_to_compat(restorer), &frame->pretcode);
444 * These are actually not used anymore, but left because some
445 * gdb versions depend on them as a marker.
447 err |= __put_user(*((u64 *)&code), (u64 *)frame->retcode);
451 /* Set up registers for signal handler */
452 regs->sp = (unsigned long) frame;
453 regs->ip = (unsigned long) ka->sa.sa_handler;
455 /* Make -mregparm=3 work */
460 loadsegment(ds, __USER32_DS);
461 loadsegment(es, __USER32_DS);
463 regs->cs = __USER32_CS;
464 regs->ss = __USER32_DS;
467 printk(KERN_DEBUG "SIG deliver (%s:%d): sp=%p pc=%lx ra=%u\n",
468 current->comm, current->pid, frame, regs->ip, frame->pretcode);
474 int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
475 compat_sigset_t *set, struct pt_regs *regs)
477 struct rt_sigframe_ia32 __user *frame;
478 void __user *restorer;
480 void __user *fpstate = NULL;
482 /* __copy_to_user optimizes that into a single 8 byte store */
483 static const struct {
488 } __attribute__((packed)) code = {
490 __NR_ia32_rt_sigreturn,
495 frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate);
497 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
500 err |= __put_user(sig, &frame->sig);
501 err |= __put_user(ptr_to_compat(&frame->info), &frame->pinfo);
502 err |= __put_user(ptr_to_compat(&frame->uc), &frame->puc);
503 err |= copy_siginfo_to_user32(&frame->info, info);
507 /* Create the ucontext. */
509 err |= __put_user(UC_FP_XSTATE, &frame->uc.uc_flags);
511 err |= __put_user(0, &frame->uc.uc_flags);
512 err |= __put_user(0, &frame->uc.uc_link);
513 err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
514 err |= __put_user(sas_ss_flags(regs->sp),
515 &frame->uc.uc_stack.ss_flags);
516 err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
517 err |= ia32_setup_sigcontext(&frame->uc.uc_mcontext, fpstate,
519 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
523 if (ka->sa.sa_flags & SA_RESTORER)
524 restorer = ka->sa.sa_restorer;
526 restorer = VDSO32_SYMBOL(current->mm->context.vdso,
528 err |= __put_user(ptr_to_compat(restorer), &frame->pretcode);
531 * Not actually used anymore, but left because some gdb
534 err |= __put_user(*((u64 *)&code), (u64 *)frame->retcode);
538 /* Set up registers for signal handler */
539 regs->sp = (unsigned long) frame;
540 regs->ip = (unsigned long) ka->sa.sa_handler;
542 /* Make -mregparm=3 work */
544 regs->dx = (unsigned long) &frame->info;
545 regs->cx = (unsigned long) &frame->uc;
547 loadsegment(ds, __USER32_DS);
548 loadsegment(es, __USER32_DS);
550 regs->cs = __USER32_CS;
551 regs->ss = __USER32_DS;
554 printk(KERN_DEBUG "SIG deliver (%s:%d): sp=%p pc=%lx ra=%u\n",
555 current->comm, current->pid, frame, regs->ip, frame->pretcode);