Merge branch 'for-linus' of master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband
[deliverable/linux.git] / arch / mips / kernel / signal32.c
1 /*
2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details.
5 *
6 * Copyright (C) 1991, 1992 Linus Torvalds
7 * Copyright (C) 1994 - 2000, 2006 Ralf Baechle
8 * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
9 */
10 #include <linux/cache.h>
11 #include <linux/compat.h>
12 #include <linux/sched.h>
13 #include <linux/mm.h>
14 #include <linux/smp.h>
15 #include <linux/smp_lock.h>
16 #include <linux/kernel.h>
17 #include <linux/signal.h>
18 #include <linux/syscalls.h>
19 #include <linux/errno.h>
20 #include <linux/wait.h>
21 #include <linux/ptrace.h>
22 #include <linux/compat.h>
23 #include <linux/suspend.h>
24 #include <linux/compiler.h>
25
26 #include <asm/abi.h>
27 #include <asm/asm.h>
28 #include <asm/compat-signal.h>
29 #include <linux/bitops.h>
30 #include <asm/cacheflush.h>
31 #include <asm/sim.h>
32 #include <asm/uaccess.h>
33 #include <asm/ucontext.h>
34 #include <asm/system.h>
35 #include <asm/fpu.h>
36 #include <asm/war.h>
37
38 #include "signal-common.h"
39
40 #define SI_PAD_SIZE32 ((SI_MAX_SIZE/sizeof(int)) - 3)
41
42 typedef struct compat_siginfo {
43 int si_signo;
44 int si_code;
45 int si_errno;
46
47 union {
48 int _pad[SI_PAD_SIZE32];
49
50 /* kill() */
51 struct {
52 compat_pid_t _pid; /* sender's pid */
53 compat_uid_t _uid; /* sender's uid */
54 } _kill;
55
56 /* SIGCHLD */
57 struct {
58 compat_pid_t _pid; /* which child */
59 compat_uid_t _uid; /* sender's uid */
60 int _status; /* exit code */
61 compat_clock_t _utime;
62 compat_clock_t _stime;
63 } _sigchld;
64
65 /* IRIX SIGCHLD */
66 struct {
67 compat_pid_t _pid; /* which child */
68 compat_clock_t _utime;
69 int _status; /* exit code */
70 compat_clock_t _stime;
71 } _irix_sigchld;
72
73 /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
74 struct {
75 s32 _addr; /* faulting insn/memory ref. */
76 } _sigfault;
77
78 /* SIGPOLL, SIGXFSZ (To do ...) */
79 struct {
80 int _band; /* POLL_IN, POLL_OUT, POLL_MSG */
81 int _fd;
82 } _sigpoll;
83
84 /* POSIX.1b timers */
85 struct {
86 timer_t _tid; /* timer id */
87 int _overrun; /* overrun count */
88 compat_sigval_t _sigval;/* same as below */
89 int _sys_private; /* not to be passed to user */
90 } _timer;
91
92 /* POSIX.1b signals */
93 struct {
94 compat_pid_t _pid; /* sender's pid */
95 compat_uid_t _uid; /* sender's uid */
96 compat_sigval_t _sigval;
97 } _rt;
98
99 } _sifields;
100 } compat_siginfo_t;
101
102 /*
103 * Including <asm/unistd.h> would give use the 64-bit syscall numbers ...
104 */
105 #define __NR_O32_sigreturn 4119
106 #define __NR_O32_rt_sigreturn 4193
107 #define __NR_O32_restart_syscall 4253
108
109 /* 32-bit compatibility types */
110
111 #define _NSIG_BPW32 32
112 #define _NSIG_WORDS32 (_NSIG / _NSIG_BPW32)
113
114 typedef struct {
115 unsigned int sig[_NSIG_WORDS32];
116 } sigset_t32;
117
118 typedef unsigned int __sighandler32_t;
119 typedef void (*vfptr_t)(void);
120
121 struct sigaction32 {
122 unsigned int sa_flags;
123 __sighandler32_t sa_handler;
124 compat_sigset_t sa_mask;
125 };
126
127 /* IRIX compatible stack_t */
128 typedef struct sigaltstack32 {
129 s32 ss_sp;
130 compat_size_t ss_size;
131 int ss_flags;
132 } stack32_t;
133
134 struct ucontext32 {
135 u32 uc_flags;
136 s32 uc_link;
137 stack32_t uc_stack;
138 struct sigcontext32 uc_mcontext;
139 sigset_t32 uc_sigmask; /* mask last for extensibility */
140 };
141
142 /*
143 * Horribly complicated - with the bloody RM9000 workarounds enabled
144 * the signal trampolines is moving to the end of the structure so we can
145 * increase the alignment without breaking software compatibility.
146 */
147 #if ICACHE_REFILLS_WORKAROUND_WAR == 0
148
149 struct sigframe32 {
150 u32 sf_ass[4]; /* argument save space for o32 */
151 u32 sf_code[2]; /* signal trampoline */
152 struct sigcontext32 sf_sc;
153 sigset_t sf_mask;
154 };
155
156 struct rt_sigframe32 {
157 u32 rs_ass[4]; /* argument save space for o32 */
158 u32 rs_code[2]; /* signal trampoline */
159 compat_siginfo_t rs_info;
160 struct ucontext32 rs_uc;
161 };
162
163 #else /* ICACHE_REFILLS_WORKAROUND_WAR */
164
165 struct sigframe32 {
166 u32 sf_ass[4]; /* argument save space for o32 */
167 u32 sf_pad[2];
168 struct sigcontext32 sf_sc; /* hw context */
169 sigset_t sf_mask;
170 u32 sf_code[8] ____cacheline_aligned; /* signal trampoline */
171 };
172
173 struct rt_sigframe32 {
174 u32 rs_ass[4]; /* argument save space for o32 */
175 u32 rs_pad[2];
176 compat_siginfo_t rs_info;
177 struct ucontext32 rs_uc;
178 u32 rs_code[8] __attribute__((aligned(32))); /* signal trampoline */
179 };
180
181 #endif /* !ICACHE_REFILLS_WORKAROUND_WAR */
182
183 /*
184 * sigcontext handlers
185 */
186 static int setup_sigcontext32(struct pt_regs *regs,
187 struct sigcontext32 __user *sc)
188 {
189 int err = 0;
190 int i;
191
192 err |= __put_user(regs->cp0_epc, &sc->sc_pc);
193
194 err |= __put_user(0, &sc->sc_regs[0]);
195 for (i = 1; i < 32; i++)
196 err |= __put_user(regs->regs[i], &sc->sc_regs[i]);
197
198 err |= __put_user(regs->hi, &sc->sc_mdhi);
199 err |= __put_user(regs->lo, &sc->sc_mdlo);
200 if (cpu_has_dsp) {
201 err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
202 err |= __put_user(mfhi1(), &sc->sc_hi1);
203 err |= __put_user(mflo1(), &sc->sc_lo1);
204 err |= __put_user(mfhi2(), &sc->sc_hi2);
205 err |= __put_user(mflo2(), &sc->sc_lo2);
206 err |= __put_user(mfhi3(), &sc->sc_hi3);
207 err |= __put_user(mflo3(), &sc->sc_lo3);
208 }
209
210 err |= __put_user(!!used_math(), &sc->sc_used_math);
211
212 if (used_math()) {
213 /*
214 * Save FPU state to signal context. Signal handler
215 * will "inherit" current FPU state.
216 */
217 preempt_disable();
218
219 if (!is_fpu_owner()) {
220 own_fpu();
221 restore_fp(current);
222 }
223 err |= save_fp_context32(sc);
224
225 preempt_enable();
226 }
227 return err;
228 }
229
230 static int restore_sigcontext32(struct pt_regs *regs,
231 struct sigcontext32 __user *sc)
232 {
233 u32 used_math;
234 int err = 0;
235 s32 treg;
236 int i;
237
238 /* Always make any pending restarted system calls return -EINTR */
239 current_thread_info()->restart_block.fn = do_no_restart_syscall;
240
241 err |= __get_user(regs->cp0_epc, &sc->sc_pc);
242 err |= __get_user(regs->hi, &sc->sc_mdhi);
243 err |= __get_user(regs->lo, &sc->sc_mdlo);
244 if (cpu_has_dsp) {
245 err |= __get_user(treg, &sc->sc_hi1); mthi1(treg);
246 err |= __get_user(treg, &sc->sc_lo1); mtlo1(treg);
247 err |= __get_user(treg, &sc->sc_hi2); mthi2(treg);
248 err |= __get_user(treg, &sc->sc_lo2); mtlo2(treg);
249 err |= __get_user(treg, &sc->sc_hi3); mthi3(treg);
250 err |= __get_user(treg, &sc->sc_lo3); mtlo3(treg);
251 err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
252 }
253
254 for (i = 1; i < 32; i++)
255 err |= __get_user(regs->regs[i], &sc->sc_regs[i]);
256
257 err |= __get_user(used_math, &sc->sc_used_math);
258 conditional_used_math(used_math);
259
260 preempt_disable();
261
262 if (used_math()) {
263 /* restore fpu context if we have used it before */
264 own_fpu();
265 err |= restore_fp_context32(sc);
266 } else {
267 /* signal handler may have used FPU. Give it up. */
268 lose_fpu();
269 }
270
271 preempt_enable();
272
273 return err;
274 }
275
276 /*
277 *
278 */
279 extern void __put_sigset_unknown_nsig(void);
280 extern void __get_sigset_unknown_nsig(void);
281
282 static inline int put_sigset(const sigset_t *kbuf, compat_sigset_t __user *ubuf)
283 {
284 int err = 0;
285
286 if (!access_ok(VERIFY_WRITE, ubuf, sizeof(*ubuf)))
287 return -EFAULT;
288
289 switch (_NSIG_WORDS) {
290 default:
291 __put_sigset_unknown_nsig();
292 case 2:
293 err |= __put_user (kbuf->sig[1] >> 32, &ubuf->sig[3]);
294 err |= __put_user (kbuf->sig[1] & 0xffffffff, &ubuf->sig[2]);
295 case 1:
296 err |= __put_user (kbuf->sig[0] >> 32, &ubuf->sig[1]);
297 err |= __put_user (kbuf->sig[0] & 0xffffffff, &ubuf->sig[0]);
298 }
299
300 return err;
301 }
302
303 static inline int get_sigset(sigset_t *kbuf, const compat_sigset_t __user *ubuf)
304 {
305 int err = 0;
306 unsigned long sig[4];
307
308 if (!access_ok(VERIFY_READ, ubuf, sizeof(*ubuf)))
309 return -EFAULT;
310
311 switch (_NSIG_WORDS) {
312 default:
313 __get_sigset_unknown_nsig();
314 case 2:
315 err |= __get_user (sig[3], &ubuf->sig[3]);
316 err |= __get_user (sig[2], &ubuf->sig[2]);
317 kbuf->sig[1] = sig[2] | (sig[3] << 32);
318 case 1:
319 err |= __get_user (sig[1], &ubuf->sig[1]);
320 err |= __get_user (sig[0], &ubuf->sig[0]);
321 kbuf->sig[0] = sig[0] | (sig[1] << 32);
322 }
323
324 return err;
325 }
326
327 /*
328 * Atomically swap in the new signal mask, and wait for a signal.
329 */
330
331 asmlinkage int sys32_sigsuspend(nabi_no_regargs struct pt_regs regs)
332 {
333 compat_sigset_t __user *uset;
334 sigset_t newset;
335
336 uset = (compat_sigset_t __user *) regs.regs[4];
337 if (get_sigset(&newset, uset))
338 return -EFAULT;
339 sigdelsetmask(&newset, ~_BLOCKABLE);
340
341 spin_lock_irq(&current->sighand->siglock);
342 current->saved_sigmask = current->blocked;
343 current->blocked = newset;
344 recalc_sigpending();
345 spin_unlock_irq(&current->sighand->siglock);
346
347 current->state = TASK_INTERRUPTIBLE;
348 schedule();
349 set_thread_flag(TIF_RESTORE_SIGMASK);
350 return -ERESTARTNOHAND;
351 }
352
353 asmlinkage int sys32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
354 {
355 compat_sigset_t __user *uset;
356 sigset_t newset;
357 size_t sigsetsize;
358
359 /* XXX Don't preclude handling different sized sigset_t's. */
360 sigsetsize = regs.regs[5];
361 if (sigsetsize != sizeof(compat_sigset_t))
362 return -EINVAL;
363
364 uset = (compat_sigset_t __user *) regs.regs[4];
365 if (get_sigset(&newset, uset))
366 return -EFAULT;
367 sigdelsetmask(&newset, ~_BLOCKABLE);
368
369 spin_lock_irq(&current->sighand->siglock);
370 current->saved_sigmask = current->blocked;
371 current->blocked = newset;
372 recalc_sigpending();
373 spin_unlock_irq(&current->sighand->siglock);
374
375 current->state = TASK_INTERRUPTIBLE;
376 schedule();
377 set_thread_flag(TIF_RESTORE_SIGMASK);
378 return -ERESTARTNOHAND;
379 }
380
381 asmlinkage int sys32_sigaction(int sig, const struct sigaction32 __user *act,
382 struct sigaction32 __user *oact)
383 {
384 struct k_sigaction new_ka, old_ka;
385 int ret;
386 int err = 0;
387
388 if (act) {
389 old_sigset_t mask;
390 s32 handler;
391
392 if (!access_ok(VERIFY_READ, act, sizeof(*act)))
393 return -EFAULT;
394 err |= __get_user(handler, &act->sa_handler);
395 new_ka.sa.sa_handler = (void __user *)(s64)handler;
396 err |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
397 err |= __get_user(mask, &act->sa_mask.sig[0]);
398 if (err)
399 return -EFAULT;
400
401 siginitset(&new_ka.sa.sa_mask, mask);
402 }
403
404 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
405
406 if (!ret && oact) {
407 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)))
408 return -EFAULT;
409 err |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
410 err |= __put_user((u32)(u64)old_ka.sa.sa_handler,
411 &oact->sa_handler);
412 err |= __put_user(old_ka.sa.sa_mask.sig[0], oact->sa_mask.sig);
413 err |= __put_user(0, &oact->sa_mask.sig[1]);
414 err |= __put_user(0, &oact->sa_mask.sig[2]);
415 err |= __put_user(0, &oact->sa_mask.sig[3]);
416 if (err)
417 return -EFAULT;
418 }
419
420 return ret;
421 }
422
423 asmlinkage int sys32_sigaltstack(nabi_no_regargs struct pt_regs regs)
424 {
425 const stack32_t __user *uss = (const stack32_t __user *) regs.regs[4];
426 stack32_t __user *uoss = (stack32_t __user *) regs.regs[5];
427 unsigned long usp = regs.regs[29];
428 stack_t kss, koss;
429 int ret, err = 0;
430 mm_segment_t old_fs = get_fs();
431 s32 sp;
432
433 if (uss) {
434 if (!access_ok(VERIFY_READ, uss, sizeof(*uss)))
435 return -EFAULT;
436 err |= __get_user(sp, &uss->ss_sp);
437 kss.ss_sp = (void __user *) (long) sp;
438 err |= __get_user(kss.ss_size, &uss->ss_size);
439 err |= __get_user(kss.ss_flags, &uss->ss_flags);
440 if (err)
441 return -EFAULT;
442 }
443
444 set_fs (KERNEL_DS);
445 ret = do_sigaltstack(uss ? (stack_t __user *)&kss : NULL,
446 uoss ? (stack_t __user *)&koss : NULL, usp);
447 set_fs (old_fs);
448
449 if (!ret && uoss) {
450 if (!access_ok(VERIFY_WRITE, uoss, sizeof(*uoss)))
451 return -EFAULT;
452 sp = (int) (unsigned long) koss.ss_sp;
453 err |= __put_user(sp, &uoss->ss_sp);
454 err |= __put_user(koss.ss_size, &uoss->ss_size);
455 err |= __put_user(koss.ss_flags, &uoss->ss_flags);
456 if (err)
457 return -EFAULT;
458 }
459 return ret;
460 }
461
462 int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
463 {
464 int err;
465
466 if (!access_ok (VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
467 return -EFAULT;
468
469 /* If you change siginfo_t structure, please be sure
470 this code is fixed accordingly.
471 It should never copy any pad contained in the structure
472 to avoid security leaks, but must copy the generic
473 3 ints plus the relevant union member.
474 This routine must convert siginfo from 64bit to 32bit as well
475 at the same time. */
476 err = __put_user(from->si_signo, &to->si_signo);
477 err |= __put_user(from->si_errno, &to->si_errno);
478 err |= __put_user((short)from->si_code, &to->si_code);
479 if (from->si_code < 0)
480 err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
481 else {
482 switch (from->si_code >> 16) {
483 case __SI_TIMER >> 16:
484 err |= __put_user(from->si_tid, &to->si_tid);
485 err |= __put_user(from->si_overrun, &to->si_overrun);
486 err |= __put_user(from->si_int, &to->si_int);
487 break;
488 case __SI_CHLD >> 16:
489 err |= __put_user(from->si_utime, &to->si_utime);
490 err |= __put_user(from->si_stime, &to->si_stime);
491 err |= __put_user(from->si_status, &to->si_status);
492 default:
493 err |= __put_user(from->si_pid, &to->si_pid);
494 err |= __put_user(from->si_uid, &to->si_uid);
495 break;
496 case __SI_FAULT >> 16:
497 err |= __put_user((unsigned long)from->si_addr, &to->si_addr);
498 break;
499 case __SI_POLL >> 16:
500 err |= __put_user(from->si_band, &to->si_band);
501 err |= __put_user(from->si_fd, &to->si_fd);
502 break;
503 case __SI_RT >> 16: /* This is not generated by the kernel as of now. */
504 case __SI_MESGQ >> 16:
505 err |= __put_user(from->si_pid, &to->si_pid);
506 err |= __put_user(from->si_uid, &to->si_uid);
507 err |= __put_user(from->si_int, &to->si_int);
508 break;
509 }
510 }
511 return err;
512 }
513
514 asmlinkage void sys32_sigreturn(nabi_no_regargs struct pt_regs regs)
515 {
516 struct sigframe32 __user *frame;
517 sigset_t blocked;
518
519 frame = (struct sigframe32 __user *) regs.regs[29];
520 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
521 goto badframe;
522 if (__copy_conv_sigset_from_user(&blocked, &frame->sf_mask))
523 goto badframe;
524
525 sigdelsetmask(&blocked, ~_BLOCKABLE);
526 spin_lock_irq(&current->sighand->siglock);
527 current->blocked = blocked;
528 recalc_sigpending();
529 spin_unlock_irq(&current->sighand->siglock);
530
531 if (restore_sigcontext32(&regs, &frame->sf_sc))
532 goto badframe;
533
534 /*
535 * Don't let your children do this ...
536 */
537 __asm__ __volatile__(
538 "move\t$29, %0\n\t"
539 "j\tsyscall_exit"
540 :/* no outputs */
541 :"r" (&regs));
542 /* Unreached */
543
544 badframe:
545 force_sig(SIGSEGV, current);
546 }
547
548 asmlinkage void sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
549 {
550 struct rt_sigframe32 __user *frame;
551 mm_segment_t old_fs;
552 sigset_t set;
553 stack_t st;
554 s32 sp;
555
556 frame = (struct rt_sigframe32 __user *) regs.regs[29];
557 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
558 goto badframe;
559 if (__copy_conv_sigset_from_user(&set, &frame->rs_uc.uc_sigmask))
560 goto badframe;
561
562 sigdelsetmask(&set, ~_BLOCKABLE);
563 spin_lock_irq(&current->sighand->siglock);
564 current->blocked = set;
565 recalc_sigpending();
566 spin_unlock_irq(&current->sighand->siglock);
567
568 if (restore_sigcontext32(&regs, &frame->rs_uc.uc_mcontext))
569 goto badframe;
570
571 /* The ucontext contains a stack32_t, so we must convert! */
572 if (__get_user(sp, &frame->rs_uc.uc_stack.ss_sp))
573 goto badframe;
574 st.ss_sp = (void __user *)(long) sp;
575 if (__get_user(st.ss_size, &frame->rs_uc.uc_stack.ss_size))
576 goto badframe;
577 if (__get_user(st.ss_flags, &frame->rs_uc.uc_stack.ss_flags))
578 goto badframe;
579
580 /* It is more difficult to avoid calling this function than to
581 call it and ignore errors. */
582 old_fs = get_fs();
583 set_fs (KERNEL_DS);
584 do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]);
585 set_fs (old_fs);
586
587 /*
588 * Don't let your children do this ...
589 */
590 __asm__ __volatile__(
591 "move\t$29, %0\n\t"
592 "j\tsyscall_exit"
593 :/* no outputs */
594 :"r" (&regs));
595 /* Unreached */
596
597 badframe:
598 force_sig(SIGSEGV, current);
599 }
600
601 int setup_frame_32(struct k_sigaction * ka, struct pt_regs *regs,
602 int signr, sigset_t *set)
603 {
604 struct sigframe32 __user *frame;
605 int err = 0;
606
607 frame = get_sigframe(ka, regs, sizeof(*frame));
608 if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
609 goto give_sigsegv;
610
611 err |= install_sigtramp(frame->sf_code, __NR_O32_sigreturn);
612
613 err |= setup_sigcontext32(regs, &frame->sf_sc);
614 err |= __copy_conv_sigset_to_user(&frame->sf_mask, set);
615
616 if (err)
617 goto give_sigsegv;
618
619 /*
620 * Arguments to signal handler:
621 *
622 * a0 = signal number
623 * a1 = 0 (should be cause)
624 * a2 = pointer to struct sigcontext
625 *
626 * $25 and c0_epc point to the signal handler, $29 points to the
627 * struct sigframe.
628 */
629 regs->regs[ 4] = signr;
630 regs->regs[ 5] = 0;
631 regs->regs[ 6] = (unsigned long) &frame->sf_sc;
632 regs->regs[29] = (unsigned long) frame;
633 regs->regs[31] = (unsigned long) frame->sf_code;
634 regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
635
636 DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
637 current->comm, current->pid,
638 frame, regs->cp0_epc, regs->regs[31]);
639
640 return 0;
641
642 give_sigsegv:
643 force_sigsegv(signr, current);
644 return -EFAULT;
645 }
646
647 int setup_rt_frame_32(struct k_sigaction * ka, struct pt_regs *regs,
648 int signr, sigset_t *set, siginfo_t *info)
649 {
650 struct rt_sigframe32 __user *frame;
651 int err = 0;
652 s32 sp;
653
654 frame = get_sigframe(ka, regs, sizeof(*frame));
655 if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
656 goto give_sigsegv;
657
658 err |= install_sigtramp(frame->rs_code, __NR_O32_rt_sigreturn);
659
660 /* Convert (siginfo_t -> compat_siginfo_t) and copy to user. */
661 err |= copy_siginfo_to_user32(&frame->rs_info, info);
662
663 /* Create the ucontext. */
664 err |= __put_user(0, &frame->rs_uc.uc_flags);
665 err |= __put_user(0, &frame->rs_uc.uc_link);
666 sp = (int) (long) current->sas_ss_sp;
667 err |= __put_user(sp,
668 &frame->rs_uc.uc_stack.ss_sp);
669 err |= __put_user(sas_ss_flags(regs->regs[29]),
670 &frame->rs_uc.uc_stack.ss_flags);
671 err |= __put_user(current->sas_ss_size,
672 &frame->rs_uc.uc_stack.ss_size);
673 err |= setup_sigcontext32(regs, &frame->rs_uc.uc_mcontext);
674 err |= __copy_conv_sigset_to_user(&frame->rs_uc.uc_sigmask, set);
675
676 if (err)
677 goto give_sigsegv;
678
679 /*
680 * Arguments to signal handler:
681 *
682 * a0 = signal number
683 * a1 = 0 (should be cause)
684 * a2 = pointer to ucontext
685 *
686 * $25 and c0_epc point to the signal handler, $29 points to
687 * the struct rt_sigframe32.
688 */
689 regs->regs[ 4] = signr;
690 regs->regs[ 5] = (unsigned long) &frame->rs_info;
691 regs->regs[ 6] = (unsigned long) &frame->rs_uc;
692 regs->regs[29] = (unsigned long) frame;
693 regs->regs[31] = (unsigned long) frame->rs_code;
694 regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
695
696 DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
697 current->comm, current->pid,
698 frame, regs->cp0_epc, regs->regs[31]);
699
700 return 0;
701
702 give_sigsegv:
703 force_sigsegv(signr, current);
704 return -EFAULT;
705 }
706
707 static inline int handle_signal(unsigned long sig, siginfo_t *info,
708 struct k_sigaction *ka, sigset_t *oldset, struct pt_regs * regs)
709 {
710 int ret;
711
712 switch (regs->regs[0]) {
713 case ERESTART_RESTARTBLOCK:
714 case ERESTARTNOHAND:
715 regs->regs[2] = EINTR;
716 break;
717 case ERESTARTSYS:
718 if (!(ka->sa.sa_flags & SA_RESTART)) {
719 regs->regs[2] = EINTR;
720 break;
721 }
722 /* fallthrough */
723 case ERESTARTNOINTR: /* Userland will reload $v0. */
724 regs->regs[7] = regs->regs[26];
725 regs->cp0_epc -= 8;
726 }
727
728 regs->regs[0] = 0; /* Don't deal with this again. */
729
730 if (ka->sa.sa_flags & SA_SIGINFO)
731 ret = current->thread.abi->setup_rt_frame(ka, regs, sig, oldset, info);
732 else
733 ret = current->thread.abi->setup_frame(ka, regs, sig, oldset);
734
735 spin_lock_irq(&current->sighand->siglock);
736 sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
737 if (!(ka->sa.sa_flags & SA_NODEFER))
738 sigaddset(&current->blocked,sig);
739 recalc_sigpending();
740 spin_unlock_irq(&current->sighand->siglock);
741
742 return ret;
743 }
744
745 void do_signal32(struct pt_regs *regs)
746 {
747 struct k_sigaction ka;
748 sigset_t *oldset;
749 siginfo_t info;
750 int signr;
751
752 /*
753 * We want the common case to go fast, which is why we may in certain
754 * cases get here from kernel mode. Just return without doing anything
755 * if so.
756 */
757 if (!user_mode(regs))
758 return;
759
760 if (test_thread_flag(TIF_RESTORE_SIGMASK))
761 oldset = &current->saved_sigmask;
762 else
763 oldset = &current->blocked;
764
765 signr = get_signal_to_deliver(&info, &ka, regs, NULL);
766 if (signr > 0) {
767 /* Whee! Actually deliver the signal. */
768 if (handle_signal(signr, &info, &ka, oldset, regs) == 0) {
769 /*
770 * A signal was successfully delivered; the saved
771 * sigmask will have been stored in the signal frame,
772 * and will be restored by sigreturn, so we can simply
773 * clear the TIF_RESTORE_SIGMASK flag.
774 */
775 if (test_thread_flag(TIF_RESTORE_SIGMASK))
776 clear_thread_flag(TIF_RESTORE_SIGMASK);
777 }
778
779 return;
780 }
781
782 /*
783 * Who's code doesn't conform to the restartable syscall convention
784 * dies here!!! The li instruction, a single machine instruction,
785 * must directly be followed by the syscall instruction.
786 */
787 if (regs->regs[0]) {
788 if (regs->regs[2] == ERESTARTNOHAND ||
789 regs->regs[2] == ERESTARTSYS ||
790 regs->regs[2] == ERESTARTNOINTR) {
791 regs->regs[7] = regs->regs[26];
792 regs->cp0_epc -= 8;
793 }
794 if (regs->regs[2] == ERESTART_RESTARTBLOCK) {
795 regs->regs[2] = __NR_O32_restart_syscall;
796 regs->regs[7] = regs->regs[26];
797 regs->cp0_epc -= 4;
798 }
799 regs->regs[0] = 0; /* Don't deal with this again. */
800 }
801
802 /*
803 * If there's no signal to deliver, we just put the saved sigmask
804 * back
805 */
806 if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
807 clear_thread_flag(TIF_RESTORE_SIGMASK);
808 sigprocmask(SIG_SETMASK, &current->saved_sigmask, NULL);
809 }
810 }
811
812 asmlinkage int sys32_rt_sigaction(int sig, const struct sigaction32 __user *act,
813 struct sigaction32 __user *oact,
814 unsigned int sigsetsize)
815 {
816 struct k_sigaction new_sa, old_sa;
817 int ret = -EINVAL;
818
819 /* XXX: Don't preclude handling different sized sigset_t's. */
820 if (sigsetsize != sizeof(sigset_t))
821 goto out;
822
823 if (act) {
824 s32 handler;
825 int err = 0;
826
827 if (!access_ok(VERIFY_READ, act, sizeof(*act)))
828 return -EFAULT;
829 err |= __get_user(handler, &act->sa_handler);
830 new_sa.sa.sa_handler = (void __user *)(s64)handler;
831 err |= __get_user(new_sa.sa.sa_flags, &act->sa_flags);
832 err |= get_sigset(&new_sa.sa.sa_mask, &act->sa_mask);
833 if (err)
834 return -EFAULT;
835 }
836
837 ret = do_sigaction(sig, act ? &new_sa : NULL, oact ? &old_sa : NULL);
838
839 if (!ret && oact) {
840 int err = 0;
841
842 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)))
843 return -EFAULT;
844
845 err |= __put_user((u32)(u64)old_sa.sa.sa_handler,
846 &oact->sa_handler);
847 err |= __put_user(old_sa.sa.sa_flags, &oact->sa_flags);
848 err |= put_sigset(&old_sa.sa.sa_mask, &oact->sa_mask);
849 if (err)
850 return -EFAULT;
851 }
852 out:
853 return ret;
854 }
855
856 asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t __user *set,
857 compat_sigset_t __user *oset, unsigned int sigsetsize)
858 {
859 sigset_t old_set, new_set;
860 int ret;
861 mm_segment_t old_fs = get_fs();
862
863 if (set && get_sigset(&new_set, set))
864 return -EFAULT;
865
866 set_fs (KERNEL_DS);
867 ret = sys_rt_sigprocmask(how, set ? (sigset_t __user *)&new_set : NULL,
868 oset ? (sigset_t __user *)&old_set : NULL,
869 sigsetsize);
870 set_fs (old_fs);
871
872 if (!ret && oset && put_sigset(&old_set, oset))
873 return -EFAULT;
874
875 return ret;
876 }
877
878 asmlinkage int sys32_rt_sigpending(compat_sigset_t __user *uset,
879 unsigned int sigsetsize)
880 {
881 int ret;
882 sigset_t set;
883 mm_segment_t old_fs = get_fs();
884
885 set_fs (KERNEL_DS);
886 ret = sys_rt_sigpending((sigset_t __user *)&set, sigsetsize);
887 set_fs (old_fs);
888
889 if (!ret && put_sigset(&set, uset))
890 return -EFAULT;
891
892 return ret;
893 }
894
895 asmlinkage int sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo)
896 {
897 siginfo_t info;
898 int ret;
899 mm_segment_t old_fs = get_fs();
900
901 if (copy_from_user (&info, uinfo, 3*sizeof(int)) ||
902 copy_from_user (info._sifields._pad, uinfo->_sifields._pad, SI_PAD_SIZE))
903 return -EFAULT;
904 set_fs (KERNEL_DS);
905 ret = sys_rt_sigqueueinfo(pid, sig, (siginfo_t __user *)&info);
906 set_fs (old_fs);
907 return ret;
908 }
909
910 asmlinkage long
911 sys32_waitid(int which, compat_pid_t pid,
912 compat_siginfo_t __user *uinfo, int options,
913 struct compat_rusage __user *uru)
914 {
915 siginfo_t info;
916 struct rusage ru;
917 long ret;
918 mm_segment_t old_fs = get_fs();
919
920 info.si_signo = 0;
921 set_fs (KERNEL_DS);
922 ret = sys_waitid(which, pid, (siginfo_t __user *) &info, options,
923 uru ? (struct rusage __user *) &ru : NULL);
924 set_fs (old_fs);
925
926 if (ret < 0 || info.si_signo == 0)
927 return ret;
928
929 if (uru && (ret = put_compat_rusage(&ru, uru)))
930 return ret;
931
932 BUG_ON(info.si_code & __SI_MASK);
933 info.si_code |= __SI_CHLD;
934 return copy_siginfo_to_user32(uinfo, &info);
935 }
This page took 0.081761 seconds and 6 git commands to generate.