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