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
)
46 if (!access_ok (VERIFY_WRITE
, to
, sizeof(compat_siginfo_t
)))
49 /* If you change siginfo_t structure, please make sure that
50 this code is fixed accordingly.
51 It should never copy any pad contained in the structure
52 to avoid security leaks, but must copy the generic
53 3 ints plus the relevant union member. */
54 err
= __put_user(from
->si_signo
, &to
->si_signo
);
55 err
|= __put_user(from
->si_errno
, &to
->si_errno
);
56 err
|= __put_user((short)from
->si_code
, &to
->si_code
);
58 if (from
->si_code
< 0) {
59 err
|= __put_user(from
->si_pid
, &to
->si_pid
);
60 err
|= __put_user(from
->si_uid
, &to
->si_uid
);
61 err
|= __put_user(ptr_to_compat(from
->si_ptr
), &to
->si_ptr
);
63 /* First 32bits of unions are always present:
64 * si_pid === si_band === si_tid === si_addr(LS half) */
65 err
|= __put_user(from
->_sifields
._pad
[0], &to
->_sifields
._pad
[0]);
66 switch (from
->si_code
>> 16) {
67 case __SI_FAULT
>> 16:
70 err
|= __put_user(from
->si_utime
, &to
->si_utime
);
71 err
|= __put_user(from
->si_stime
, &to
->si_stime
);
72 err
|= __put_user(from
->si_status
, &to
->si_status
);
76 err
|= __put_user(from
->si_uid
, &to
->si_uid
);
79 err
|= __put_user(from
->si_fd
, &to
->si_fd
);
81 case __SI_TIMER
>> 16:
82 err
|= __put_user(from
->si_overrun
, &to
->si_overrun
);
83 err
|= __put_user(ptr_to_compat(from
->si_ptr
),
86 case __SI_RT
>> 16: /* This is not generated by the kernel as of now. */
87 case __SI_MESGQ
>> 16:
88 err
|= __put_user(from
->si_uid
, &to
->si_uid
);
89 err
|= __put_user(from
->si_int
, &to
->si_int
);
96 int copy_siginfo_from_user32(siginfo_t
*to
, compat_siginfo_t __user
*from
)
100 if (!access_ok (VERIFY_READ
, from
, sizeof(compat_siginfo_t
)))
103 err
= __get_user(to
->si_signo
, &from
->si_signo
);
104 err
|= __get_user(to
->si_errno
, &from
->si_errno
);
105 err
|= __get_user(to
->si_code
, &from
->si_code
);
107 err
|= __get_user(to
->si_pid
, &from
->si_pid
);
108 err
|= __get_user(to
->si_uid
, &from
->si_uid
);
109 err
|= __get_user(ptr32
, &from
->si_ptr
);
110 to
->si_ptr
= compat_ptr(ptr32
);
116 sys32_sigsuspend(int history0
, int history1
, old_sigset_t mask
)
119 spin_lock_irq(¤t
->sighand
->siglock
);
120 current
->saved_sigmask
= current
->blocked
;
121 siginitset(¤t
->blocked
, mask
);
123 spin_unlock_irq(¤t
->sighand
->siglock
);
125 current
->state
= TASK_INTERRUPTIBLE
;
127 set_thread_flag(TIF_RESTORE_SIGMASK
);
128 return -ERESTARTNOHAND
;
132 sys32_sigaltstack(const stack_ia32_t __user
*uss_ptr
,
133 stack_ia32_t __user
*uoss_ptr
,
134 struct pt_regs
*regs
)
141 memset(&uss
,0,sizeof(stack_t
));
142 if (!access_ok(VERIFY_READ
,uss_ptr
,sizeof(stack_ia32_t
)) ||
143 __get_user(ptr
, &uss_ptr
->ss_sp
) ||
144 __get_user(uss
.ss_flags
, &uss_ptr
->ss_flags
) ||
145 __get_user(uss
.ss_size
, &uss_ptr
->ss_size
))
147 uss
.ss_sp
= compat_ptr(ptr
);
151 ret
= do_sigaltstack(uss_ptr
? &uss
: NULL
, &uoss
, regs
->rsp
);
153 if (ret
>= 0 && uoss_ptr
) {
154 if (!access_ok(VERIFY_WRITE
,uoss_ptr
,sizeof(stack_ia32_t
)) ||
155 __put_user(ptr_to_compat(uoss
.ss_sp
), &uoss_ptr
->ss_sp
) ||
156 __put_user(uoss
.ss_flags
, &uoss_ptr
->ss_flags
) ||
157 __put_user(uoss
.ss_size
, &uoss_ptr
->ss_size
))
164 * Do a signal return; undo the signal stack.
171 struct sigcontext_ia32 sc
;
172 struct _fpstate_ia32 fpstate
;
173 unsigned int extramask
[_COMPAT_NSIG_WORDS
-1];
183 compat_siginfo_t info
;
184 struct ucontext_ia32 uc
;
185 struct _fpstate_ia32 fpstate
;
190 ia32_restore_sigcontext(struct pt_regs
*regs
, struct sigcontext_ia32 __user
*sc
, unsigned int *peax
)
192 unsigned int err
= 0;
194 /* Always make any pending restarted system calls return -EINTR */
195 current_thread_info()->restart_block
.fn
= do_no_restart_syscall
;
198 printk("SIG restore_sigcontext: sc=%p err(%x) eip(%x) cs(%x) flg(%x)\n",
199 sc
, sc
->err
, sc
->eip
, sc
->cs
, sc
->eflags
);
203 err |= __get_user(reg, &sc->e ##x); \
204 regs->r ## x = reg; \
207 #define RELOAD_SEG(seg,mask) \
208 { unsigned int cur; \
209 unsigned short pre; \
210 err |= __get_user(pre, &sc->seg); \
211 asm volatile("movl %%" #seg ",%0" : "=r" (cur)); \
213 if (pre != cur) loadsegment(seg,pre); }
215 /* Reload fs and gs if they have changed in the signal handler.
216 This does not handle long fs/gs base changes in the handler, but
217 does not clobber them at least in the normal case. */
221 err
|= __get_user(gs
, &sc
->gs
);
223 asm("movl %%gs,%0" : "=r" (oldgs
));
231 COPY(di
); COPY(si
); COPY(bp
); COPY(sp
); COPY(bx
);
232 COPY(dx
); COPY(cx
); COPY(ip
);
233 /* Don't touch extended registers */
235 err
|= __get_user(regs
->cs
, &sc
->cs
);
237 err
|= __get_user(regs
->ss
, &sc
->ss
);
241 unsigned int tmpflags
;
242 err
|= __get_user(tmpflags
, &sc
->eflags
);
243 regs
->eflags
= (regs
->eflags
& ~0x40DD5) | (tmpflags
& 0x40DD5);
244 regs
->orig_rax
= -1; /* disable syscall checks */
249 struct _fpstate_ia32 __user
* buf
;
250 err
|= __get_user(tmp
, &sc
->fpstate
);
251 buf
= compat_ptr(tmp
);
253 if (!access_ok(VERIFY_READ
, buf
, sizeof(*buf
)))
255 err
|= restore_i387_ia32(current
, buf
, 0);
257 struct task_struct
*me
= current
;
267 err
|= __get_user(tmp
, &sc
->eax
);
276 asmlinkage
long sys32_sigreturn(struct pt_regs
*regs
)
278 struct sigframe __user
*frame
= (struct sigframe __user
*)(regs
->rsp
-8);
282 if (!access_ok(VERIFY_READ
, frame
, sizeof(*frame
)))
284 if (__get_user(set
.sig
[0], &frame
->sc
.oldmask
)
285 || (_COMPAT_NSIG_WORDS
> 1
286 && __copy_from_user((((char *) &set
.sig
) + 4), &frame
->extramask
,
287 sizeof(frame
->extramask
))))
290 sigdelsetmask(&set
, ~_BLOCKABLE
);
291 spin_lock_irq(¤t
->sighand
->siglock
);
292 current
->blocked
= set
;
294 spin_unlock_irq(¤t
->sighand
->siglock
);
296 if (ia32_restore_sigcontext(regs
, &frame
->sc
, &eax
))
301 signal_fault(regs
, frame
, "32bit sigreturn");
305 asmlinkage
long sys32_rt_sigreturn(struct pt_regs
*regs
)
307 struct rt_sigframe __user
*frame
;
310 struct pt_regs tregs
;
312 frame
= (struct rt_sigframe __user
*)(regs
->rsp
- 4);
314 if (!access_ok(VERIFY_READ
, frame
, sizeof(*frame
)))
316 if (__copy_from_user(&set
, &frame
->uc
.uc_sigmask
, sizeof(set
)))
319 sigdelsetmask(&set
, ~_BLOCKABLE
);
320 spin_lock_irq(¤t
->sighand
->siglock
);
321 current
->blocked
= set
;
323 spin_unlock_irq(¤t
->sighand
->siglock
);
325 if (ia32_restore_sigcontext(regs
, &frame
->uc
.uc_mcontext
, &eax
))
329 if (sys32_sigaltstack(&frame
->uc
.uc_stack
, NULL
, &tregs
) == -EFAULT
)
335 signal_fault(regs
,frame
,"32bit rt sigreturn");
340 * Set up a signal frame.
344 ia32_setup_sigcontext(struct sigcontext_ia32 __user
*sc
, struct _fpstate_ia32 __user
*fpstate
,
345 struct pt_regs
*regs
, unsigned int mask
)
350 __asm__("movl %%gs,%0" : "=r"(tmp
): "0"(tmp
));
351 err
|= __put_user(tmp
, (unsigned int __user
*)&sc
->gs
);
352 __asm__("movl %%fs,%0" : "=r"(tmp
): "0"(tmp
));
353 err
|= __put_user(tmp
, (unsigned int __user
*)&sc
->fs
);
354 __asm__("movl %%ds,%0" : "=r"(tmp
): "0"(tmp
));
355 err
|= __put_user(tmp
, (unsigned int __user
*)&sc
->ds
);
356 __asm__("movl %%es,%0" : "=r"(tmp
): "0"(tmp
));
357 err
|= __put_user(tmp
, (unsigned int __user
*)&sc
->es
);
359 err
|= __put_user((u32
)regs
->rdi
, &sc
->edi
);
360 err
|= __put_user((u32
)regs
->rsi
, &sc
->esi
);
361 err
|= __put_user((u32
)regs
->rbp
, &sc
->ebp
);
362 err
|= __put_user((u32
)regs
->rsp
, &sc
->esp
);
363 err
|= __put_user((u32
)regs
->rbx
, &sc
->ebx
);
364 err
|= __put_user((u32
)regs
->rdx
, &sc
->edx
);
365 err
|= __put_user((u32
)regs
->rcx
, &sc
->ecx
);
366 err
|= __put_user((u32
)regs
->rax
, &sc
->eax
);
367 err
|= __put_user((u32
)regs
->cs
, &sc
->cs
);
368 err
|= __put_user((u32
)regs
->ss
, &sc
->ss
);
369 err
|= __put_user(current
->thread
.trap_no
, &sc
->trapno
);
370 err
|= __put_user(current
->thread
.error_code
, &sc
->err
);
371 err
|= __put_user((u32
)regs
->rip
, &sc
->eip
);
372 err
|= __put_user((u32
)regs
->eflags
, &sc
->eflags
);
373 err
|= __put_user((u32
)regs
->rsp
, &sc
->esp_at_signal
);
375 tmp
= save_i387_ia32(current
, fpstate
, regs
, 0);
381 err
|= __put_user(ptr_to_compat(tmp
? fpstate
: NULL
),
385 /* non-iBCS2 extensions.. */
386 err
|= __put_user(mask
, &sc
->oldmask
);
387 err
|= __put_user(current
->thread
.cr2
, &sc
->cr2
);
393 * Determine which stack to use..
396 get_sigframe(struct k_sigaction
*ka
, struct pt_regs
* regs
, size_t frame_size
)
400 /* Default to using normal stack */
403 /* This is the X/Open sanctioned signal stack switching. */
404 if (ka
->sa
.sa_flags
& SA_ONSTACK
) {
405 if (sas_ss_flags(rsp
) == 0)
406 rsp
= current
->sas_ss_sp
+ current
->sas_ss_size
;
409 /* This is the legacy signal stack switching. */
410 else if ((regs
->ss
& 0xffff) != __USER_DS
&&
411 !(ka
->sa
.sa_flags
& SA_RESTORER
) &&
412 ka
->sa
.sa_restorer
) {
413 rsp
= (unsigned long) ka
->sa
.sa_restorer
;
417 /* Align the stack pointer according to the i386 ABI,
418 * i.e. so that on function entry ((sp + 4) & 15) == 0. */
419 rsp
= ((rsp
+ 4) & -16ul) - 4;
420 return (void __user
*) rsp
;
423 int ia32_setup_frame(int sig
, struct k_sigaction
*ka
,
424 compat_sigset_t
*set
, struct pt_regs
* regs
)
426 struct sigframe __user
*frame
;
429 frame
= get_sigframe(ka
, regs
, sizeof(*frame
));
431 if (!access_ok(VERIFY_WRITE
, frame
, sizeof(*frame
)))
434 err
|= __put_user(sig
, &frame
->sig
);
438 err
|= ia32_setup_sigcontext(&frame
->sc
, &frame
->fpstate
, regs
,
443 if (_COMPAT_NSIG_WORDS
> 1) {
444 err
|= __copy_to_user(frame
->extramask
, &set
->sig
[1],
445 sizeof(frame
->extramask
));
450 /* Return stub is in 32bit vsyscall page */
452 void __user
*restorer
;
453 if (current
->binfmt
->hasvdso
)
454 restorer
= VSYSCALL32_SIGRETURN
;
456 restorer
= (void *)&frame
->retcode
;
457 if (ka
->sa
.sa_flags
& SA_RESTORER
)
458 restorer
= ka
->sa
.sa_restorer
;
459 err
|= __put_user(ptr_to_compat(restorer
), &frame
->pretcode
);
461 /* These are actually not used anymore, but left because some
462 gdb versions depend on them as a marker. */
464 /* copy_to_user optimizes that into a single 8 byte store */
465 static const struct {
470 } __attribute__((packed
)) code
= {
471 0xb858, /* popl %eax ; movl $...,%eax */
473 0x80cd, /* int $0x80 */
476 err
|= __copy_to_user(frame
->retcode
, &code
, 8);
481 /* Set up registers for signal handler */
482 regs
->rsp
= (unsigned long) frame
;
483 regs
->rip
= (unsigned long) ka
->sa
.sa_handler
;
485 /* Make -mregparm=3 work */
490 asm volatile("movl %0,%%ds" :: "r" (__USER32_DS
));
491 asm volatile("movl %0,%%es" :: "r" (__USER32_DS
));
493 regs
->cs
= __USER32_CS
;
494 regs
->ss
= __USER32_DS
;
497 regs
->eflags
&= ~TF_MASK
;
498 if (test_thread_flag(TIF_SINGLESTEP
))
499 ptrace_notify(SIGTRAP
);
502 printk("SIG deliver (%s:%d): sp=%p pc=%lx ra=%u\n",
503 current
->comm
, current
->pid
, frame
, regs
->rip
, frame
->pretcode
);
509 force_sigsegv(sig
, current
);
513 int ia32_setup_rt_frame(int sig
, struct k_sigaction
*ka
, siginfo_t
*info
,
514 compat_sigset_t
*set
, struct pt_regs
* regs
)
516 struct rt_sigframe __user
*frame
;
519 frame
= get_sigframe(ka
, regs
, sizeof(*frame
));
521 if (!access_ok(VERIFY_WRITE
, frame
, sizeof(*frame
)))
525 struct exec_domain
*ed
= current_thread_info()->exec_domain
;
526 err
|= __put_user((ed
529 ? ed
->signal_invmap
[sig
]
533 err
|= __put_user(ptr_to_compat(&frame
->info
), &frame
->pinfo
);
534 err
|= __put_user(ptr_to_compat(&frame
->uc
), &frame
->puc
);
535 err
|= copy_siginfo_to_user32(&frame
->info
, info
);
539 /* Create the ucontext. */
540 err
|= __put_user(0, &frame
->uc
.uc_flags
);
541 err
|= __put_user(0, &frame
->uc
.uc_link
);
542 err
|= __put_user(current
->sas_ss_sp
, &frame
->uc
.uc_stack
.ss_sp
);
543 err
|= __put_user(sas_ss_flags(regs
->rsp
),
544 &frame
->uc
.uc_stack
.ss_flags
);
545 err
|= __put_user(current
->sas_ss_size
, &frame
->uc
.uc_stack
.ss_size
);
546 err
|= ia32_setup_sigcontext(&frame
->uc
.uc_mcontext
, &frame
->fpstate
,
548 err
|= __copy_to_user(&frame
->uc
.uc_sigmask
, set
, sizeof(*set
));
554 void __user
*restorer
= VSYSCALL32_RTSIGRETURN
;
555 if (ka
->sa
.sa_flags
& SA_RESTORER
)
556 restorer
= ka
->sa
.sa_restorer
;
557 err
|= __put_user(ptr_to_compat(restorer
), &frame
->pretcode
);
560 /* This is movl $,%eax ; int $0x80 */
561 /* Not actually used anymore, but left because some gdb versions
564 /* __copy_to_user optimizes that into a single 8 byte store */
565 static const struct {
571 } __attribute__((packed
)) code
= {
573 __NR_ia32_rt_sigreturn
,
577 err
|= __copy_to_user(frame
->retcode
, &code
, 8);
582 /* Set up registers for signal handler */
583 regs
->rsp
= (unsigned long) frame
;
584 regs
->rip
= (unsigned long) ka
->sa
.sa_handler
;
586 /* Make -mregparm=3 work */
588 regs
->rdx
= (unsigned long) &frame
->info
;
589 regs
->rcx
= (unsigned long) &frame
->uc
;
591 /* Make -mregparm=3 work */
593 regs
->rdx
= (unsigned long) &frame
->info
;
594 regs
->rcx
= (unsigned long) &frame
->uc
;
596 asm volatile("movl %0,%%ds" :: "r" (__USER32_DS
));
597 asm volatile("movl %0,%%es" :: "r" (__USER32_DS
));
599 regs
->cs
= __USER32_CS
;
600 regs
->ss
= __USER32_DS
;
603 regs
->eflags
&= ~TF_MASK
;
604 if (test_thread_flag(TIF_SINGLESTEP
))
605 ptrace_notify(SIGTRAP
);
608 printk("SIG deliver (%s:%d): sp=%p pc=%lx ra=%u\n",
609 current
->comm
, current
->pid
, frame
, regs
->rip
, frame
->pretcode
);
615 force_sigsegv(sig
, current
);