x86, vdso: Reimplement vdso.so preparation in build-time C
[linux-2.6/btrfs-unstable.git] / arch / x86 / ia32 / ia32_signal.c
blobf9e181aaba979190be8d3d18ebf437c2e3a22e69
1 /*
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
9 */
11 #include <linux/sched.h>
12 #include <linux/mm.h>
13 #include <linux/smp.h>
14 #include <linux/kernel.h>
15 #include <linux/errno.h>
16 #include <linux/wait.h>
17 #include <linux/unistd.h>
18 #include <linux/stddef.h>
19 #include <linux/personality.h>
20 #include <linux/compat.h>
21 #include <linux/binfmts.h>
22 #include <asm/ucontext.h>
23 #include <asm/uaccess.h>
24 #include <asm/i387.h>
25 #include <asm/fpu-internal.h>
26 #include <asm/ptrace.h>
27 #include <asm/ia32_unistd.h>
28 #include <asm/user32.h>
29 #include <asm/sigcontext32.h>
30 #include <asm/proto.h>
31 #include <asm/vdso.h>
32 #include <asm/sigframe.h>
33 #include <asm/sighandling.h>
34 #include <asm/sys_ia32.h>
35 #include <asm/smap.h>
37 int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from)
39 int err = 0;
40 bool ia32 = test_thread_flag(TIF_IA32);
42 if (!access_ok(VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
43 return -EFAULT;
45 put_user_try {
46 /* If you change siginfo_t structure, please make sure that
47 this code is fixed accordingly.
48 It should never copy any pad contained in the structure
49 to avoid security leaks, but must copy the generic
50 3 ints plus the relevant union member. */
51 put_user_ex(from->si_signo, &to->si_signo);
52 put_user_ex(from->si_errno, &to->si_errno);
53 put_user_ex((short)from->si_code, &to->si_code);
55 if (from->si_code < 0) {
56 put_user_ex(from->si_pid, &to->si_pid);
57 put_user_ex(from->si_uid, &to->si_uid);
58 put_user_ex(ptr_to_compat(from->si_ptr), &to->si_ptr);
59 } else {
61 * First 32bits of unions are always present:
62 * si_pid === si_band === si_tid === si_addr(LS half)
64 put_user_ex(from->_sifields._pad[0],
65 &to->_sifields._pad[0]);
66 switch (from->si_code >> 16) {
67 case __SI_FAULT >> 16:
68 break;
69 case __SI_SYS >> 16:
70 put_user_ex(from->si_syscall, &to->si_syscall);
71 put_user_ex(from->si_arch, &to->si_arch);
72 break;
73 case __SI_CHLD >> 16:
74 if (ia32) {
75 put_user_ex(from->si_utime, &to->si_utime);
76 put_user_ex(from->si_stime, &to->si_stime);
77 } else {
78 put_user_ex(from->si_utime, &to->_sifields._sigchld_x32._utime);
79 put_user_ex(from->si_stime, &to->_sifields._sigchld_x32._stime);
81 put_user_ex(from->si_status, &to->si_status);
82 /* FALL THROUGH */
83 default:
84 case __SI_KILL >> 16:
85 put_user_ex(from->si_uid, &to->si_uid);
86 break;
87 case __SI_POLL >> 16:
88 put_user_ex(from->si_fd, &to->si_fd);
89 break;
90 case __SI_TIMER >> 16:
91 put_user_ex(from->si_overrun, &to->si_overrun);
92 put_user_ex(ptr_to_compat(from->si_ptr),
93 &to->si_ptr);
94 break;
95 /* This is not generated by the kernel as of now. */
96 case __SI_RT >> 16:
97 case __SI_MESGQ >> 16:
98 put_user_ex(from->si_uid, &to->si_uid);
99 put_user_ex(from->si_int, &to->si_int);
100 break;
103 } put_user_catch(err);
105 return err;
108 int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
110 int err = 0;
111 u32 ptr32;
113 if (!access_ok(VERIFY_READ, from, sizeof(compat_siginfo_t)))
114 return -EFAULT;
116 get_user_try {
117 get_user_ex(to->si_signo, &from->si_signo);
118 get_user_ex(to->si_errno, &from->si_errno);
119 get_user_ex(to->si_code, &from->si_code);
121 get_user_ex(to->si_pid, &from->si_pid);
122 get_user_ex(to->si_uid, &from->si_uid);
123 get_user_ex(ptr32, &from->si_ptr);
124 to->si_ptr = compat_ptr(ptr32);
125 } get_user_catch(err);
127 return err;
131 * Do a signal return; undo the signal stack.
133 #define loadsegment_gs(v) load_gs_index(v)
134 #define loadsegment_fs(v) loadsegment(fs, v)
135 #define loadsegment_ds(v) loadsegment(ds, v)
136 #define loadsegment_es(v) loadsegment(es, v)
138 #define get_user_seg(seg) ({ unsigned int v; savesegment(seg, v); v; })
139 #define set_user_seg(seg, v) loadsegment_##seg(v)
141 #define COPY(x) { \
142 get_user_ex(regs->x, &sc->x); \
145 #define GET_SEG(seg) ({ \
146 unsigned short tmp; \
147 get_user_ex(tmp, &sc->seg); \
148 tmp; \
151 #define COPY_SEG_CPL3(seg) do { \
152 regs->seg = GET_SEG(seg) | 3; \
153 } while (0)
155 #define RELOAD_SEG(seg) { \
156 unsigned int pre = GET_SEG(seg); \
157 unsigned int cur = get_user_seg(seg); \
158 pre |= 3; \
159 if (pre != cur) \
160 set_user_seg(seg, pre); \
163 static int ia32_restore_sigcontext(struct pt_regs *regs,
164 struct sigcontext_ia32 __user *sc,
165 unsigned int *pax)
167 unsigned int tmpflags, err = 0;
168 void __user *buf;
169 u32 tmp;
171 /* Always make any pending restarted system calls return -EINTR */
172 current_thread_info()->restart_block.fn = do_no_restart_syscall;
174 get_user_try {
176 * Reload fs and gs if they have changed in the signal
177 * handler. This does not handle long fs/gs base changes in
178 * the handler, but does not clobber them at least in the
179 * normal case.
181 RELOAD_SEG(gs);
182 RELOAD_SEG(fs);
183 RELOAD_SEG(ds);
184 RELOAD_SEG(es);
186 COPY(di); COPY(si); COPY(bp); COPY(sp); COPY(bx);
187 COPY(dx); COPY(cx); COPY(ip);
188 /* Don't touch extended registers */
190 COPY_SEG_CPL3(cs);
191 COPY_SEG_CPL3(ss);
193 get_user_ex(tmpflags, &sc->flags);
194 regs->flags = (regs->flags & ~FIX_EFLAGS) | (tmpflags & FIX_EFLAGS);
195 /* disable syscall checks */
196 regs->orig_ax = -1;
198 get_user_ex(tmp, &sc->fpstate);
199 buf = compat_ptr(tmp);
201 get_user_ex(*pax, &sc->ax);
202 } get_user_catch(err);
204 err |= restore_xstate_sig(buf, 1);
206 return err;
209 asmlinkage long sys32_sigreturn(void)
211 struct pt_regs *regs = current_pt_regs();
212 struct sigframe_ia32 __user *frame = (struct sigframe_ia32 __user *)(regs->sp-8);
213 sigset_t set;
214 unsigned int ax;
216 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
217 goto badframe;
218 if (__get_user(set.sig[0], &frame->sc.oldmask)
219 || (_COMPAT_NSIG_WORDS > 1
220 && __copy_from_user((((char *) &set.sig) + 4),
221 &frame->extramask,
222 sizeof(frame->extramask))))
223 goto badframe;
225 set_current_blocked(&set);
227 if (ia32_restore_sigcontext(regs, &frame->sc, &ax))
228 goto badframe;
229 return ax;
231 badframe:
232 signal_fault(regs, frame, "32bit sigreturn");
233 return 0;
236 asmlinkage long sys32_rt_sigreturn(void)
238 struct pt_regs *regs = current_pt_regs();
239 struct rt_sigframe_ia32 __user *frame;
240 sigset_t set;
241 unsigned int ax;
243 frame = (struct rt_sigframe_ia32 __user *)(regs->sp - 4);
245 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
246 goto badframe;
247 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
248 goto badframe;
250 set_current_blocked(&set);
252 if (ia32_restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax))
253 goto badframe;
255 if (compat_restore_altstack(&frame->uc.uc_stack))
256 goto badframe;
258 return ax;
260 badframe:
261 signal_fault(regs, frame, "32bit rt sigreturn");
262 return 0;
266 * Set up a signal frame.
269 static int ia32_setup_sigcontext(struct sigcontext_ia32 __user *sc,
270 void __user *fpstate,
271 struct pt_regs *regs, unsigned int mask)
273 int err = 0;
275 put_user_try {
276 put_user_ex(get_user_seg(gs), (unsigned int __user *)&sc->gs);
277 put_user_ex(get_user_seg(fs), (unsigned int __user *)&sc->fs);
278 put_user_ex(get_user_seg(ds), (unsigned int __user *)&sc->ds);
279 put_user_ex(get_user_seg(es), (unsigned int __user *)&sc->es);
281 put_user_ex(regs->di, &sc->di);
282 put_user_ex(regs->si, &sc->si);
283 put_user_ex(regs->bp, &sc->bp);
284 put_user_ex(regs->sp, &sc->sp);
285 put_user_ex(regs->bx, &sc->bx);
286 put_user_ex(regs->dx, &sc->dx);
287 put_user_ex(regs->cx, &sc->cx);
288 put_user_ex(regs->ax, &sc->ax);
289 put_user_ex(current->thread.trap_nr, &sc->trapno);
290 put_user_ex(current->thread.error_code, &sc->err);
291 put_user_ex(regs->ip, &sc->ip);
292 put_user_ex(regs->cs, (unsigned int __user *)&sc->cs);
293 put_user_ex(regs->flags, &sc->flags);
294 put_user_ex(regs->sp, &sc->sp_at_signal);
295 put_user_ex(regs->ss, (unsigned int __user *)&sc->ss);
297 put_user_ex(ptr_to_compat(fpstate), &sc->fpstate);
299 /* non-iBCS2 extensions.. */
300 put_user_ex(mask, &sc->oldmask);
301 put_user_ex(current->thread.cr2, &sc->cr2);
302 } put_user_catch(err);
304 return err;
308 * Determine which stack to use..
310 static void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs,
311 size_t frame_size,
312 void __user **fpstate)
314 unsigned long sp;
316 /* Default to using normal stack */
317 sp = regs->sp;
319 /* This is the X/Open sanctioned signal stack switching. */
320 if (ksig->ka.sa.sa_flags & SA_ONSTACK)
321 sp = sigsp(sp, ksig);
322 /* This is the legacy signal stack switching. */
323 else if ((regs->ss & 0xffff) != __USER32_DS &&
324 !(ksig->ka.sa.sa_flags & SA_RESTORER) &&
325 ksig->ka.sa.sa_restorer)
326 sp = (unsigned long) ksig->ka.sa.sa_restorer;
328 if (used_math()) {
329 unsigned long fx_aligned, math_size;
331 sp = alloc_mathframe(sp, 1, &fx_aligned, &math_size);
332 *fpstate = (struct _fpstate_ia32 __user *) sp;
333 if (save_xstate_sig(*fpstate, (void __user *)fx_aligned,
334 math_size) < 0)
335 return (void __user *) -1L;
338 sp -= frame_size;
339 /* Align the stack pointer according to the i386 ABI,
340 * i.e. so that on function entry ((sp + 4) & 15) == 0. */
341 sp = ((sp + 4) & -16ul) - 4;
342 return (void __user *) sp;
345 int ia32_setup_frame(int sig, struct ksignal *ksig,
346 compat_sigset_t *set, struct pt_regs *regs)
348 struct sigframe_ia32 __user *frame;
349 void __user *restorer;
350 int err = 0;
351 void __user *fpstate = NULL;
353 /* copy_to_user optimizes that into a single 8 byte store */
354 static const struct {
355 u16 poplmovl;
356 u32 val;
357 u16 int80;
358 } __attribute__((packed)) code = {
359 0xb858, /* popl %eax ; movl $...,%eax */
360 __NR_ia32_sigreturn,
361 0x80cd, /* int $0x80 */
364 frame = get_sigframe(ksig, regs, sizeof(*frame), &fpstate);
366 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
367 return -EFAULT;
369 if (__put_user(sig, &frame->sig))
370 return -EFAULT;
372 if (ia32_setup_sigcontext(&frame->sc, fpstate, regs, set->sig[0]))
373 return -EFAULT;
375 if (_COMPAT_NSIG_WORDS > 1) {
376 if (__copy_to_user(frame->extramask, &set->sig[1],
377 sizeof(frame->extramask)))
378 return -EFAULT;
381 if (ksig->ka.sa.sa_flags & SA_RESTORER) {
382 restorer = ksig->ka.sa.sa_restorer;
383 } else {
384 /* Return stub is in 32bit vsyscall page */
385 if (current->mm->context.vdso)
386 restorer = current->mm->context.vdso +
387 selected_vdso32->sym___kernel_sigreturn;
388 else
389 restorer = &frame->retcode;
392 put_user_try {
393 put_user_ex(ptr_to_compat(restorer), &frame->pretcode);
396 * These are actually not used anymore, but left because some
397 * gdb versions depend on them as a marker.
399 put_user_ex(*((u64 *)&code), (u64 __user *)frame->retcode);
400 } put_user_catch(err);
402 if (err)
403 return -EFAULT;
405 /* Set up registers for signal handler */
406 regs->sp = (unsigned long) frame;
407 regs->ip = (unsigned long) ksig->ka.sa.sa_handler;
409 /* Make -mregparm=3 work */
410 regs->ax = sig;
411 regs->dx = 0;
412 regs->cx = 0;
414 loadsegment(ds, __USER32_DS);
415 loadsegment(es, __USER32_DS);
417 regs->cs = __USER32_CS;
418 regs->ss = __USER32_DS;
420 return 0;
423 int ia32_setup_rt_frame(int sig, struct ksignal *ksig,
424 compat_sigset_t *set, struct pt_regs *regs)
426 struct rt_sigframe_ia32 __user *frame;
427 void __user *restorer;
428 int err = 0;
429 void __user *fpstate = NULL;
431 /* __copy_to_user optimizes that into a single 8 byte store */
432 static const struct {
433 u8 movl;
434 u32 val;
435 u16 int80;
436 u8 pad;
437 } __attribute__((packed)) code = {
438 0xb8,
439 __NR_ia32_rt_sigreturn,
440 0x80cd,
444 frame = get_sigframe(ksig, regs, sizeof(*frame), &fpstate);
446 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
447 return -EFAULT;
449 put_user_try {
450 put_user_ex(sig, &frame->sig);
451 put_user_ex(ptr_to_compat(&frame->info), &frame->pinfo);
452 put_user_ex(ptr_to_compat(&frame->uc), &frame->puc);
454 /* Create the ucontext. */
455 if (cpu_has_xsave)
456 put_user_ex(UC_FP_XSTATE, &frame->uc.uc_flags);
457 else
458 put_user_ex(0, &frame->uc.uc_flags);
459 put_user_ex(0, &frame->uc.uc_link);
460 compat_save_altstack_ex(&frame->uc.uc_stack, regs->sp);
462 if (ksig->ka.sa.sa_flags & SA_RESTORER)
463 restorer = ksig->ka.sa.sa_restorer;
464 else
465 restorer = current->mm->context.vdso +
466 selected_vdso32->sym___kernel_rt_sigreturn;
467 put_user_ex(ptr_to_compat(restorer), &frame->pretcode);
470 * Not actually used anymore, but left because some gdb
471 * versions need it.
473 put_user_ex(*((u64 *)&code), (u64 __user *)frame->retcode);
474 } put_user_catch(err);
476 err |= copy_siginfo_to_user32(&frame->info, &ksig->info);
477 err |= ia32_setup_sigcontext(&frame->uc.uc_mcontext, fpstate,
478 regs, set->sig[0]);
479 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
481 if (err)
482 return -EFAULT;
484 /* Set up registers for signal handler */
485 regs->sp = (unsigned long) frame;
486 regs->ip = (unsigned long) ksig->ka.sa.sa_handler;
488 /* Make -mregparm=3 work */
489 regs->ax = sig;
490 regs->dx = (unsigned long) &frame->info;
491 regs->cx = (unsigned long) &frame->uc;
493 loadsegment(ds, __USER32_DS);
494 loadsegment(es, __USER32_DS);
496 regs->cs = __USER32_CS;
497 regs->ss = __USER32_DS;
499 return 0;