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 */
201 err |= __get_user(regs->x, &sc->x); \
204 #define RELOAD_SEG(seg,mask) \
205 { unsigned int cur; \
206 unsigned short pre; \
207 err |= __get_user(pre, &sc->seg); \
208 savesegment(seg, cur); \
210 if (pre != cur) loadsegment(seg, pre); }
212 static int ia32_restore_sigcontext(struct pt_regs
*regs
,
213 struct sigcontext_ia32 __user
*sc
,
216 unsigned int tmpflags
, gs
, oldgs
, err
= 0;
220 /* Always make any pending restarted system calls return -EINTR */
221 current_thread_info()->restart_block
.fn
= do_no_restart_syscall
;
224 printk(KERN_DEBUG
"SIG restore_sigcontext: "
225 "sc=%p err(%x) eip(%x) cs(%x) flg(%x)\n",
226 sc
, sc
->err
, sc
->ip
, sc
->cs
, sc
->flags
);
230 * Reload fs and gs if they have changed in the signal
231 * handler. This does not handle long fs/gs base changes in
232 * the handler, but does not clobber them at least in the
235 err
|= __get_user(gs
, &sc
->gs
);
237 savesegment(gs
, oldgs
);
245 COPY(di
); COPY(si
); COPY(bp
); COPY(sp
); COPY(bx
);
246 COPY(dx
); COPY(cx
); COPY(ip
);
247 /* Don't touch extended registers */
249 err
|= __get_user(regs
->cs
, &sc
->cs
);
251 err
|= __get_user(regs
->ss
, &sc
->ss
);
254 err
|= __get_user(tmpflags
, &sc
->flags
);
255 regs
->flags
= (regs
->flags
& ~FIX_EFLAGS
) | (tmpflags
& FIX_EFLAGS
);
256 /* disable syscall checks */
259 err
|= __get_user(tmp
, &sc
->fpstate
);
260 buf
= compat_ptr(tmp
);
261 err
|= restore_i387_xstate_ia32(buf
);
263 err
|= __get_user(tmp
, &sc
->ax
);
269 asmlinkage
long sys32_sigreturn(struct pt_regs
*regs
)
271 struct sigframe __user
*frame
= (struct sigframe __user
*)(regs
->sp
-8);
275 if (!access_ok(VERIFY_READ
, frame
, sizeof(*frame
)))
277 if (__get_user(set
.sig
[0], &frame
->sc
.oldmask
)
278 || (_COMPAT_NSIG_WORDS
> 1
279 && __copy_from_user((((char *) &set
.sig
) + 4),
281 sizeof(frame
->extramask
))))
284 sigdelsetmask(&set
, ~_BLOCKABLE
);
285 spin_lock_irq(¤t
->sighand
->siglock
);
286 current
->blocked
= set
;
288 spin_unlock_irq(¤t
->sighand
->siglock
);
290 if (ia32_restore_sigcontext(regs
, &frame
->sc
, &ax
))
295 signal_fault(regs
, frame
, "32bit sigreturn");
299 asmlinkage
long sys32_rt_sigreturn(struct pt_regs
*regs
)
301 struct rt_sigframe __user
*frame
;
304 struct pt_regs tregs
;
306 frame
= (struct rt_sigframe __user
*)(regs
->sp
- 4);
308 if (!access_ok(VERIFY_READ
, frame
, sizeof(*frame
)))
310 if (__copy_from_user(&set
, &frame
->uc
.uc_sigmask
, sizeof(set
)))
313 sigdelsetmask(&set
, ~_BLOCKABLE
);
314 spin_lock_irq(¤t
->sighand
->siglock
);
315 current
->blocked
= set
;
317 spin_unlock_irq(¤t
->sighand
->siglock
);
319 if (ia32_restore_sigcontext(regs
, &frame
->uc
.uc_mcontext
, &ax
))
323 if (sys32_sigaltstack(&frame
->uc
.uc_stack
, NULL
, &tregs
) == -EFAULT
)
329 signal_fault(regs
, frame
, "32bit rt sigreturn");
334 * Set up a signal frame.
337 static int ia32_setup_sigcontext(struct sigcontext_ia32 __user
*sc
,
338 void __user
*fpstate
,
339 struct pt_regs
*regs
, unsigned int mask
)
343 savesegment(gs
, tmp
);
344 err
|= __put_user(tmp
, (unsigned int __user
*)&sc
->gs
);
345 savesegment(fs
, tmp
);
346 err
|= __put_user(tmp
, (unsigned int __user
*)&sc
->fs
);
347 savesegment(ds
, tmp
);
348 err
|= __put_user(tmp
, (unsigned int __user
*)&sc
->ds
);
349 savesegment(es
, tmp
);
350 err
|= __put_user(tmp
, (unsigned int __user
*)&sc
->es
);
352 err
|= __put_user(regs
->di
, &sc
->di
);
353 err
|= __put_user(regs
->si
, &sc
->si
);
354 err
|= __put_user(regs
->bp
, &sc
->bp
);
355 err
|= __put_user(regs
->sp
, &sc
->sp
);
356 err
|= __put_user(regs
->bx
, &sc
->bx
);
357 err
|= __put_user(regs
->dx
, &sc
->dx
);
358 err
|= __put_user(regs
->cx
, &sc
->cx
);
359 err
|= __put_user(regs
->ax
, &sc
->ax
);
360 err
|= __put_user(regs
->cs
, &sc
->cs
);
361 err
|= __put_user(regs
->ss
, &sc
->ss
);
362 err
|= __put_user(current
->thread
.trap_no
, &sc
->trapno
);
363 err
|= __put_user(current
->thread
.error_code
, &sc
->err
);
364 err
|= __put_user(regs
->ip
, &sc
->ip
);
365 err
|= __put_user(regs
->flags
, &sc
->flags
);
366 err
|= __put_user(regs
->sp
, &sc
->sp_at_signal
);
368 err
|= __put_user(ptr_to_compat(fpstate
), &sc
->fpstate
);
370 /* non-iBCS2 extensions.. */
371 err
|= __put_user(mask
, &sc
->oldmask
);
372 err
|= __put_user(current
->thread
.cr2
, &sc
->cr2
);
378 * Determine which stack to use..
380 static void __user
*get_sigframe(struct k_sigaction
*ka
, struct pt_regs
*regs
,
386 /* Default to using normal stack */
389 /* This is the X/Open sanctioned signal stack switching. */
390 if (ka
->sa
.sa_flags
& SA_ONSTACK
) {
391 if (sas_ss_flags(sp
) == 0)
392 sp
= current
->sas_ss_sp
+ current
->sas_ss_size
;
395 /* This is the legacy signal stack switching. */
396 else if ((regs
->ss
& 0xffff) != __USER_DS
&&
397 !(ka
->sa
.sa_flags
& SA_RESTORER
) &&
399 sp
= (unsigned long) ka
->sa
.sa_restorer
;
402 sp
= sp
- sig_xstate_ia32_size
;
403 *fpstate
= (struct _fpstate_ia32
*) sp
;
404 if (save_i387_xstate_ia32(*fpstate
) < 0)
405 return (void __user
*) -1L;
409 /* Align the stack pointer according to the i386 ABI,
410 * i.e. so that on function entry ((sp + 4) & 15) == 0. */
411 sp
= ((sp
+ 4) & -16ul) - 4;
412 return (void __user
*) sp
;
415 int ia32_setup_frame(int sig
, struct k_sigaction
*ka
,
416 compat_sigset_t
*set
, struct pt_regs
*regs
)
418 struct sigframe __user
*frame
;
419 void __user
*restorer
;
421 void __user
*fpstate
= NULL
;
423 /* copy_to_user optimizes that into a single 8 byte store */
424 static const struct {
428 } __attribute__((packed
)) code
= {
429 0xb858, /* popl %eax ; movl $...,%eax */
431 0x80cd, /* int $0x80 */
434 frame
= get_sigframe(ka
, regs
, sizeof(*frame
), &fpstate
);
436 if (!access_ok(VERIFY_WRITE
, frame
, sizeof(*frame
)))
439 if (__put_user(sig
, &frame
->sig
))
442 if (ia32_setup_sigcontext(&frame
->sc
, fpstate
, regs
, set
->sig
[0]))
445 if (_COMPAT_NSIG_WORDS
> 1) {
446 if (__copy_to_user(frame
->extramask
, &set
->sig
[1],
447 sizeof(frame
->extramask
)))
451 if (ka
->sa
.sa_flags
& SA_RESTORER
) {
452 restorer
= ka
->sa
.sa_restorer
;
454 /* Return stub is in 32bit vsyscall page */
455 if (current
->mm
->context
.vdso
)
456 restorer
= VDSO32_SYMBOL(current
->mm
->context
.vdso
,
459 restorer
= &frame
->retcode
;
461 err
|= __put_user(ptr_to_compat(restorer
), &frame
->pretcode
);
464 * These are actually not used anymore, but left because some
465 * gdb versions depend on them as a marker.
467 err
|= __copy_to_user(frame
->retcode
, &code
, 8);
471 /* Set up registers for signal handler */
472 regs
->sp
= (unsigned long) frame
;
473 regs
->ip
= (unsigned long) ka
->sa
.sa_handler
;
475 /* Make -mregparm=3 work */
480 loadsegment(ds
, __USER32_DS
);
481 loadsegment(es
, __USER32_DS
);
483 regs
->cs
= __USER32_CS
;
484 regs
->ss
= __USER32_DS
;
487 printk(KERN_DEBUG
"SIG deliver (%s:%d): sp=%p pc=%lx ra=%u\n",
488 current
->comm
, current
->pid
, frame
, regs
->ip
, frame
->pretcode
);
494 int ia32_setup_rt_frame(int sig
, struct k_sigaction
*ka
, siginfo_t
*info
,
495 compat_sigset_t
*set
, struct pt_regs
*regs
)
497 struct rt_sigframe __user
*frame
;
498 void __user
*restorer
;
500 void __user
*fpstate
= NULL
;
502 /* __copy_to_user optimizes that into a single 8 byte store */
503 static const struct {
508 } __attribute__((packed
)) code
= {
510 __NR_ia32_rt_sigreturn
,
515 frame
= get_sigframe(ka
, regs
, sizeof(*frame
), &fpstate
);
517 if (!access_ok(VERIFY_WRITE
, frame
, sizeof(*frame
)))
520 err
|= __put_user(sig
, &frame
->sig
);
521 err
|= __put_user(ptr_to_compat(&frame
->info
), &frame
->pinfo
);
522 err
|= __put_user(ptr_to_compat(&frame
->uc
), &frame
->puc
);
523 err
|= copy_siginfo_to_user32(&frame
->info
, info
);
527 /* Create the ucontext. */
529 err
|= __put_user(UC_FP_XSTATE
, &frame
->uc
.uc_flags
);
531 err
|= __put_user(0, &frame
->uc
.uc_flags
);
532 err
|= __put_user(0, &frame
->uc
.uc_link
);
533 err
|= __put_user(current
->sas_ss_sp
, &frame
->uc
.uc_stack
.ss_sp
);
534 err
|= __put_user(sas_ss_flags(regs
->sp
),
535 &frame
->uc
.uc_stack
.ss_flags
);
536 err
|= __put_user(current
->sas_ss_size
, &frame
->uc
.uc_stack
.ss_size
);
537 err
|= ia32_setup_sigcontext(&frame
->uc
.uc_mcontext
, fpstate
,
539 err
|= __copy_to_user(&frame
->uc
.uc_sigmask
, set
, sizeof(*set
));
543 if (ka
->sa
.sa_flags
& SA_RESTORER
)
544 restorer
= ka
->sa
.sa_restorer
;
546 restorer
= VDSO32_SYMBOL(current
->mm
->context
.vdso
,
548 err
|= __put_user(ptr_to_compat(restorer
), &frame
->pretcode
);
551 * Not actually used anymore, but left because some gdb
554 err
|= __copy_to_user(frame
->retcode
, &code
, 8);
558 /* Set up registers for signal handler */
559 regs
->sp
= (unsigned long) frame
;
560 regs
->ip
= (unsigned long) ka
->sa
.sa_handler
;
562 /* Make -mregparm=3 work */
564 regs
->dx
= (unsigned long) &frame
->info
;
565 regs
->cx
= (unsigned long) &frame
->uc
;
567 /* Make -mregparm=3 work */
569 regs
->dx
= (unsigned long) &frame
->info
;
570 regs
->cx
= (unsigned long) &frame
->uc
;
572 loadsegment(ds
, __USER32_DS
);
573 loadsegment(es
, __USER32_DS
);
575 regs
->cs
= __USER32_CS
;
576 regs
->ss
= __USER32_DS
;
579 printk(KERN_DEBUG
"SIG deliver (%s:%d): sp=%p pc=%lx ra=%u\n",
580 current
->comm
, current
->pid
, frame
, regs
->ip
, frame
->pretcode
);