xref: /linux/arch/mips/kernel/signal32.c (revision cd354f1ae75e6466a7e31b727faede57a1f89ca5)
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 }
936