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>
27 #include <asm/ptrace.h>
28 #include <asm/ia32_unistd.h>
29 #include <asm/user32.h>
30 #include <asm/sigcontext32.h>
31 #include <asm/proto.h>
33 #include <asm/sigframe.h>
34 #include <asm/sys_ia32.h>
36 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
38 #define FIX_EFLAGS (X86_EFLAGS_AC | X86_EFLAGS_OF | \
39 X86_EFLAGS_DF | X86_EFLAGS_TF | X86_EFLAGS_SF | \
40 X86_EFLAGS_ZF | X86_EFLAGS_AF | X86_EFLAGS_PF | \
43 void signal_fault(struct pt_regs *regs, void __user *frame, char *where);
45 int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
49 if (!access_ok(VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
53 /* If you change siginfo_t structure, please make sure that
54 this code is fixed accordingly.
55 It should never copy any pad contained in the structure
56 to avoid security leaks, but must copy the generic
57 3 ints plus the relevant union member. */
58 put_user_ex(from->si_signo, &to->si_signo);
59 put_user_ex(from->si_errno, &to->si_errno);
60 put_user_ex((short)from->si_code, &to->si_code);
62 if (from->si_code < 0) {
63 put_user_ex(from->si_pid, &to->si_pid);
64 put_user_ex(from->si_uid, &to->si_uid);
65 put_user_ex(ptr_to_compat(from->si_ptr), &to->si_ptr);
68 * First 32bits of unions are always present:
69 * si_pid === si_band === si_tid === si_addr(LS half)
71 put_user_ex(from->_sifields._pad[0],
72 &to->_sifields._pad[0]);
73 switch (from->si_code >> 16) {
74 case __SI_FAULT >> 16:
77 put_user_ex(from->si_utime, &to->si_utime);
78 put_user_ex(from->si_stime, &to->si_stime);
79 put_user_ex(from->si_status, &to->si_status);
83 put_user_ex(from->si_uid, &to->si_uid);
86 put_user_ex(from->si_fd, &to->si_fd);
88 case __SI_TIMER >> 16:
89 put_user_ex(from->si_overrun, &to->si_overrun);
90 put_user_ex(ptr_to_compat(from->si_ptr),
93 /* This is not generated by the kernel as of now. */
95 case __SI_MESGQ >> 16:
96 put_user_ex(from->si_uid, &to->si_uid);
97 put_user_ex(from->si_int, &to->si_int);
101 } put_user_catch(err);
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)))
115 get_user_ex(to->si_signo, &from->si_signo);
116 get_user_ex(to->si_errno, &from->si_errno);
117 get_user_ex(to->si_code, &from->si_code);
119 get_user_ex(to->si_pid, &from->si_pid);
120 get_user_ex(to->si_uid, &from->si_uid);
121 get_user_ex(ptr32, &from->si_ptr);
122 to->si_ptr = compat_ptr(ptr32);
123 } get_user_catch(err);
128 asmlinkage long sys32_sigsuspend(int history0, int history1, old_sigset_t mask)
131 spin_lock_irq(¤t->sighand->siglock);
132 current->saved_sigmask = current->blocked;
133 siginitset(¤t->blocked, mask);
135 spin_unlock_irq(¤t->sighand->siglock);
137 current->state = TASK_INTERRUPTIBLE;
139 set_restore_sigmask();
140 return -ERESTARTNOHAND;
143 asmlinkage long sys32_sigaltstack(const stack_ia32_t __user *uss_ptr,
144 stack_ia32_t __user *uoss_ptr,
145 struct pt_regs *regs)
154 memset(&uss, 0, sizeof(stack_t));
155 if (!access_ok(VERIFY_READ, uss_ptr, sizeof(stack_ia32_t)))
159 get_user_ex(ptr, &uss_ptr->ss_sp);
160 get_user_ex(uss.ss_flags, &uss_ptr->ss_flags);
161 get_user_ex(uss.ss_size, &uss_ptr->ss_size);
162 } get_user_catch(err);
166 uss.ss_sp = compat_ptr(ptr);
170 ret = do_sigaltstack(uss_ptr ? &uss : NULL, &uoss, regs->sp);
172 if (ret >= 0 && uoss_ptr) {
173 if (!access_ok(VERIFY_WRITE, uoss_ptr, sizeof(stack_ia32_t)))
177 put_user_ex(ptr_to_compat(uoss.ss_sp), &uoss_ptr->ss_sp);
178 put_user_ex(uoss.ss_flags, &uoss_ptr->ss_flags);
179 put_user_ex(uoss.ss_size, &uoss_ptr->ss_size);
180 } put_user_catch(err);
189 * Do a signal return; undo the signal stack.
192 get_user_ex(regs->x, &sc->x); \
195 #define COPY_SEG_CPL3(seg) { \
196 unsigned short tmp; \
197 get_user_ex(tmp, &sc->seg); \
198 regs->seg = tmp | 3; \
201 #define RELOAD_SEG(seg) { \
202 unsigned int cur, pre; \
203 get_user_ex(pre, &sc->seg); \
204 savesegment(seg, cur); \
207 loadsegment(seg, pre); \
210 static int ia32_restore_sigcontext(struct pt_regs *regs,
211 struct sigcontext_ia32 __user *sc,
214 unsigned int tmpflags, gs, oldgs, err = 0;
218 /* Always make any pending restarted system calls return -EINTR */
219 current_thread_info()->restart_block.fn = do_no_restart_syscall;
223 * Reload fs and gs if they have changed in the signal
224 * handler. This does not handle long fs/gs base changes in
225 * the handler, but does not clobber them at least in the
228 get_user_ex(gs, &sc->gs);
230 savesegment(gs, oldgs);
238 COPY(di); COPY(si); COPY(bp); COPY(sp); COPY(bx);
239 COPY(dx); COPY(cx); COPY(ip);
240 /* Don't touch extended registers */
245 get_user_ex(tmpflags, &sc->flags);
246 regs->flags = (regs->flags & ~FIX_EFLAGS) | (tmpflags & FIX_EFLAGS);
247 /* disable syscall checks */
250 get_user_ex(tmp, &sc->fpstate);
251 buf = compat_ptr(tmp);
252 err |= restore_i387_xstate_ia32(buf);
254 get_user_ex(*pax, &sc->ax);
255 } get_user_catch(err);
260 asmlinkage long sys32_sigreturn(struct pt_regs *regs)
262 struct sigframe_ia32 __user *frame = (struct sigframe_ia32 __user *)(regs->sp-8);
266 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
268 if (__get_user(set.sig[0], &frame->sc.oldmask)
269 || (_COMPAT_NSIG_WORDS > 1
270 && __copy_from_user((((char *) &set.sig) + 4),
272 sizeof(frame->extramask))))
275 sigdelsetmask(&set, ~_BLOCKABLE);
276 spin_lock_irq(¤t->sighand->siglock);
277 current->blocked = set;
279 spin_unlock_irq(¤t->sighand->siglock);
281 if (ia32_restore_sigcontext(regs, &frame->sc, &ax))
286 signal_fault(regs, frame, "32bit sigreturn");
290 asmlinkage long sys32_rt_sigreturn(struct pt_regs *regs)
292 struct rt_sigframe_ia32 __user *frame;
295 struct pt_regs tregs;
297 frame = (struct rt_sigframe_ia32 __user *)(regs->sp - 4);
299 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
301 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
304 sigdelsetmask(&set, ~_BLOCKABLE);
305 spin_lock_irq(¤t->sighand->siglock);
306 current->blocked = set;
308 spin_unlock_irq(¤t->sighand->siglock);
310 if (ia32_restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax))
314 if (sys32_sigaltstack(&frame->uc.uc_stack, NULL, &tregs) == -EFAULT)
320 signal_fault(regs, frame, "32bit rt sigreturn");
325 * Set up a signal frame.
328 static int ia32_setup_sigcontext(struct sigcontext_ia32 __user *sc,
329 void __user *fpstate,
330 struct pt_regs *regs, unsigned int mask)
335 savesegment(gs, tmp);
336 put_user_ex(tmp, (unsigned int __user *)&sc->gs);
337 savesegment(fs, tmp);
338 put_user_ex(tmp, (unsigned int __user *)&sc->fs);
339 savesegment(ds, tmp);
340 put_user_ex(tmp, (unsigned int __user *)&sc->ds);
341 savesegment(es, tmp);
342 put_user_ex(tmp, (unsigned int __user *)&sc->es);
344 put_user_ex(regs->di, &sc->di);
345 put_user_ex(regs->si, &sc->si);
346 put_user_ex(regs->bp, &sc->bp);
347 put_user_ex(regs->sp, &sc->sp);
348 put_user_ex(regs->bx, &sc->bx);
349 put_user_ex(regs->dx, &sc->dx);
350 put_user_ex(regs->cx, &sc->cx);
351 put_user_ex(regs->ax, &sc->ax);
352 put_user_ex(current->thread.trap_no, &sc->trapno);
353 put_user_ex(current->thread.error_code, &sc->err);
354 put_user_ex(regs->ip, &sc->ip);
355 put_user_ex(regs->cs, (unsigned int __user *)&sc->cs);
356 put_user_ex(regs->flags, &sc->flags);
357 put_user_ex(regs->sp, &sc->sp_at_signal);
358 put_user_ex(regs->ss, (unsigned int __user *)&sc->ss);
360 put_user_ex(ptr_to_compat(fpstate), &sc->fpstate);
362 /* non-iBCS2 extensions.. */
363 put_user_ex(mask, &sc->oldmask);
364 put_user_ex(current->thread.cr2, &sc->cr2);
365 } put_user_catch(err);
371 * Determine which stack to use..
373 static void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
379 /* Default to using normal stack */
382 /* This is the X/Open sanctioned signal stack switching. */
383 if (ka->sa.sa_flags & SA_ONSTACK) {
384 if (sas_ss_flags(sp) == 0)
385 sp = current->sas_ss_sp + current->sas_ss_size;
388 /* This is the legacy signal stack switching. */
389 else if ((regs->ss & 0xffff) != __USER32_DS &&
390 !(ka->sa.sa_flags & SA_RESTORER) &&
392 sp = (unsigned long) ka->sa.sa_restorer;
395 sp = sp - sig_xstate_ia32_size;
396 *fpstate = (struct _fpstate_ia32 *) sp;
397 if (save_i387_xstate_ia32(*fpstate) < 0)
398 return (void __user *) -1L;
402 /* Align the stack pointer according to the i386 ABI,
403 * i.e. so that on function entry ((sp + 4) & 15) == 0. */
404 sp = ((sp + 4) & -16ul) - 4;
405 return (void __user *) sp;
408 int ia32_setup_frame(int sig, struct k_sigaction *ka,
409 compat_sigset_t *set, struct pt_regs *regs)
411 struct sigframe_ia32 __user *frame;
412 void __user *restorer;
414 void __user *fpstate = NULL;
416 /* copy_to_user optimizes that into a single 8 byte store */
417 static const struct {
421 } __attribute__((packed)) code = {
422 0xb858, /* popl %eax ; movl $...,%eax */
424 0x80cd, /* int $0x80 */
427 frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate);
429 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
432 if (__put_user(sig, &frame->sig))
435 if (ia32_setup_sigcontext(&frame->sc, fpstate, regs, set->sig[0]))
438 if (_COMPAT_NSIG_WORDS > 1) {
439 if (__copy_to_user(frame->extramask, &set->sig[1],
440 sizeof(frame->extramask)))
444 if (ka->sa.sa_flags & SA_RESTORER) {
445 restorer = ka->sa.sa_restorer;
447 /* Return stub is in 32bit vsyscall page */
448 if (current->mm->context.vdso)
449 restorer = VDSO32_SYMBOL(current->mm->context.vdso,
452 restorer = &frame->retcode;
456 put_user_ex(ptr_to_compat(restorer), &frame->pretcode);
459 * These are actually not used anymore, but left because some
460 * gdb versions depend on them as a marker.
462 put_user_ex(*((u64 *)&code), (u64 *)frame->retcode);
463 } put_user_catch(err);
468 /* Set up registers for signal handler */
469 regs->sp = (unsigned long) frame;
470 regs->ip = (unsigned long) ka->sa.sa_handler;
472 /* Make -mregparm=3 work */
477 loadsegment(ds, __USER32_DS);
478 loadsegment(es, __USER32_DS);
480 regs->cs = __USER32_CS;
481 regs->ss = __USER32_DS;
486 int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
487 compat_sigset_t *set, struct pt_regs *regs)
489 struct rt_sigframe_ia32 __user *frame;
490 void __user *restorer;
492 void __user *fpstate = NULL;
494 /* __copy_to_user optimizes that into a single 8 byte store */
495 static const struct {
500 } __attribute__((packed)) code = {
502 __NR_ia32_rt_sigreturn,
507 frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate);
509 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
513 put_user_ex(sig, &frame->sig);
514 put_user_ex(ptr_to_compat(&frame->info), &frame->pinfo);
515 put_user_ex(ptr_to_compat(&frame->uc), &frame->puc);
516 err |= copy_siginfo_to_user32(&frame->info, info);
518 /* Create the ucontext. */
520 put_user_ex(UC_FP_XSTATE, &frame->uc.uc_flags);
522 put_user_ex(0, &frame->uc.uc_flags);
523 put_user_ex(0, &frame->uc.uc_link);
524 put_user_ex(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
525 put_user_ex(sas_ss_flags(regs->sp),
526 &frame->uc.uc_stack.ss_flags);
527 put_user_ex(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
528 err |= ia32_setup_sigcontext(&frame->uc.uc_mcontext, fpstate,
530 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
532 if (ka->sa.sa_flags & SA_RESTORER)
533 restorer = ka->sa.sa_restorer;
535 restorer = VDSO32_SYMBOL(current->mm->context.vdso,
537 put_user_ex(ptr_to_compat(restorer), &frame->pretcode);
540 * Not actually used anymore, but left because some gdb
543 put_user_ex(*((u64 *)&code), (u64 *)frame->retcode);
544 } put_user_catch(err);
549 /* Set up registers for signal handler */
550 regs->sp = (unsigned long) frame;
551 regs->ip = (unsigned long) ka->sa.sa_handler;
553 /* Make -mregparm=3 work */
555 regs->dx = (unsigned long) &frame->info;
556 regs->cx = (unsigned long) &frame->uc;
558 loadsegment(ds, __USER32_DS);
559 loadsegment(es, __USER32_DS);
561 regs->cs = __USER32_CS;
562 regs->ss = __USER32_DS;