x86: ia32_signal: introduce GET_SEG() macro
[deliverable/linux.git] / arch / x86 / ia32 / ia32_signal.c
1 /*
2 * linux/arch/x86_64/ia32/ia32_signal.c
3 *
4 * Copyright (C) 1991, 1992 Linus Torvalds
5 *
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 */
10
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/ptrace.h>
28 #include <asm/ia32_unistd.h>
29 #include <asm/user32.h>
30 #include <asm/sigcontext32.h>
31 #include <asm/proto.h>
32 #include <asm/vdso.h>
33 #include <asm/sigframe.h>
34 #include <asm/sys_ia32.h>
35
36 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
37
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 | \
41 X86_EFLAGS_CF)
42
43 void signal_fault(struct pt_regs *regs, void __user *frame, char *where);
44
45 int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
46 {
47 int err = 0;
48
49 if (!access_ok(VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
50 return -EFAULT;
51
52 put_user_try {
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);
61
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);
66 } else {
67 /*
68 * First 32bits of unions are always present:
69 * si_pid === si_band === si_tid === si_addr(LS half)
70 */
71 put_user_ex(from->_sifields._pad[0],
72 &to->_sifields._pad[0]);
73 switch (from->si_code >> 16) {
74 case __SI_FAULT >> 16:
75 break;
76 case __SI_CHLD >> 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);
80 /* FALL THROUGH */
81 default:
82 case __SI_KILL >> 16:
83 put_user_ex(from->si_uid, &to->si_uid);
84 break;
85 case __SI_POLL >> 16:
86 put_user_ex(from->si_fd, &to->si_fd);
87 break;
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),
91 &to->si_ptr);
92 break;
93 /* This is not generated by the kernel as of now. */
94 case __SI_RT >> 16:
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);
98 break;
99 }
100 }
101 } put_user_catch(err);
102
103 return err;
104 }
105
106 int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
107 {
108 int err = 0;
109 u32 ptr32;
110
111 if (!access_ok(VERIFY_READ, from, sizeof(compat_siginfo_t)))
112 return -EFAULT;
113
114 get_user_try {
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);
118
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);
124
125 return err;
126 }
127
128 asmlinkage long sys32_sigsuspend(int history0, int history1, old_sigset_t mask)
129 {
130 mask &= _BLOCKABLE;
131 spin_lock_irq(&current->sighand->siglock);
132 current->saved_sigmask = current->blocked;
133 siginitset(&current->blocked, mask);
134 recalc_sigpending();
135 spin_unlock_irq(&current->sighand->siglock);
136
137 current->state = TASK_INTERRUPTIBLE;
138 schedule();
139 set_restore_sigmask();
140 return -ERESTARTNOHAND;
141 }
142
143 asmlinkage long sys32_sigaltstack(const stack_ia32_t __user *uss_ptr,
144 stack_ia32_t __user *uoss_ptr,
145 struct pt_regs *regs)
146 {
147 stack_t uss, uoss;
148 int ret, err = 0;
149 mm_segment_t seg;
150
151 if (uss_ptr) {
152 u32 ptr;
153
154 memset(&uss, 0, sizeof(stack_t));
155 if (!access_ok(VERIFY_READ, uss_ptr, sizeof(stack_ia32_t)))
156 return -EFAULT;
157
158 get_user_try {
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);
163
164 if (err)
165 return -EFAULT;
166 uss.ss_sp = compat_ptr(ptr);
167 }
168 seg = get_fs();
169 set_fs(KERNEL_DS);
170 ret = do_sigaltstack(uss_ptr ? &uss : NULL, &uoss, regs->sp);
171 set_fs(seg);
172 if (ret >= 0 && uoss_ptr) {
173 if (!access_ok(VERIFY_WRITE, uoss_ptr, sizeof(stack_ia32_t)))
174 return -EFAULT;
175
176 put_user_try {
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);
181
182 if (err)
183 ret = -EFAULT;
184 }
185 return ret;
186 }
187
188 /*
189 * Do a signal return; undo the signal stack.
190 */
191 #define COPY(x) { \
192 get_user_ex(regs->x, &sc->x); \
193 }
194
195 #define GET_SEG(seg) ({ \
196 unsigned short tmp; \
197 get_user_ex(tmp, &sc->seg); \
198 tmp; \
199 })
200
201 #define COPY_SEG_CPL3(seg) do { \
202 regs->seg = GET_SEG(seg) | 3; \
203 } while (0)
204
205 #define RELOAD_SEG(seg) { \
206 unsigned int cur, pre; \
207 get_user_ex(pre, &sc->seg); \
208 savesegment(seg, cur); \
209 pre |= 3; \
210 if (pre != cur) \
211 loadsegment(seg, pre); \
212 }
213
214 static int ia32_restore_sigcontext(struct pt_regs *regs,
215 struct sigcontext_ia32 __user *sc,
216 unsigned int *pax)
217 {
218 unsigned int tmpflags, gs, oldgs, err = 0;
219 void __user *buf;
220 u32 tmp;
221
222 /* Always make any pending restarted system calls return -EINTR */
223 current_thread_info()->restart_block.fn = do_no_restart_syscall;
224
225 get_user_try {
226 /*
227 * Reload fs and gs if they have changed in the signal
228 * handler. This does not handle long fs/gs base changes in
229 * the handler, but does not clobber them at least in the
230 * normal case.
231 */
232 get_user_ex(gs, &sc->gs);
233 gs |= 3;
234 savesegment(gs, oldgs);
235 if (gs != oldgs)
236 load_gs_index(gs);
237
238 RELOAD_SEG(fs);
239 RELOAD_SEG(ds);
240 RELOAD_SEG(es);
241
242 COPY(di); COPY(si); COPY(bp); COPY(sp); COPY(bx);
243 COPY(dx); COPY(cx); COPY(ip);
244 /* Don't touch extended registers */
245
246 COPY_SEG_CPL3(cs);
247 COPY_SEG_CPL3(ss);
248
249 get_user_ex(tmpflags, &sc->flags);
250 regs->flags = (regs->flags & ~FIX_EFLAGS) | (tmpflags & FIX_EFLAGS);
251 /* disable syscall checks */
252 regs->orig_ax = -1;
253
254 get_user_ex(tmp, &sc->fpstate);
255 buf = compat_ptr(tmp);
256 err |= restore_i387_xstate_ia32(buf);
257
258 get_user_ex(*pax, &sc->ax);
259 } get_user_catch(err);
260
261 return err;
262 }
263
264 asmlinkage long sys32_sigreturn(struct pt_regs *regs)
265 {
266 struct sigframe_ia32 __user *frame = (struct sigframe_ia32 __user *)(regs->sp-8);
267 sigset_t set;
268 unsigned int ax;
269
270 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
271 goto badframe;
272 if (__get_user(set.sig[0], &frame->sc.oldmask)
273 || (_COMPAT_NSIG_WORDS > 1
274 && __copy_from_user((((char *) &set.sig) + 4),
275 &frame->extramask,
276 sizeof(frame->extramask))))
277 goto badframe;
278
279 sigdelsetmask(&set, ~_BLOCKABLE);
280 spin_lock_irq(&current->sighand->siglock);
281 current->blocked = set;
282 recalc_sigpending();
283 spin_unlock_irq(&current->sighand->siglock);
284
285 if (ia32_restore_sigcontext(regs, &frame->sc, &ax))
286 goto badframe;
287 return ax;
288
289 badframe:
290 signal_fault(regs, frame, "32bit sigreturn");
291 return 0;
292 }
293
294 asmlinkage long sys32_rt_sigreturn(struct pt_regs *regs)
295 {
296 struct rt_sigframe_ia32 __user *frame;
297 sigset_t set;
298 unsigned int ax;
299 struct pt_regs tregs;
300
301 frame = (struct rt_sigframe_ia32 __user *)(regs->sp - 4);
302
303 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
304 goto badframe;
305 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
306 goto badframe;
307
308 sigdelsetmask(&set, ~_BLOCKABLE);
309 spin_lock_irq(&current->sighand->siglock);
310 current->blocked = set;
311 recalc_sigpending();
312 spin_unlock_irq(&current->sighand->siglock);
313
314 if (ia32_restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax))
315 goto badframe;
316
317 tregs = *regs;
318 if (sys32_sigaltstack(&frame->uc.uc_stack, NULL, &tregs) == -EFAULT)
319 goto badframe;
320
321 return ax;
322
323 badframe:
324 signal_fault(regs, frame, "32bit rt sigreturn");
325 return 0;
326 }
327
328 /*
329 * Set up a signal frame.
330 */
331
332 static int ia32_setup_sigcontext(struct sigcontext_ia32 __user *sc,
333 void __user *fpstate,
334 struct pt_regs *regs, unsigned int mask)
335 {
336 int tmp, err = 0;
337
338 put_user_try {
339 savesegment(gs, tmp);
340 put_user_ex(tmp, (unsigned int __user *)&sc->gs);
341 savesegment(fs, tmp);
342 put_user_ex(tmp, (unsigned int __user *)&sc->fs);
343 savesegment(ds, tmp);
344 put_user_ex(tmp, (unsigned int __user *)&sc->ds);
345 savesegment(es, tmp);
346 put_user_ex(tmp, (unsigned int __user *)&sc->es);
347
348 put_user_ex(regs->di, &sc->di);
349 put_user_ex(regs->si, &sc->si);
350 put_user_ex(regs->bp, &sc->bp);
351 put_user_ex(regs->sp, &sc->sp);
352 put_user_ex(regs->bx, &sc->bx);
353 put_user_ex(regs->dx, &sc->dx);
354 put_user_ex(regs->cx, &sc->cx);
355 put_user_ex(regs->ax, &sc->ax);
356 put_user_ex(current->thread.trap_no, &sc->trapno);
357 put_user_ex(current->thread.error_code, &sc->err);
358 put_user_ex(regs->ip, &sc->ip);
359 put_user_ex(regs->cs, (unsigned int __user *)&sc->cs);
360 put_user_ex(regs->flags, &sc->flags);
361 put_user_ex(regs->sp, &sc->sp_at_signal);
362 put_user_ex(regs->ss, (unsigned int __user *)&sc->ss);
363
364 put_user_ex(ptr_to_compat(fpstate), &sc->fpstate);
365
366 /* non-iBCS2 extensions.. */
367 put_user_ex(mask, &sc->oldmask);
368 put_user_ex(current->thread.cr2, &sc->cr2);
369 } put_user_catch(err);
370
371 return err;
372 }
373
374 /*
375 * Determine which stack to use..
376 */
377 static void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
378 size_t frame_size,
379 void **fpstate)
380 {
381 unsigned long sp;
382
383 /* Default to using normal stack */
384 sp = regs->sp;
385
386 /* This is the X/Open sanctioned signal stack switching. */
387 if (ka->sa.sa_flags & SA_ONSTACK) {
388 if (sas_ss_flags(sp) == 0)
389 sp = current->sas_ss_sp + current->sas_ss_size;
390 }
391
392 /* This is the legacy signal stack switching. */
393 else if ((regs->ss & 0xffff) != __USER32_DS &&
394 !(ka->sa.sa_flags & SA_RESTORER) &&
395 ka->sa.sa_restorer)
396 sp = (unsigned long) ka->sa.sa_restorer;
397
398 if (used_math()) {
399 sp = sp - sig_xstate_ia32_size;
400 *fpstate = (struct _fpstate_ia32 *) sp;
401 if (save_i387_xstate_ia32(*fpstate) < 0)
402 return (void __user *) -1L;
403 }
404
405 sp -= frame_size;
406 /* Align the stack pointer according to the i386 ABI,
407 * i.e. so that on function entry ((sp + 4) & 15) == 0. */
408 sp = ((sp + 4) & -16ul) - 4;
409 return (void __user *) sp;
410 }
411
412 int ia32_setup_frame(int sig, struct k_sigaction *ka,
413 compat_sigset_t *set, struct pt_regs *regs)
414 {
415 struct sigframe_ia32 __user *frame;
416 void __user *restorer;
417 int err = 0;
418 void __user *fpstate = NULL;
419
420 /* copy_to_user optimizes that into a single 8 byte store */
421 static const struct {
422 u16 poplmovl;
423 u32 val;
424 u16 int80;
425 } __attribute__((packed)) code = {
426 0xb858, /* popl %eax ; movl $...,%eax */
427 __NR_ia32_sigreturn,
428 0x80cd, /* int $0x80 */
429 };
430
431 frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate);
432
433 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
434 return -EFAULT;
435
436 if (__put_user(sig, &frame->sig))
437 return -EFAULT;
438
439 if (ia32_setup_sigcontext(&frame->sc, fpstate, regs, set->sig[0]))
440 return -EFAULT;
441
442 if (_COMPAT_NSIG_WORDS > 1) {
443 if (__copy_to_user(frame->extramask, &set->sig[1],
444 sizeof(frame->extramask)))
445 return -EFAULT;
446 }
447
448 if (ka->sa.sa_flags & SA_RESTORER) {
449 restorer = ka->sa.sa_restorer;
450 } else {
451 /* Return stub is in 32bit vsyscall page */
452 if (current->mm->context.vdso)
453 restorer = VDSO32_SYMBOL(current->mm->context.vdso,
454 sigreturn);
455 else
456 restorer = &frame->retcode;
457 }
458
459 put_user_try {
460 put_user_ex(ptr_to_compat(restorer), &frame->pretcode);
461
462 /*
463 * These are actually not used anymore, but left because some
464 * gdb versions depend on them as a marker.
465 */
466 put_user_ex(*((u64 *)&code), (u64 *)frame->retcode);
467 } put_user_catch(err);
468
469 if (err)
470 return -EFAULT;
471
472 /* Set up registers for signal handler */
473 regs->sp = (unsigned long) frame;
474 regs->ip = (unsigned long) ka->sa.sa_handler;
475
476 /* Make -mregparm=3 work */
477 regs->ax = sig;
478 regs->dx = 0;
479 regs->cx = 0;
480
481 loadsegment(ds, __USER32_DS);
482 loadsegment(es, __USER32_DS);
483
484 regs->cs = __USER32_CS;
485 regs->ss = __USER32_DS;
486
487 return 0;
488 }
489
490 int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
491 compat_sigset_t *set, struct pt_regs *regs)
492 {
493 struct rt_sigframe_ia32 __user *frame;
494 void __user *restorer;
495 int err = 0;
496 void __user *fpstate = NULL;
497
498 /* __copy_to_user optimizes that into a single 8 byte store */
499 static const struct {
500 u8 movl;
501 u32 val;
502 u16 int80;
503 u8 pad;
504 } __attribute__((packed)) code = {
505 0xb8,
506 __NR_ia32_rt_sigreturn,
507 0x80cd,
508 0,
509 };
510
511 frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate);
512
513 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
514 return -EFAULT;
515
516 put_user_try {
517 put_user_ex(sig, &frame->sig);
518 put_user_ex(ptr_to_compat(&frame->info), &frame->pinfo);
519 put_user_ex(ptr_to_compat(&frame->uc), &frame->puc);
520 err |= copy_siginfo_to_user32(&frame->info, info);
521
522 /* Create the ucontext. */
523 if (cpu_has_xsave)
524 put_user_ex(UC_FP_XSTATE, &frame->uc.uc_flags);
525 else
526 put_user_ex(0, &frame->uc.uc_flags);
527 put_user_ex(0, &frame->uc.uc_link);
528 put_user_ex(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
529 put_user_ex(sas_ss_flags(regs->sp),
530 &frame->uc.uc_stack.ss_flags);
531 put_user_ex(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
532 err |= ia32_setup_sigcontext(&frame->uc.uc_mcontext, fpstate,
533 regs, set->sig[0]);
534 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
535
536 if (ka->sa.sa_flags & SA_RESTORER)
537 restorer = ka->sa.sa_restorer;
538 else
539 restorer = VDSO32_SYMBOL(current->mm->context.vdso,
540 rt_sigreturn);
541 put_user_ex(ptr_to_compat(restorer), &frame->pretcode);
542
543 /*
544 * Not actually used anymore, but left because some gdb
545 * versions need it.
546 */
547 put_user_ex(*((u64 *)&code), (u64 *)frame->retcode);
548 } put_user_catch(err);
549
550 if (err)
551 return -EFAULT;
552
553 /* Set up registers for signal handler */
554 regs->sp = (unsigned long) frame;
555 regs->ip = (unsigned long) ka->sa.sa_handler;
556
557 /* Make -mregparm=3 work */
558 regs->ax = sig;
559 regs->dx = (unsigned long) &frame->info;
560 regs->cx = (unsigned long) &frame->uc;
561
562 loadsegment(ds, __USER32_DS);
563 loadsegment(es, __USER32_DS);
564
565 regs->cs = __USER32_CS;
566 regs->ss = __USER32_DS;
567
568 return 0;
569 }
This page took 0.042309 seconds and 5 git commands to generate.