x86: ia32_signal: cleanup macro COPY
[linux-2.6/verdex.git] / arch / x86 / ia32 / ia32_signal.c
blob610a17774ea2828b527c2221bf2e2c3291bbe521
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/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>
26 #include <asm/i387.h>
27 #include <asm/ia32.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>
33 #include <asm/vdso.h>
35 #define DEBUG_SIG 0
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 | \
42 X86_EFLAGS_CF)
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)
49 int err;
51 if (!access_ok(VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
52 return -EFAULT;
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);
67 } else {
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:
76 break;
77 case __SI_CHLD >> 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);
81 /* FALL THROUGH */
82 default:
83 case __SI_KILL >> 16:
84 err |= __put_user(from->si_uid, &to->si_uid);
85 break;
86 case __SI_POLL >> 16:
87 err |= __put_user(from->si_fd, &to->si_fd);
88 break;
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),
92 &to->si_ptr);
93 break;
94 /* This is not generated by the kernel as of now. */
95 case __SI_RT >> 16:
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);
99 break;
102 return err;
105 int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
107 int err;
108 u32 ptr32;
110 if (!access_ok(VERIFY_READ, from, sizeof(compat_siginfo_t)))
111 return -EFAULT;
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);
122 return err;
125 asmlinkage long sys32_sigsuspend(int history0, int history1, old_sigset_t mask)
127 mask &= _BLOCKABLE;
128 spin_lock_irq(&current->sighand->siglock);
129 current->saved_sigmask = current->blocked;
130 siginitset(&current->blocked, mask);
131 recalc_sigpending();
132 spin_unlock_irq(&current->sighand->siglock);
134 current->state = TASK_INTERRUPTIBLE;
135 schedule();
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)
144 stack_t uss, uoss;
145 int ret;
146 mm_segment_t seg;
148 if (uss_ptr) {
149 u32 ptr;
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))
156 return -EFAULT;
157 uss.ss_sp = compat_ptr(ptr);
159 seg = get_fs();
160 set_fs(KERNEL_DS);
161 ret = do_sigaltstack(uss_ptr ? &uss : NULL, &uoss, regs->sp);
162 set_fs(seg);
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))
168 ret = -EFAULT;
170 return ret;
174 * Do a signal return; undo the signal stack.
177 struct sigframe
179 u32 pretcode;
180 int sig;
181 struct sigcontext_ia32 sc;
182 struct _fpstate_ia32 fpstate_unused; /* look at kernel/sigframe.h */
183 unsigned int extramask[_COMPAT_NSIG_WORDS-1];
184 char retcode[8];
185 /* fp state follows here */
188 struct rt_sigframe
190 u32 pretcode;
191 int sig;
192 u32 pinfo;
193 u32 puc;
194 compat_siginfo_t info;
195 struct ucontext_ia32 uc;
196 char retcode[8];
197 /* fp state follows here */
200 #define COPY(x) { \
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); \
209 pre |= mask; \
210 if (pre != cur) loadsegment(seg, pre); }
212 static int ia32_restore_sigcontext(struct pt_regs *regs,
213 struct sigcontext_ia32 __user *sc,
214 unsigned int *peax)
216 unsigned int tmpflags, gs, oldgs, err = 0;
217 void __user *buf;
218 u32 tmp;
220 /* Always make any pending restarted system calls return -EINTR */
221 current_thread_info()->restart_block.fn = do_no_restart_syscall;
223 #if DEBUG_SIG
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);
227 #endif
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
233 * normal case.
235 err |= __get_user(gs, &sc->gs);
236 gs |= 3;
237 savesegment(gs, oldgs);
238 if (gs != oldgs)
239 load_gs_index(gs);
241 RELOAD_SEG(fs, 3);
242 RELOAD_SEG(ds, 3);
243 RELOAD_SEG(es, 3);
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);
250 regs->cs |= 3;
251 err |= __get_user(regs->ss, &sc->ss);
252 regs->ss |= 3;
254 err |= __get_user(tmpflags, &sc->flags);
255 regs->flags = (regs->flags & ~FIX_EFLAGS) | (tmpflags & FIX_EFLAGS);
256 /* disable syscall checks */
257 regs->orig_ax = -1;
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);
264 *peax = tmp;
266 return err;
269 asmlinkage long sys32_sigreturn(struct pt_regs *regs)
271 struct sigframe __user *frame = (struct sigframe __user *)(regs->sp-8);
272 sigset_t set;
273 unsigned int ax;
275 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
276 goto badframe;
277 if (__get_user(set.sig[0], &frame->sc.oldmask)
278 || (_COMPAT_NSIG_WORDS > 1
279 && __copy_from_user((((char *) &set.sig) + 4),
280 &frame->extramask,
281 sizeof(frame->extramask))))
282 goto badframe;
284 sigdelsetmask(&set, ~_BLOCKABLE);
285 spin_lock_irq(&current->sighand->siglock);
286 current->blocked = set;
287 recalc_sigpending();
288 spin_unlock_irq(&current->sighand->siglock);
290 if (ia32_restore_sigcontext(regs, &frame->sc, &ax))
291 goto badframe;
292 return ax;
294 badframe:
295 signal_fault(regs, frame, "32bit sigreturn");
296 return 0;
299 asmlinkage long sys32_rt_sigreturn(struct pt_regs *regs)
301 struct rt_sigframe __user *frame;
302 sigset_t set;
303 unsigned int ax;
304 struct pt_regs tregs;
306 frame = (struct rt_sigframe __user *)(regs->sp - 4);
308 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
309 goto badframe;
310 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
311 goto badframe;
313 sigdelsetmask(&set, ~_BLOCKABLE);
314 spin_lock_irq(&current->sighand->siglock);
315 current->blocked = set;
316 recalc_sigpending();
317 spin_unlock_irq(&current->sighand->siglock);
319 if (ia32_restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax))
320 goto badframe;
322 tregs = *regs;
323 if (sys32_sigaltstack(&frame->uc.uc_stack, NULL, &tregs) == -EFAULT)
324 goto badframe;
326 return ax;
328 badframe:
329 signal_fault(regs, frame, "32bit rt sigreturn");
330 return 0;
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)
341 int tmp, err = 0;
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);
374 return err;
378 * Determine which stack to use..
380 static void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
381 size_t frame_size,
382 void **fpstate)
384 unsigned long sp;
386 /* Default to using normal stack */
387 sp = regs->sp;
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) &&
398 ka->sa.sa_restorer)
399 sp = (unsigned long) ka->sa.sa_restorer;
401 if (used_math()) {
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;
408 sp -= frame_size;
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;
420 int err = 0;
421 void __user *fpstate = NULL;
423 /* copy_to_user optimizes that into a single 8 byte store */
424 static const struct {
425 u16 poplmovl;
426 u32 val;
427 u16 int80;
428 } __attribute__((packed)) code = {
429 0xb858, /* popl %eax ; movl $...,%eax */
430 __NR_ia32_sigreturn,
431 0x80cd, /* int $0x80 */
434 frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate);
436 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
437 return -EFAULT;
439 if (__put_user(sig, &frame->sig))
440 return -EFAULT;
442 if (ia32_setup_sigcontext(&frame->sc, fpstate, regs, set->sig[0]))
443 return -EFAULT;
445 if (_COMPAT_NSIG_WORDS > 1) {
446 if (__copy_to_user(frame->extramask, &set->sig[1],
447 sizeof(frame->extramask)))
448 return -EFAULT;
451 if (ka->sa.sa_flags & SA_RESTORER) {
452 restorer = ka->sa.sa_restorer;
453 } else {
454 /* Return stub is in 32bit vsyscall page */
455 if (current->mm->context.vdso)
456 restorer = VDSO32_SYMBOL(current->mm->context.vdso,
457 sigreturn);
458 else
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);
468 if (err)
469 return -EFAULT;
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 */
476 regs->ax = sig;
477 regs->dx = 0;
478 regs->cx = 0;
480 loadsegment(ds, __USER32_DS);
481 loadsegment(es, __USER32_DS);
483 regs->cs = __USER32_CS;
484 regs->ss = __USER32_DS;
486 #if DEBUG_SIG
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);
489 #endif
491 return 0;
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;
499 int err = 0;
500 void __user *fpstate = NULL;
502 /* __copy_to_user optimizes that into a single 8 byte store */
503 static const struct {
504 u8 movl;
505 u32 val;
506 u16 int80;
507 u8 pad;
508 } __attribute__((packed)) code = {
509 0xb8,
510 __NR_ia32_rt_sigreturn,
511 0x80cd,
515 frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate);
517 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
518 return -EFAULT;
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);
524 if (err)
525 return -EFAULT;
527 /* Create the ucontext. */
528 if (cpu_has_xsave)
529 err |= __put_user(UC_FP_XSTATE, &frame->uc.uc_flags);
530 else
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,
538 regs, set->sig[0]);
539 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
540 if (err)
541 return -EFAULT;
543 if (ka->sa.sa_flags & SA_RESTORER)
544 restorer = ka->sa.sa_restorer;
545 else
546 restorer = VDSO32_SYMBOL(current->mm->context.vdso,
547 rt_sigreturn);
548 err |= __put_user(ptr_to_compat(restorer), &frame->pretcode);
551 * Not actually used anymore, but left because some gdb
552 * versions need it.
554 err |= __copy_to_user(frame->retcode, &code, 8);
555 if (err)
556 return -EFAULT;
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 */
563 regs->ax = sig;
564 regs->dx = (unsigned long) &frame->info;
565 regs->cx = (unsigned long) &frame->uc;
567 /* Make -mregparm=3 work */
568 regs->ax = sig;
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;
578 #if DEBUG_SIG
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);
581 #endif
583 return 0;