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_unused
; /* look at kernel/sigframe.h */
183 unsigned int extramask
[_COMPAT_NSIG_WORDS
-1];
185 /* fp state follows here */
194 compat_siginfo_t info
;
195 struct ucontext_ia32 uc
;
197 /* fp state follows here */
202 err |= __get_user(reg, &sc->x); \
206 #define RELOAD_SEG(seg,mask) \
207 { unsigned int cur; \
208 unsigned short pre; \
209 err |= __get_user(pre, &sc->seg); \
210 savesegment(seg, cur); \
212 if (pre != cur) loadsegment(seg, pre); }
214 static int ia32_restore_sigcontext(struct pt_regs
*regs
,
215 struct sigcontext_ia32 __user
*sc
,
218 unsigned int tmpflags
, gs
, oldgs
, err
= 0;
222 /* Always make any pending restarted system calls return -EINTR */
223 current_thread_info()->restart_block
.fn
= do_no_restart_syscall
;
226 printk(KERN_DEBUG
"SIG restore_sigcontext: "
227 "sc=%p err(%x) eip(%x) cs(%x) flg(%x)\n",
228 sc
, sc
->err
, sc
->ip
, sc
->cs
, sc
->flags
);
232 * Reload fs and gs if they have changed in the signal
233 * handler. This does not handle long fs/gs base changes in
234 * the handler, but does not clobber them at least in the
237 err
|= __get_user(gs
, &sc
->gs
);
239 savesegment(gs
, oldgs
);
247 COPY(di
); COPY(si
); COPY(bp
); COPY(sp
); COPY(bx
);
248 COPY(dx
); COPY(cx
); COPY(ip
);
249 /* Don't touch extended registers */
251 err
|= __get_user(regs
->cs
, &sc
->cs
);
253 err
|= __get_user(regs
->ss
, &sc
->ss
);
256 err
|= __get_user(tmpflags
, &sc
->flags
);
257 regs
->flags
= (regs
->flags
& ~FIX_EFLAGS
) | (tmpflags
& FIX_EFLAGS
);
258 /* disable syscall checks */
261 err
|= __get_user(tmp
, &sc
->fpstate
);
262 buf
= compat_ptr(tmp
);
263 err
|= restore_i387_xstate_ia32(buf
);
265 err
|= __get_user(tmp
, &sc
->ax
);
271 asmlinkage
long sys32_sigreturn(struct pt_regs
*regs
)
273 struct sigframe __user
*frame
= (struct sigframe __user
*)(regs
->sp
-8);
277 if (!access_ok(VERIFY_READ
, frame
, sizeof(*frame
)))
279 if (__get_user(set
.sig
[0], &frame
->sc
.oldmask
)
280 || (_COMPAT_NSIG_WORDS
> 1
281 && __copy_from_user((((char *) &set
.sig
) + 4),
283 sizeof(frame
->extramask
))))
286 sigdelsetmask(&set
, ~_BLOCKABLE
);
287 spin_lock_irq(¤t
->sighand
->siglock
);
288 current
->blocked
= set
;
290 spin_unlock_irq(¤t
->sighand
->siglock
);
292 if (ia32_restore_sigcontext(regs
, &frame
->sc
, &ax
))
297 signal_fault(regs
, frame
, "32bit sigreturn");
301 asmlinkage
long sys32_rt_sigreturn(struct pt_regs
*regs
)
303 struct rt_sigframe __user
*frame
;
306 struct pt_regs tregs
;
308 frame
= (struct rt_sigframe __user
*)(regs
->sp
- 4);
310 if (!access_ok(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(regs
, &frame
->uc
.uc_mcontext
, &ax
))
325 if (sys32_sigaltstack(&frame
->uc
.uc_stack
, NULL
, &tregs
) == -EFAULT
)
331 signal_fault(regs
, frame
, "32bit rt sigreturn");
336 * Set up a signal frame.
339 static int ia32_setup_sigcontext(struct sigcontext_ia32 __user
*sc
,
340 void __user
*fpstate
,
341 struct pt_regs
*regs
, unsigned int mask
)
345 savesegment(gs
, tmp
);
346 err
|= __put_user(tmp
, (unsigned int __user
*)&sc
->gs
);
347 savesegment(fs
, tmp
);
348 err
|= __put_user(tmp
, (unsigned int __user
*)&sc
->fs
);
349 savesegment(ds
, tmp
);
350 err
|= __put_user(tmp
, (unsigned int __user
*)&sc
->ds
);
351 savesegment(es
, tmp
);
352 err
|= __put_user(tmp
, (unsigned int __user
*)&sc
->es
);
354 err
|= __put_user((u32
)regs
->di
, &sc
->di
);
355 err
|= __put_user((u32
)regs
->si
, &sc
->si
);
356 err
|= __put_user((u32
)regs
->bp
, &sc
->bp
);
357 err
|= __put_user((u32
)regs
->sp
, &sc
->sp
);
358 err
|= __put_user((u32
)regs
->bx
, &sc
->bx
);
359 err
|= __put_user((u32
)regs
->dx
, &sc
->dx
);
360 err
|= __put_user((u32
)regs
->cx
, &sc
->cx
);
361 err
|= __put_user((u32
)regs
->ax
, &sc
->ax
);
362 err
|= __put_user((u32
)regs
->cs
, &sc
->cs
);
363 err
|= __put_user((u32
)regs
->ss
, &sc
->ss
);
364 err
|= __put_user(current
->thread
.trap_no
, &sc
->trapno
);
365 err
|= __put_user(current
->thread
.error_code
, &sc
->err
);
366 err
|= __put_user((u32
)regs
->ip
, &sc
->ip
);
367 err
|= __put_user((u32
)regs
->flags
, &sc
->flags
);
368 err
|= __put_user((u32
)regs
->sp
, &sc
->sp_at_signal
);
370 tmp
= save_i387_xstate_ia32(fpstate
);
376 err
|= __put_user(ptr_to_compat(tmp
? fpstate
: NULL
),
380 /* non-iBCS2 extensions.. */
381 err
|= __put_user(mask
, &sc
->oldmask
);
382 err
|= __put_user(current
->thread
.cr2
, &sc
->cr2
);
388 * Determine which stack to use..
390 static void __user
*get_sigframe(struct k_sigaction
*ka
, struct pt_regs
*regs
,
396 /* Default to using normal stack */
399 /* This is the X/Open sanctioned signal stack switching. */
400 if (ka
->sa
.sa_flags
& SA_ONSTACK
) {
401 if (sas_ss_flags(sp
) == 0)
402 sp
= current
->sas_ss_sp
+ current
->sas_ss_size
;
405 /* This is the legacy signal stack switching. */
406 else if ((regs
->ss
& 0xffff) != __USER_DS
&&
407 !(ka
->sa
.sa_flags
& SA_RESTORER
) &&
409 sp
= (unsigned long) ka
->sa
.sa_restorer
;
412 sp
= sp
- sig_xstate_ia32_size
;
413 *fpstate
= (struct _fpstate_ia32
*) sp
;
417 /* Align the stack pointer according to the i386 ABI,
418 * i.e. so that on function entry ((sp + 4) & 15) == 0. */
419 sp
= ((sp
+ 4) & -16ul) - 4;
420 return (void __user
*) sp
;
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
;
427 void __user
*restorer
;
429 void __user
*fpstate
= NULL
;
431 /* copy_to_user optimizes that into a single 8 byte store */
432 static const struct {
437 } __attribute__((packed
)) code
= {
438 0xb858, /* popl %eax ; movl $...,%eax */
440 0x80cd, /* int $0x80 */
444 frame
= get_sigframe(ka
, regs
, sizeof(*frame
), &fpstate
);
446 if (!access_ok(VERIFY_WRITE
, frame
, sizeof(*frame
)))
449 err
|= __put_user(sig
, &frame
->sig
);
453 err
|= ia32_setup_sigcontext(&frame
->sc
, fpstate
, regs
, set
->sig
[0]);
457 if (_COMPAT_NSIG_WORDS
> 1) {
458 err
|= __copy_to_user(frame
->extramask
, &set
->sig
[1],
459 sizeof(frame
->extramask
));
464 if (ka
->sa
.sa_flags
& SA_RESTORER
) {
465 restorer
= ka
->sa
.sa_restorer
;
467 /* Return stub is in 32bit vsyscall page */
468 if (current
->mm
->context
.vdso
)
469 restorer
= VDSO32_SYMBOL(current
->mm
->context
.vdso
,
472 restorer
= &frame
->retcode
;
474 err
|= __put_user(ptr_to_compat(restorer
), &frame
->pretcode
);
477 * These are actually not used anymore, but left because some
478 * gdb versions depend on them as a marker.
480 err
|= __copy_to_user(frame
->retcode
, &code
, 8);
484 /* Set up registers for signal handler */
485 regs
->sp
= (unsigned long) frame
;
486 regs
->ip
= (unsigned long) ka
->sa
.sa_handler
;
488 /* Make -mregparm=3 work */
493 loadsegment(ds
, __USER32_DS
);
494 loadsegment(es
, __USER32_DS
);
496 regs
->cs
= __USER32_CS
;
497 regs
->ss
= __USER32_DS
;
500 printk(KERN_DEBUG
"SIG deliver (%s:%d): sp=%p pc=%lx ra=%u\n",
501 current
->comm
, current
->pid
, frame
, regs
->ip
, frame
->pretcode
);
507 int ia32_setup_rt_frame(int sig
, struct k_sigaction
*ka
, siginfo_t
*info
,
508 compat_sigset_t
*set
, struct pt_regs
*regs
)
510 struct rt_sigframe __user
*frame
;
511 void __user
*restorer
;
513 void __user
*fpstate
= NULL
;
515 /* __copy_to_user optimizes that into a single 8 byte store */
516 static const struct {
522 } __attribute__((packed
)) code
= {
524 __NR_ia32_rt_sigreturn
,
529 frame
= get_sigframe(ka
, regs
, sizeof(*frame
), &fpstate
);
531 if (!access_ok(VERIFY_WRITE
, frame
, sizeof(*frame
)))
534 err
|= __put_user(sig
, &frame
->sig
);
535 err
|= __put_user(ptr_to_compat(&frame
->info
), &frame
->pinfo
);
536 err
|= __put_user(ptr_to_compat(&frame
->uc
), &frame
->puc
);
537 err
|= copy_siginfo_to_user32(&frame
->info
, info
);
541 /* Create the ucontext. */
543 err
|= __put_user(UC_FP_XSTATE
, &frame
->uc
.uc_flags
);
545 err
|= __put_user(0, &frame
->uc
.uc_flags
);
546 err
|= __put_user(0, &frame
->uc
.uc_link
);
547 err
|= __put_user(current
->sas_ss_sp
, &frame
->uc
.uc_stack
.ss_sp
);
548 err
|= __put_user(sas_ss_flags(regs
->sp
),
549 &frame
->uc
.uc_stack
.ss_flags
);
550 err
|= __put_user(current
->sas_ss_size
, &frame
->uc
.uc_stack
.ss_size
);
551 err
|= ia32_setup_sigcontext(&frame
->uc
.uc_mcontext
, fpstate
,
553 err
|= __copy_to_user(&frame
->uc
.uc_sigmask
, set
, sizeof(*set
));
557 if (ka
->sa
.sa_flags
& SA_RESTORER
)
558 restorer
= ka
->sa
.sa_restorer
;
560 restorer
= VDSO32_SYMBOL(current
->mm
->context
.vdso
,
562 err
|= __put_user(ptr_to_compat(restorer
), &frame
->pretcode
);
565 * Not actually used anymore, but left because some gdb
568 err
|= __copy_to_user(frame
->retcode
, &code
, 8);
572 /* Set up registers for signal handler */
573 regs
->sp
= (unsigned long) frame
;
574 regs
->ip
= (unsigned long) ka
->sa
.sa_handler
;
576 /* Make -mregparm=3 work */
578 regs
->dx
= (unsigned long) &frame
->info
;
579 regs
->cx
= (unsigned long) &frame
->uc
;
581 /* Make -mregparm=3 work */
583 regs
->dx
= (unsigned long) &frame
->info
;
584 regs
->cx
= (unsigned long) &frame
->uc
;
586 loadsegment(ds
, __USER32_DS
);
587 loadsegment(es
, __USER32_DS
);
589 regs
->cs
= __USER32_CS
;
590 regs
->ss
= __USER32_DS
;
593 printk(KERN_DEBUG
"SIG deliver (%s:%d): sp=%p pc=%lx ra=%u\n",
594 current
->comm
, current
->pid
, frame
, regs
->ip
, frame
->pretcode
);