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
10 * $Id: ia32_signal.c,v 1.22 2002/07/29 10:34:03 ak Exp $
13 #include <linux/sched.h>
15 #include <linux/smp.h>
16 #include <linux/smp_lock.h>
17 #include <linux/kernel.h>
18 #include <linux/signal.h>
19 #include <linux/errno.h>
20 #include <linux/wait.h>
21 #include <linux/ptrace.h>
22 #include <linux/unistd.h>
23 #include <linux/stddef.h>
24 #include <linux/personality.h>
25 #include <linux/compat.h>
26 #include <asm/ucontext.h>
27 #include <asm/uaccess.h>
30 #include <asm/ptrace.h>
31 #include <asm/ia32_unistd.h>
32 #include <asm/user32.h>
33 #include <asm/sigcontext32.h>
34 #include <asm/fpu32.h>
35 #include <asm/proto.h>
36 #include <asm/vsyscall32.h>
38 #define ptr_to_u32(x) ((u32)(u64)(x)) /* avoid gcc warning */
42 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
44 asmlinkage int do_signal(struct pt_regs *regs, sigset_t *oldset);
45 void signal_fault(struct pt_regs *regs, void *frame, char *where);
47 int ia32_copy_siginfo_to_user(siginfo_t32 __user *to, siginfo_t *from)
50 if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t32)))
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 err = __put_user(from->si_signo, &to->si_signo);
59 err |= __put_user(from->si_errno, &to->si_errno);
60 err |= __put_user((short)from->si_code, &to->si_code);
62 if (from->si_code < 0) {
63 err |= __put_user(from->si_pid, &to->si_pid);
64 err |= __put_user(from->si_uid, &to->si_uid);
65 err |= __put_user((u32)(u64)from->si_ptr, &to->si_ptr);
67 /* First 32bits of unions are always present:
68 * si_pid === si_band === si_tid === si_addr(LS half) */
69 err |= __put_user(from->_sifields._pad[0], &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);
79 err |= __put_user(from->si_uid, &to->si_uid);
82 err |= __put_user(from->si_fd, &to->si_fd);
84 case __SI_TIMER >> 16:
85 err |= __put_user(from->si_overrun, &to->si_overrun);
86 err |= __put_user((u32)(u64)from->si_ptr, &to->si_ptr);
88 case __SI_RT >> 16: /* This is not generated by the kernel as of now. */
89 case __SI_MESGQ >> 16:
90 err |= __put_user(from->si_uid, &to->si_uid);
91 err |= __put_user(from->si_int, &to->si_int);
98 int ia32_copy_siginfo_from_user(siginfo_t *to, siginfo_t32 __user *from)
101 if (!access_ok (VERIFY_READ, from, sizeof(siginfo_t32)))
104 err = __get_user(to->si_signo, &from->si_signo);
105 err |= __get_user(to->si_errno, &from->si_errno);
106 err |= __get_user(to->si_code, &from->si_code);
108 err |= __get_user(to->si_pid, &from->si_pid);
109 err |= __get_user(to->si_uid, &from->si_uid);
110 err |= __get_user((u32)(u64)to->si_ptr, &from->si_ptr);
116 sys32_sigsuspend(int history0, int history1, old_sigset_t mask, struct pt_regs regs)
121 spin_lock_irq(¤t->sighand->siglock);
122 saveset = current->blocked;
123 siginitset(¤t->blocked, mask);
125 spin_unlock_irq(¤t->sighand->siglock);
129 current->state = TASK_INTERRUPTIBLE;
131 if (do_signal(®s, &saveset))
137 sys32_sigaltstack(const stack_ia32_t *uss_ptr, stack_ia32_t *uoss_ptr,
145 memset(&uss,0,sizeof(stack_t));
146 if (!access_ok(VERIFY_READ,uss_ptr,sizeof(stack_ia32_t)) ||
147 __get_user(ptr, &uss_ptr->ss_sp) ||
148 __get_user(uss.ss_flags, &uss_ptr->ss_flags) ||
149 __get_user(uss.ss_size, &uss_ptr->ss_size))
151 uss.ss_sp = (void *)(u64)ptr;
155 ret = do_sigaltstack(uss_ptr ? &uss : NULL, &uoss, regs.rsp);
157 if (ret >= 0 && uoss_ptr) {
158 if (!access_ok(VERIFY_WRITE,uoss_ptr,sizeof(stack_ia32_t)) ||
159 __put_user((u32)(u64)uoss.ss_sp, &uoss_ptr->ss_sp) ||
160 __put_user(uoss.ss_flags, &uoss_ptr->ss_flags) ||
161 __put_user(uoss.ss_size, &uoss_ptr->ss_size))
168 * Do a signal return; undo the signal stack.
175 struct sigcontext_ia32 sc;
176 struct _fpstate_ia32 fpstate;
177 unsigned int extramask[_COMPAT_NSIG_WORDS-1];
187 struct siginfo32 info;
188 struct ucontext_ia32 uc;
189 struct _fpstate_ia32 fpstate;
194 ia32_restore_sigcontext(struct pt_regs *regs, struct sigcontext_ia32 *sc, unsigned int *peax)
196 unsigned int err = 0;
198 /* Always make any pending restarted system calls return -EINTR */
199 current_thread_info()->restart_block.fn = do_no_restart_syscall;
202 printk("SIG restore_sigcontext: sc=%p err(%x) eip(%x) cs(%x) flg(%x)\n",
203 sc, sc->err, sc->eip, sc->cs, sc->eflags);
207 err |= __get_user(reg, &sc->e ##x); \
208 regs->r ## x = reg; \
211 #define RELOAD_SEG(seg,mask) \
212 { unsigned int cur; \
213 unsigned short pre; \
214 err |= __get_user(pre, &sc->seg); \
215 asm volatile("movl %%" #seg ",%0" : "=r" (cur)); \
217 if (pre != cur) loadsegment(seg,pre); }
219 /* Reload fs and gs if they have changed in the signal handler.
220 This does not handle long fs/gs base changes in the handler, but
221 does not clobber them at least in the normal case. */
225 err |= __get_user(gs, &sc->gs);
227 asm("movl %%gs,%0" : "=r" (oldgs));
235 COPY(di); COPY(si); COPY(bp); COPY(sp); COPY(bx);
236 COPY(dx); COPY(cx); COPY(ip);
237 /* Don't touch extended registers */
239 err |= __get_user(regs->cs, &sc->cs);
241 err |= __get_user(regs->ss, &sc->ss);
245 unsigned int tmpflags;
246 err |= __get_user(tmpflags, &sc->eflags);
247 regs->eflags = (regs->eflags & ~0x40DD5) | (tmpflags & 0x40DD5);
248 regs->orig_rax = -1; /* disable syscall checks */
253 struct _fpstate_ia32 * buf;
254 err |= __get_user(tmp, &sc->fpstate);
255 buf = (struct _fpstate_ia32 *) (u64)tmp;
257 if (verify_area(VERIFY_READ, buf, sizeof(*buf)))
259 err |= restore_i387_ia32(current, buf, 0);
265 err |= __get_user(tmp, &sc->eax);
274 asmlinkage long sys32_sigreturn(struct pt_regs regs)
276 struct sigframe *frame = (struct sigframe *)(regs.rsp - 8);
280 if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
282 if (__get_user(set.sig[0], &frame->sc.oldmask)
283 || (_COMPAT_NSIG_WORDS > 1
284 && __copy_from_user((((char *) &set.sig) + 4), &frame->extramask,
285 sizeof(frame->extramask))))
288 sigdelsetmask(&set, ~_BLOCKABLE);
289 spin_lock_irq(¤t->sighand->siglock);
290 current->blocked = set;
292 spin_unlock_irq(¤t->sighand->siglock);
294 if (ia32_restore_sigcontext(®s, &frame->sc, &eax))
299 signal_fault(®s, frame, "32bit sigreturn");
303 asmlinkage long sys32_rt_sigreturn(struct pt_regs regs)
305 struct rt_sigframe *frame = (struct rt_sigframe *)(regs.rsp - 4);
310 if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
312 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
315 sigdelsetmask(&set, ~_BLOCKABLE);
316 spin_lock_irq(¤t->sighand->siglock);
317 current->blocked = set;
319 spin_unlock_irq(¤t->sighand->siglock);
321 if (ia32_restore_sigcontext(®s, &frame->uc.uc_mcontext, &eax))
324 if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st)))
326 /* It is more difficult to avoid calling this function than to
327 call it and ignore errors. */
329 mm_segment_t oldds = get_fs();
331 do_sigaltstack(&st, NULL, regs.rsp);
338 signal_fault(®s,frame,"32bit rt sigreturn");
343 * Set up a signal frame.
347 ia32_setup_sigcontext(struct sigcontext_ia32 *sc, struct _fpstate_ia32 *fpstate,
348 struct pt_regs *regs, unsigned int mask)
353 __asm__("movl %%gs,%0" : "=r"(tmp): "0"(tmp));
354 err |= __put_user(tmp, (unsigned int *)&sc->gs);
355 __asm__("movl %%fs,%0" : "=r"(tmp): "0"(tmp));
356 err |= __put_user(tmp, (unsigned int *)&sc->fs);
357 __asm__("movl %%ds,%0" : "=r"(tmp): "0"(tmp));
358 err |= __put_user(tmp, (unsigned int *)&sc->ds);
359 __asm__("movl %%es,%0" : "=r"(tmp): "0"(tmp));
360 err |= __put_user(tmp, (unsigned int *)&sc->es);
362 err |= __put_user((u32)regs->rdi, &sc->edi);
363 err |= __put_user((u32)regs->rsi, &sc->esi);
364 err |= __put_user((u32)regs->rbp, &sc->ebp);
365 err |= __put_user((u32)regs->rsp, &sc->esp);
366 err |= __put_user((u32)regs->rbx, &sc->ebx);
367 err |= __put_user((u32)regs->rdx, &sc->edx);
368 err |= __put_user((u32)regs->rcx, &sc->ecx);
369 err |= __put_user((u32)regs->rax, &sc->eax);
370 err |= __put_user((u32)regs->cs, &sc->cs);
371 err |= __put_user((u32)regs->ss, &sc->ss);
372 err |= __put_user(current->thread.trap_no, &sc->trapno);
373 err |= __put_user(current->thread.error_code, &sc->err);
374 err |= __put_user((u32)regs->rip, &sc->eip);
375 err |= __put_user((u32)regs->eflags, &sc->eflags);
376 err |= __put_user((u32)regs->rsp, &sc->esp_at_signal);
378 tmp = save_i387_ia32(current, fpstate, regs, 0);
382 current->used_math = 0;
384 err |= __put_user((u32)(u64)(tmp ? fpstate : NULL), &sc->fpstate);
387 /* non-iBCS2 extensions.. */
388 err |= __put_user(mask, &sc->oldmask);
389 err |= __put_user(current->thread.cr2, &sc->cr2);
395 * Determine which stack to use..
398 get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
402 /* Default to using normal stack */
405 /* This is the X/Open sanctioned signal stack switching. */
406 if (ka->sa.sa_flags & SA_ONSTACK) {
407 if (sas_ss_flags(rsp) == 0)
408 rsp = current->sas_ss_sp + current->sas_ss_size;
411 /* This is the legacy signal stack switching. */
412 else if ((regs->ss & 0xffff) != __USER_DS &&
413 !(ka->sa.sa_flags & SA_RESTORER) &&
414 ka->sa.sa_restorer) {
415 rsp = (unsigned long) ka->sa.sa_restorer;
418 return (void *)((rsp - frame_size) & -8UL);
421 void ia32_setup_frame(int sig, struct k_sigaction *ka,
422 compat_sigset_t *set, struct pt_regs * regs)
424 struct sigframe *frame;
427 frame = get_sigframe(ka, regs, sizeof(*frame));
429 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
433 struct exec_domain *ed = current_thread_info()->exec_domain;
434 err |= __put_user((ed
437 ? ed->signal_invmap[sig]
444 err |= ia32_setup_sigcontext(&frame->sc, &frame->fpstate, regs, set->sig[0]);
448 if (_COMPAT_NSIG_WORDS > 1) {
449 err |= __copy_to_user(frame->extramask, &set->sig[1],
450 sizeof(frame->extramask));
455 /* Return stub is in 32bit vsyscall page */
457 void *restorer = VSYSCALL32_SIGRETURN;
458 if (ka->sa.sa_flags & SA_RESTORER)
459 restorer = ka->sa.sa_restorer;
460 err |= __put_user(ptr_to_u32(restorer), &frame->pretcode);
462 /* These are actually not used anymore, but left because some
463 gdb versions depend on them as a marker. */
465 /* copy_to_user optimizes that into a single 8 byte store */
466 static const struct {
471 } __attribute__((packed)) code = {
472 0xb858, /* popl %eax ; movl $...,%eax */
474 0x80cd, /* int $0x80 */
477 err |= __copy_to_user(frame->retcode, &code, 8);
482 /* Set up registers for signal handler */
483 regs->rsp = (unsigned long) frame;
484 regs->rip = (unsigned long) ka->sa.sa_handler;
486 asm volatile("movl %0,%%ds" :: "r" (__USER32_DS));
487 asm volatile("movl %0,%%es" :: "r" (__USER32_DS));
489 regs->cs = __USER32_CS;
490 regs->ss = __USER32_DS;
493 regs->eflags &= ~TF_MASK;
496 printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n",
497 current->comm, current->pid, frame, regs->rip, frame->pretcode);
504 ka->sa.sa_handler = SIG_DFL;
505 signal_fault(regs,frame,"32bit signal deliver");
508 void ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
509 compat_sigset_t *set, struct pt_regs * regs)
511 struct rt_sigframe *frame;
514 frame = get_sigframe(ka, regs, sizeof(*frame));
516 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
521 struct exec_domain *ed = current_thread_info()->exec_domain;
522 err |= __put_user((ed
525 ? ed->signal_invmap[sig]
529 err |= __put_user((u32)(u64)&frame->info, &frame->pinfo);
530 err |= __put_user((u32)(u64)&frame->uc, &frame->puc);
531 err |= ia32_copy_siginfo_to_user(&frame->info, info);
535 /* Create the ucontext. */
536 err |= __put_user(0, &frame->uc.uc_flags);
537 err |= __put_user(0, &frame->uc.uc_link);
538 err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
539 err |= __put_user(sas_ss_flags(regs->rsp),
540 &frame->uc.uc_stack.ss_flags);
541 err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
542 err |= ia32_setup_sigcontext(&frame->uc.uc_mcontext, &frame->fpstate,
544 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
550 void *restorer = VSYSCALL32_RTSIGRETURN;
551 if (ka->sa.sa_flags & SA_RESTORER)
552 restorer = ka->sa.sa_restorer;
553 err |= __put_user(ptr_to_u32(restorer), &frame->pretcode);
556 /* This is movl $,%eax ; int $0x80 */
557 /* Not actually used anymore, but left because some gdb versions
560 /* __copy_to_user optimizes that into a single 8 byte store */
561 static const struct {
567 } __attribute__((packed)) code = {
569 __NR_ia32_rt_sigreturn,
573 err |= __copy_to_user(frame->retcode, &code, 8);
578 /* Set up registers for signal handler */
579 regs->rsp = (unsigned long) frame;
580 regs->rip = (unsigned long) ka->sa.sa_handler;
582 asm volatile("movl %0,%%ds" :: "r" (__USER32_DS));
583 asm volatile("movl %0,%%es" :: "r" (__USER32_DS));
585 regs->cs = __USER32_CS;
586 regs->ss = __USER32_DS;
589 regs->eflags &= ~TF_MASK;
592 printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n",
593 current->comm, current->pid, frame, regs->rip, frame->pretcode);
600 ka->sa.sa_handler = SIG_DFL;
601 signal_fault(regs, frame, "32bit rt signal setup");