]>
git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blob - arch/x86/ia32/ia32_signal.c
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.
191 #define loadsegment_gs(v) load_gs_index(v)
192 #define loadsegment_fs(v) loadsegment(fs, v)
193 #define loadsegment_ds(v) loadsegment(ds, v)
194 #define loadsegment_es(v) loadsegment(es, v)
196 #define get_user_seg(seg) ({ unsigned int v; savesegment(seg, v); v; })
197 #define set_user_seg(seg, v) loadsegment_##seg(v)
200 get_user_ex(regs->x, &sc->x); \
203 #define GET_SEG(seg) ({ \
204 unsigned short tmp; \
205 get_user_ex(tmp, &sc->seg); \
209 #define COPY_SEG_CPL3(seg) do { \
210 regs->seg = GET_SEG(seg) | 3; \
213 #define RELOAD_SEG(seg) { \
214 unsigned int pre = GET_SEG(seg); \
215 unsigned int cur = get_user_seg(seg); \
218 set_user_seg(seg, pre); \
221 static int ia32_restore_sigcontext(struct pt_regs
*regs
,
222 struct sigcontext_ia32 __user
*sc
,
225 unsigned int tmpflags
, err
= 0;
229 /* Always make any pending restarted system calls return -EINTR */
230 current_thread_info()->restart_block
.fn
= do_no_restart_syscall
;
234 * Reload fs and gs if they have changed in the signal
235 * handler. This does not handle long fs/gs base changes in
236 * the handler, but does not clobber them at least in the
244 COPY(di
); COPY(si
); COPY(bp
); COPY(sp
); COPY(bx
);
245 COPY(dx
); COPY(cx
); COPY(ip
);
246 /* Don't touch extended registers */
251 get_user_ex(tmpflags
, &sc
->flags
);
252 regs
->flags
= (regs
->flags
& ~FIX_EFLAGS
) | (tmpflags
& FIX_EFLAGS
);
253 /* disable syscall checks */
256 get_user_ex(tmp
, &sc
->fpstate
);
257 buf
= compat_ptr(tmp
);
258 err
|= restore_i387_xstate_ia32(buf
);
260 get_user_ex(*pax
, &sc
->ax
);
261 } get_user_catch(err
);
266 asmlinkage
long sys32_sigreturn(struct pt_regs
*regs
)
268 struct sigframe_ia32 __user
*frame
= (struct sigframe_ia32 __user
*)(regs
->sp
-8);
272 if (!access_ok(VERIFY_READ
, frame
, sizeof(*frame
)))
274 if (__get_user(set
.sig
[0], &frame
->sc
.oldmask
)
275 || (_COMPAT_NSIG_WORDS
> 1
276 && __copy_from_user((((char *) &set
.sig
) + 4),
278 sizeof(frame
->extramask
))))
281 sigdelsetmask(&set
, ~_BLOCKABLE
);
282 spin_lock_irq(¤t
->sighand
->siglock
);
283 current
->blocked
= set
;
285 spin_unlock_irq(¤t
->sighand
->siglock
);
287 if (ia32_restore_sigcontext(regs
, &frame
->sc
, &ax
))
292 signal_fault(regs
, frame
, "32bit sigreturn");
296 asmlinkage
long sys32_rt_sigreturn(struct pt_regs
*regs
)
298 struct rt_sigframe_ia32 __user
*frame
;
301 struct pt_regs tregs
;
303 frame
= (struct rt_sigframe_ia32 __user
*)(regs
->sp
- 4);
305 if (!access_ok(VERIFY_READ
, frame
, sizeof(*frame
)))
307 if (__copy_from_user(&set
, &frame
->uc
.uc_sigmask
, sizeof(set
)))
310 sigdelsetmask(&set
, ~_BLOCKABLE
);
311 spin_lock_irq(¤t
->sighand
->siglock
);
312 current
->blocked
= set
;
314 spin_unlock_irq(¤t
->sighand
->siglock
);
316 if (ia32_restore_sigcontext(regs
, &frame
->uc
.uc_mcontext
, &ax
))
320 if (sys32_sigaltstack(&frame
->uc
.uc_stack
, NULL
, &tregs
) == -EFAULT
)
326 signal_fault(regs
, frame
, "32bit rt sigreturn");
331 * Set up a signal frame.
334 static int ia32_setup_sigcontext(struct sigcontext_ia32 __user
*sc
,
335 void __user
*fpstate
,
336 struct pt_regs
*regs
, unsigned int mask
)
341 put_user_ex(get_user_seg(gs
), (unsigned int __user
*)&sc
->gs
);
342 put_user_ex(get_user_seg(fs
), (unsigned int __user
*)&sc
->fs
);
343 put_user_ex(get_user_seg(ds
), (unsigned int __user
*)&sc
->ds
);
344 put_user_ex(get_user_seg(es
), (unsigned int __user
*)&sc
->es
);
346 put_user_ex(regs
->di
, &sc
->di
);
347 put_user_ex(regs
->si
, &sc
->si
);
348 put_user_ex(regs
->bp
, &sc
->bp
);
349 put_user_ex(regs
->sp
, &sc
->sp
);
350 put_user_ex(regs
->bx
, &sc
->bx
);
351 put_user_ex(regs
->dx
, &sc
->dx
);
352 put_user_ex(regs
->cx
, &sc
->cx
);
353 put_user_ex(regs
->ax
, &sc
->ax
);
354 put_user_ex(current
->thread
.trap_no
, &sc
->trapno
);
355 put_user_ex(current
->thread
.error_code
, &sc
->err
);
356 put_user_ex(regs
->ip
, &sc
->ip
);
357 put_user_ex(regs
->cs
, (unsigned int __user
*)&sc
->cs
);
358 put_user_ex(regs
->flags
, &sc
->flags
);
359 put_user_ex(regs
->sp
, &sc
->sp_at_signal
);
360 put_user_ex(regs
->ss
, (unsigned int __user
*)&sc
->ss
);
362 put_user_ex(ptr_to_compat(fpstate
), &sc
->fpstate
);
364 /* non-iBCS2 extensions.. */
365 put_user_ex(mask
, &sc
->oldmask
);
366 put_user_ex(current
->thread
.cr2
, &sc
->cr2
);
367 } put_user_catch(err
);
373 * Determine which stack to use..
375 static void __user
*get_sigframe(struct k_sigaction
*ka
, struct pt_regs
*regs
,
381 /* Default to using normal stack */
384 /* This is the X/Open sanctioned signal stack switching. */
385 if (ka
->sa
.sa_flags
& SA_ONSTACK
) {
386 if (sas_ss_flags(sp
) == 0)
387 sp
= current
->sas_ss_sp
+ current
->sas_ss_size
;
390 /* This is the legacy signal stack switching. */
391 else if ((regs
->ss
& 0xffff) != __USER32_DS
&&
392 !(ka
->sa
.sa_flags
& SA_RESTORER
) &&
394 sp
= (unsigned long) ka
->sa
.sa_restorer
;
397 sp
= sp
- sig_xstate_ia32_size
;
398 *fpstate
= (struct _fpstate_ia32
*) sp
;
399 if (save_i387_xstate_ia32(*fpstate
) < 0)
400 return (void __user
*) -1L;
404 /* Align the stack pointer according to the i386 ABI,
405 * i.e. so that on function entry ((sp + 4) & 15) == 0. */
406 sp
= ((sp
+ 4) & -16ul) - 4;
407 return (void __user
*) sp
;
410 int ia32_setup_frame(int sig
, struct k_sigaction
*ka
,
411 compat_sigset_t
*set
, struct pt_regs
*regs
)
413 struct sigframe_ia32 __user
*frame
;
414 void __user
*restorer
;
416 void __user
*fpstate
= NULL
;
418 /* copy_to_user optimizes that into a single 8 byte store */
419 static const struct {
423 } __attribute__((packed
)) code
= {
424 0xb858, /* popl %eax ; movl $...,%eax */
426 0x80cd, /* int $0x80 */
429 frame
= get_sigframe(ka
, regs
, sizeof(*frame
), &fpstate
);
431 if (!access_ok(VERIFY_WRITE
, frame
, sizeof(*frame
)))
434 if (__put_user(sig
, &frame
->sig
))
437 if (ia32_setup_sigcontext(&frame
->sc
, fpstate
, regs
, set
->sig
[0]))
440 if (_COMPAT_NSIG_WORDS
> 1) {
441 if (__copy_to_user(frame
->extramask
, &set
->sig
[1],
442 sizeof(frame
->extramask
)))
446 if (ka
->sa
.sa_flags
& SA_RESTORER
) {
447 restorer
= ka
->sa
.sa_restorer
;
449 /* Return stub is in 32bit vsyscall page */
450 if (current
->mm
->context
.vdso
)
451 restorer
= VDSO32_SYMBOL(current
->mm
->context
.vdso
,
454 restorer
= &frame
->retcode
;
458 put_user_ex(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 put_user_ex(*((u64
*)&code
), (u64
*)frame
->retcode
);
465 } put_user_catch(err
);
470 /* Set up registers for signal handler */
471 regs
->sp
= (unsigned long) frame
;
472 regs
->ip
= (unsigned long) ka
->sa
.sa_handler
;
474 /* Make -mregparm=3 work */
479 loadsegment(ds
, __USER32_DS
);
480 loadsegment(es
, __USER32_DS
);
482 regs
->cs
= __USER32_CS
;
483 regs
->ss
= __USER32_DS
;
488 int ia32_setup_rt_frame(int sig
, struct k_sigaction
*ka
, siginfo_t
*info
,
489 compat_sigset_t
*set
, struct pt_regs
*regs
)
491 struct rt_sigframe_ia32 __user
*frame
;
492 void __user
*restorer
;
494 void __user
*fpstate
= NULL
;
496 /* __copy_to_user optimizes that into a single 8 byte store */
497 static const struct {
502 } __attribute__((packed
)) code
= {
504 __NR_ia32_rt_sigreturn
,
509 frame
= get_sigframe(ka
, regs
, sizeof(*frame
), &fpstate
);
511 if (!access_ok(VERIFY_WRITE
, frame
, sizeof(*frame
)))
515 put_user_ex(sig
, &frame
->sig
);
516 put_user_ex(ptr_to_compat(&frame
->info
), &frame
->pinfo
);
517 put_user_ex(ptr_to_compat(&frame
->uc
), &frame
->puc
);
518 err
|= copy_siginfo_to_user32(&frame
->info
, info
);
520 /* Create the ucontext. */
522 put_user_ex(UC_FP_XSTATE
, &frame
->uc
.uc_flags
);
524 put_user_ex(0, &frame
->uc
.uc_flags
);
525 put_user_ex(0, &frame
->uc
.uc_link
);
526 put_user_ex(current
->sas_ss_sp
, &frame
->uc
.uc_stack
.ss_sp
);
527 put_user_ex(sas_ss_flags(regs
->sp
),
528 &frame
->uc
.uc_stack
.ss_flags
);
529 put_user_ex(current
->sas_ss_size
, &frame
->uc
.uc_stack
.ss_size
);
530 err
|= ia32_setup_sigcontext(&frame
->uc
.uc_mcontext
, fpstate
,
532 err
|= __copy_to_user(&frame
->uc
.uc_sigmask
, set
, sizeof(*set
));
534 if (ka
->sa
.sa_flags
& SA_RESTORER
)
535 restorer
= ka
->sa
.sa_restorer
;
537 restorer
= VDSO32_SYMBOL(current
->mm
->context
.vdso
,
539 put_user_ex(ptr_to_compat(restorer
), &frame
->pretcode
);
542 * Not actually used anymore, but left because some gdb
545 put_user_ex(*((u64
*)&code
), (u64
*)frame
->retcode
);
546 } put_user_catch(err
);
551 /* Set up registers for signal handler */
552 regs
->sp
= (unsigned long) frame
;
553 regs
->ip
= (unsigned long) ka
->sa
.sa_handler
;
555 /* Make -mregparm=3 work */
557 regs
->dx
= (unsigned long) &frame
->info
;
558 regs
->cx
= (unsigned long) &frame
->uc
;
560 loadsegment(ds
, __USER32_DS
);
561 loadsegment(es
, __USER32_DS
);
563 regs
->cs
= __USER32_CS
;
564 regs
->ss
= __USER32_DS
;