xref: /linux/arch/mips/kernel/signal32.c (revision 8fa5723aa7e053d498336b48448b292fc2e0458b)
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/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/suspend.h>
22 #include <linux/compiler.h>
23 #include <linux/uaccess.h>
24 
25 #include <asm/abi.h>
26 #include <asm/asm.h>
27 #include <asm/compat-signal.h>
28 #include <linux/bitops.h>
29 #include <asm/cacheflush.h>
30 #include <asm/sim.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 /*
39  * Including <asm/unistd.h> would give use the 64-bit syscall numbers ...
40  */
41 #define __NR_O32_sigreturn		4119
42 #define __NR_O32_rt_sigreturn		4193
43 #define __NR_O32_restart_syscall        4253
44 
45 /* 32-bit compatibility types */
46 
47 typedef unsigned int __sighandler32_t;
48 typedef void (*vfptr_t)(void);
49 
50 struct sigaction32 {
51 	unsigned int		sa_flags;
52 	__sighandler32_t	sa_handler;
53 	compat_sigset_t		sa_mask;
54 };
55 
56 /* IRIX compatible stack_t  */
57 typedef struct sigaltstack32 {
58 	s32 ss_sp;
59 	compat_size_t ss_size;
60 	int ss_flags;
61 } stack32_t;
62 
63 struct ucontext32 {
64 	u32                 uc_flags;
65 	s32                 uc_link;
66 	stack32_t           uc_stack;
67 	struct sigcontext32 uc_mcontext;
68 	compat_sigset_t     uc_sigmask;   /* mask last for extensibility */
69 };
70 
71 /*
72  * Horribly complicated - with the bloody RM9000 workarounds enabled
73  * the signal trampolines is moving to the end of the structure so we can
74  * increase the alignment without breaking software compatibility.
75  */
76 #if ICACHE_REFILLS_WORKAROUND_WAR == 0
77 
78 struct sigframe32 {
79 	u32 sf_ass[4];		/* argument save space for o32 */
80 	u32 sf_code[2];		/* signal trampoline */
81 	struct sigcontext32 sf_sc;
82 	compat_sigset_t sf_mask;
83 };
84 
85 struct rt_sigframe32 {
86 	u32 rs_ass[4];			/* argument save space for o32 */
87 	u32 rs_code[2];			/* signal trampoline */
88 	compat_siginfo_t rs_info;
89 	struct ucontext32 rs_uc;
90 };
91 
92 #else  /* ICACHE_REFILLS_WORKAROUND_WAR */
93 
94 struct sigframe32 {
95 	u32 sf_ass[4];			/* argument save space for o32 */
96 	u32 sf_pad[2];
97 	struct sigcontext32 sf_sc;	/* hw context */
98 	compat_sigset_t sf_mask;
99 	u32 sf_code[8] ____cacheline_aligned;	/* signal trampoline */
100 };
101 
102 struct rt_sigframe32 {
103 	u32 rs_ass[4];			/* argument save space for o32 */
104 	u32 rs_pad[2];
105 	compat_siginfo_t rs_info;
106 	struct ucontext32 rs_uc;
107 	u32 rs_code[8] __attribute__((aligned(32)));	/* signal trampoline */
108 };
109 
110 #endif	/* !ICACHE_REFILLS_WORKAROUND_WAR */
111 
112 /*
113  * sigcontext handlers
114  */
115 static int protected_save_fp_context32(struct sigcontext32 __user *sc)
116 {
117 	int err;
118 	while (1) {
119 		lock_fpu_owner();
120 		own_fpu_inatomic(1);
121 		err = save_fp_context32(sc); /* this might fail */
122 		unlock_fpu_owner();
123 		if (likely(!err))
124 			break;
125 		/* touch the sigcontext and try again */
126 		err = __put_user(0, &sc->sc_fpregs[0]) |
127 			__put_user(0, &sc->sc_fpregs[31]) |
128 			__put_user(0, &sc->sc_fpc_csr);
129 		if (err)
130 			break;	/* really bad sigcontext */
131 	}
132 	return err;
133 }
134 
135 static int protected_restore_fp_context32(struct sigcontext32 __user *sc)
136 {
137 	int err, tmp;
138 	while (1) {
139 		lock_fpu_owner();
140 		own_fpu_inatomic(0);
141 		err = restore_fp_context32(sc); /* this might fail */
142 		unlock_fpu_owner();
143 		if (likely(!err))
144 			break;
145 		/* touch the sigcontext and try again */
146 		err = __get_user(tmp, &sc->sc_fpregs[0]) |
147 			__get_user(tmp, &sc->sc_fpregs[31]) |
148 			__get_user(tmp, &sc->sc_fpc_csr);
149 		if (err)
150 			break;	/* really bad sigcontext */
151 	}
152 	return err;
153 }
154 
155 static int setup_sigcontext32(struct pt_regs *regs,
156 			      struct sigcontext32 __user *sc)
157 {
158 	int err = 0;
159 	int i;
160 	u32 used_math;
161 
162 	err |= __put_user(regs->cp0_epc, &sc->sc_pc);
163 
164 	err |= __put_user(0, &sc->sc_regs[0]);
165 	for (i = 1; i < 32; i++)
166 		err |= __put_user(regs->regs[i], &sc->sc_regs[i]);
167 
168 	err |= __put_user(regs->hi, &sc->sc_mdhi);
169 	err |= __put_user(regs->lo, &sc->sc_mdlo);
170 	if (cpu_has_dsp) {
171 		err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
172 		err |= __put_user(mfhi1(), &sc->sc_hi1);
173 		err |= __put_user(mflo1(), &sc->sc_lo1);
174 		err |= __put_user(mfhi2(), &sc->sc_hi2);
175 		err |= __put_user(mflo2(), &sc->sc_lo2);
176 		err |= __put_user(mfhi3(), &sc->sc_hi3);
177 		err |= __put_user(mflo3(), &sc->sc_lo3);
178 	}
179 
180 	used_math = !!used_math();
181 	err |= __put_user(used_math, &sc->sc_used_math);
182 
183 	if (used_math) {
184 		/*
185 		 * Save FPU state to signal context.  Signal handler
186 		 * will "inherit" current FPU state.
187 		 */
188 		err |= protected_save_fp_context32(sc);
189 	}
190 	return err;
191 }
192 
193 static int
194 check_and_restore_fp_context32(struct sigcontext32 __user *sc)
195 {
196 	int err, sig;
197 
198 	err = sig = fpcsr_pending(&sc->sc_fpc_csr);
199 	if (err > 0)
200 		err = 0;
201 	err |= protected_restore_fp_context32(sc);
202 	return err ?: sig;
203 }
204 
205 static int restore_sigcontext32(struct pt_regs *regs,
206 				struct sigcontext32 __user *sc)
207 {
208 	u32 used_math;
209 	int err = 0;
210 	s32 treg;
211 	int i;
212 
213 	/* Always make any pending restarted system calls return -EINTR */
214 	current_thread_info()->restart_block.fn = do_no_restart_syscall;
215 
216 	err |= __get_user(regs->cp0_epc, &sc->sc_pc);
217 	err |= __get_user(regs->hi, &sc->sc_mdhi);
218 	err |= __get_user(regs->lo, &sc->sc_mdlo);
219 	if (cpu_has_dsp) {
220 		err |= __get_user(treg, &sc->sc_hi1); mthi1(treg);
221 		err |= __get_user(treg, &sc->sc_lo1); mtlo1(treg);
222 		err |= __get_user(treg, &sc->sc_hi2); mthi2(treg);
223 		err |= __get_user(treg, &sc->sc_lo2); mtlo2(treg);
224 		err |= __get_user(treg, &sc->sc_hi3); mthi3(treg);
225 		err |= __get_user(treg, &sc->sc_lo3); mtlo3(treg);
226 		err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
227 	}
228 
229 	for (i = 1; i < 32; i++)
230 		err |= __get_user(regs->regs[i], &sc->sc_regs[i]);
231 
232 	err |= __get_user(used_math, &sc->sc_used_math);
233 	conditional_used_math(used_math);
234 
235 	if (used_math) {
236 		/* restore fpu context if we have used it before */
237 		if (!err)
238 			err = check_and_restore_fp_context32(sc);
239 	} else {
240 		/* signal handler may have used FPU.  Give it up. */
241 		lose_fpu(0);
242 	}
243 
244 	return err;
245 }
246 
247 /*
248  *
249  */
250 extern void __put_sigset_unknown_nsig(void);
251 extern void __get_sigset_unknown_nsig(void);
252 
253 static inline int put_sigset(const sigset_t *kbuf, compat_sigset_t __user *ubuf)
254 {
255 	int err = 0;
256 
257 	if (!access_ok(VERIFY_WRITE, ubuf, sizeof(*ubuf)))
258 		return -EFAULT;
259 
260 	switch (_NSIG_WORDS) {
261 	default:
262 		__put_sigset_unknown_nsig();
263 	case 2:
264 		err |= __put_user(kbuf->sig[1] >> 32, &ubuf->sig[3]);
265 		err |= __put_user(kbuf->sig[1] & 0xffffffff, &ubuf->sig[2]);
266 	case 1:
267 		err |= __put_user(kbuf->sig[0] >> 32, &ubuf->sig[1]);
268 		err |= __put_user(kbuf->sig[0] & 0xffffffff, &ubuf->sig[0]);
269 	}
270 
271 	return err;
272 }
273 
274 static inline int get_sigset(sigset_t *kbuf, const compat_sigset_t __user *ubuf)
275 {
276 	int err = 0;
277 	unsigned long sig[4];
278 
279 	if (!access_ok(VERIFY_READ, ubuf, sizeof(*ubuf)))
280 		return -EFAULT;
281 
282 	switch (_NSIG_WORDS) {
283 	default:
284 		__get_sigset_unknown_nsig();
285 	case 2:
286 		err |= __get_user(sig[3], &ubuf->sig[3]);
287 		err |= __get_user(sig[2], &ubuf->sig[2]);
288 		kbuf->sig[1] = sig[2] | (sig[3] << 32);
289 	case 1:
290 		err |= __get_user(sig[1], &ubuf->sig[1]);
291 		err |= __get_user(sig[0], &ubuf->sig[0]);
292 		kbuf->sig[0] = sig[0] | (sig[1] << 32);
293 	}
294 
295 	return err;
296 }
297 
298 /*
299  * Atomically swap in the new signal mask, and wait for a signal.
300  */
301 
302 asmlinkage int sys32_sigsuspend(nabi_no_regargs struct pt_regs regs)
303 {
304 	compat_sigset_t __user *uset;
305 	sigset_t newset;
306 
307 	uset = (compat_sigset_t __user *) regs.regs[4];
308 	if (get_sigset(&newset, uset))
309 		return -EFAULT;
310 	sigdelsetmask(&newset, ~_BLOCKABLE);
311 
312 	spin_lock_irq(&current->sighand->siglock);
313 	current->saved_sigmask = current->blocked;
314 	current->blocked = newset;
315 	recalc_sigpending();
316 	spin_unlock_irq(&current->sighand->siglock);
317 
318 	current->state = TASK_INTERRUPTIBLE;
319 	schedule();
320 	set_thread_flag(TIF_RESTORE_SIGMASK);
321 	return -ERESTARTNOHAND;
322 }
323 
324 asmlinkage int sys32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
325 {
326 	compat_sigset_t __user *uset;
327 	sigset_t newset;
328 	size_t sigsetsize;
329 
330 	/* XXX Don't preclude handling different sized sigset_t's.  */
331 	sigsetsize = regs.regs[5];
332 	if (sigsetsize != sizeof(compat_sigset_t))
333 		return -EINVAL;
334 
335 	uset = (compat_sigset_t __user *) regs.regs[4];
336 	if (get_sigset(&newset, uset))
337 		return -EFAULT;
338 	sigdelsetmask(&newset, ~_BLOCKABLE);
339 
340 	spin_lock_irq(&current->sighand->siglock);
341 	current->saved_sigmask = current->blocked;
342 	current->blocked = newset;
343 	recalc_sigpending();
344 	spin_unlock_irq(&current->sighand->siglock);
345 
346 	current->state = TASK_INTERRUPTIBLE;
347 	schedule();
348 	set_thread_flag(TIF_RESTORE_SIGMASK);
349 	return -ERESTARTNOHAND;
350 }
351 
352 asmlinkage int sys32_sigaction(int sig, const struct sigaction32 __user *act,
353                                struct sigaction32 __user *oact)
354 {
355 	struct k_sigaction new_ka, old_ka;
356 	int ret;
357 	int err = 0;
358 
359 	if (act) {
360 		old_sigset_t mask;
361 		s32 handler;
362 
363 		if (!access_ok(VERIFY_READ, act, sizeof(*act)))
364 			return -EFAULT;
365 		err |= __get_user(handler, &act->sa_handler);
366 		new_ka.sa.sa_handler = (void __user *)(s64)handler;
367 		err |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
368 		err |= __get_user(mask, &act->sa_mask.sig[0]);
369 		if (err)
370 			return -EFAULT;
371 
372 		siginitset(&new_ka.sa.sa_mask, mask);
373 	}
374 
375 	ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
376 
377 	if (!ret && oact) {
378 		if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)))
379 			return -EFAULT;
380 		err |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
381 		err |= __put_user((u32)(u64)old_ka.sa.sa_handler,
382 		                  &oact->sa_handler);
383 		err |= __put_user(old_ka.sa.sa_mask.sig[0], oact->sa_mask.sig);
384 		err |= __put_user(0, &oact->sa_mask.sig[1]);
385 		err |= __put_user(0, &oact->sa_mask.sig[2]);
386 		err |= __put_user(0, &oact->sa_mask.sig[3]);
387 		if (err)
388 			return -EFAULT;
389 	}
390 
391 	return ret;
392 }
393 
394 asmlinkage int sys32_sigaltstack(nabi_no_regargs struct pt_regs regs)
395 {
396 	const stack32_t __user *uss = (const stack32_t __user *) regs.regs[4];
397 	stack32_t __user *uoss = (stack32_t __user *) regs.regs[5];
398 	unsigned long usp = regs.regs[29];
399 	stack_t kss, koss;
400 	int ret, err = 0;
401 	mm_segment_t old_fs = get_fs();
402 	s32 sp;
403 
404 	if (uss) {
405 		if (!access_ok(VERIFY_READ, uss, sizeof(*uss)))
406 			return -EFAULT;
407 		err |= __get_user(sp, &uss->ss_sp);
408 		kss.ss_sp = (void __user *) (long) sp;
409 		err |= __get_user(kss.ss_size, &uss->ss_size);
410 		err |= __get_user(kss.ss_flags, &uss->ss_flags);
411 		if (err)
412 			return -EFAULT;
413 	}
414 
415 	set_fs(KERNEL_DS);
416 	ret = do_sigaltstack(uss ? (stack_t __user *)&kss : NULL,
417 			     uoss ? (stack_t __user *)&koss : NULL, usp);
418 	set_fs(old_fs);
419 
420 	if (!ret && uoss) {
421 		if (!access_ok(VERIFY_WRITE, uoss, sizeof(*uoss)))
422 			return -EFAULT;
423 		sp = (int) (unsigned long) koss.ss_sp;
424 		err |= __put_user(sp, &uoss->ss_sp);
425 		err |= __put_user(koss.ss_size, &uoss->ss_size);
426 		err |= __put_user(koss.ss_flags, &uoss->ss_flags);
427 		if (err)
428 			return -EFAULT;
429 	}
430 	return ret;
431 }
432 
433 int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
434 {
435 	int err;
436 
437 	if (!access_ok (VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
438 		return -EFAULT;
439 
440 	/* If you change siginfo_t structure, please be sure
441 	   this code is fixed accordingly.
442 	   It should never copy any pad contained in the structure
443 	   to avoid security leaks, but must copy the generic
444 	   3 ints plus the relevant union member.
445 	   This routine must convert siginfo from 64bit to 32bit as well
446 	   at the same time.  */
447 	err = __put_user(from->si_signo, &to->si_signo);
448 	err |= __put_user(from->si_errno, &to->si_errno);
449 	err |= __put_user((short)from->si_code, &to->si_code);
450 	if (from->si_code < 0)
451 		err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
452 	else {
453 		switch (from->si_code >> 16) {
454 		case __SI_TIMER >> 16:
455 			err |= __put_user(from->si_tid, &to->si_tid);
456 			err |= __put_user(from->si_overrun, &to->si_overrun);
457 			err |= __put_user(from->si_int, &to->si_int);
458 			break;
459 		case __SI_CHLD >> 16:
460 			err |= __put_user(from->si_utime, &to->si_utime);
461 			err |= __put_user(from->si_stime, &to->si_stime);
462 			err |= __put_user(from->si_status, &to->si_status);
463 		default:
464 			err |= __put_user(from->si_pid, &to->si_pid);
465 			err |= __put_user(from->si_uid, &to->si_uid);
466 			break;
467 		case __SI_FAULT >> 16:
468 			err |= __put_user((unsigned long)from->si_addr, &to->si_addr);
469 			break;
470 		case __SI_POLL >> 16:
471 			err |= __put_user(from->si_band, &to->si_band);
472 			err |= __put_user(from->si_fd, &to->si_fd);
473 			break;
474 		case __SI_RT >> 16: /* This is not generated by the kernel as of now.  */
475 		case __SI_MESGQ >> 16:
476 			err |= __put_user(from->si_pid, &to->si_pid);
477 			err |= __put_user(from->si_uid, &to->si_uid);
478 			err |= __put_user(from->si_int, &to->si_int);
479 			break;
480 		}
481 	}
482 	return err;
483 }
484 
485 int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
486 {
487 	memset(to, 0, sizeof *to);
488 
489 	if (copy_from_user(to, from, 3*sizeof(int)) ||
490 	    copy_from_user(to->_sifields._pad,
491 			   from->_sifields._pad, SI_PAD_SIZE32))
492 		return -EFAULT;
493 
494 	return 0;
495 }
496 
497 asmlinkage void sys32_sigreturn(nabi_no_regargs struct pt_regs regs)
498 {
499 	struct sigframe32 __user *frame;
500 	sigset_t blocked;
501 	int sig;
502 
503 	frame = (struct sigframe32 __user *) regs.regs[29];
504 	if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
505 		goto badframe;
506 	if (__copy_conv_sigset_from_user(&blocked, &frame->sf_mask))
507 		goto badframe;
508 
509 	sigdelsetmask(&blocked, ~_BLOCKABLE);
510 	spin_lock_irq(&current->sighand->siglock);
511 	current->blocked = blocked;
512 	recalc_sigpending();
513 	spin_unlock_irq(&current->sighand->siglock);
514 
515 	sig = restore_sigcontext32(&regs, &frame->sf_sc);
516 	if (sig < 0)
517 		goto badframe;
518 	else if (sig)
519 		force_sig(sig, current);
520 
521 	/*
522 	 * Don't let your children do this ...
523 	 */
524 	__asm__ __volatile__(
525 		"move\t$29, %0\n\t"
526 		"j\tsyscall_exit"
527 		:/* no outputs */
528 		:"r" (&regs));
529 	/* Unreached */
530 
531 badframe:
532 	force_sig(SIGSEGV, current);
533 }
534 
535 asmlinkage void sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
536 {
537 	struct rt_sigframe32 __user *frame;
538 	mm_segment_t old_fs;
539 	sigset_t set;
540 	stack_t st;
541 	s32 sp;
542 	int sig;
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_conv_sigset_from_user(&set, &frame->rs_uc.uc_sigmask))
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 	sig = restore_sigcontext32(&regs, &frame->rs_uc.uc_mcontext);
557 	if (sig < 0)
558 		goto badframe;
559 	else if (sig)
560 		force_sig(sig, current);
561 
562 	/* The ucontext contains a stack32_t, so we must convert!  */
563 	if (__get_user(sp, &frame->rs_uc.uc_stack.ss_sp))
564 		goto badframe;
565 	st.ss_sp = (void __user *)(long) sp;
566 	if (__get_user(st.ss_size, &frame->rs_uc.uc_stack.ss_size))
567 		goto badframe;
568 	if (__get_user(st.ss_flags, &frame->rs_uc.uc_stack.ss_flags))
569 		goto badframe;
570 
571 	/* It is more difficult to avoid calling this function than to
572 	   call it and ignore errors.  */
573 	old_fs = get_fs();
574 	set_fs(KERNEL_DS);
575 	do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]);
576 	set_fs(old_fs);
577 
578 	/*
579 	 * Don't let your children do this ...
580 	 */
581 	__asm__ __volatile__(
582 		"move\t$29, %0\n\t"
583 		"j\tsyscall_exit"
584 		:/* no outputs */
585 		:"r" (&regs));
586 	/* Unreached */
587 
588 badframe:
589 	force_sig(SIGSEGV, current);
590 }
591 
592 static int setup_frame_32(struct k_sigaction * ka, struct pt_regs *regs,
593 	int signr, sigset_t *set)
594 {
595 	struct sigframe32 __user *frame;
596 	int err = 0;
597 
598 	frame = get_sigframe(ka, regs, sizeof(*frame));
599 	if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
600 		goto give_sigsegv;
601 
602 	err |= install_sigtramp(frame->sf_code, __NR_O32_sigreturn);
603 
604 	err |= setup_sigcontext32(regs, &frame->sf_sc);
605 	err |= __copy_conv_sigset_to_user(&frame->sf_mask, set);
606 
607 	if (err)
608 		goto give_sigsegv;
609 
610 	/*
611 	 * Arguments to signal handler:
612 	 *
613 	 *   a0 = signal number
614 	 *   a1 = 0 (should be cause)
615 	 *   a2 = pointer to struct sigcontext
616 	 *
617 	 * $25 and c0_epc point to the signal handler, $29 points to the
618 	 * struct sigframe.
619 	 */
620 	regs->regs[ 4] = signr;
621 	regs->regs[ 5] = 0;
622 	regs->regs[ 6] = (unsigned long) &frame->sf_sc;
623 	regs->regs[29] = (unsigned long) frame;
624 	regs->regs[31] = (unsigned long) frame->sf_code;
625 	regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
626 
627 	DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
628 	       current->comm, current->pid,
629 	       frame, regs->cp0_epc, regs->regs[31]);
630 
631 	return 0;
632 
633 give_sigsegv:
634 	force_sigsegv(signr, current);
635 	return -EFAULT;
636 }
637 
638 static int setup_rt_frame_32(struct k_sigaction * ka, struct pt_regs *regs,
639 	int signr, sigset_t *set, siginfo_t *info)
640 {
641 	struct rt_sigframe32 __user *frame;
642 	int err = 0;
643 	s32 sp;
644 
645 	frame = get_sigframe(ka, regs, sizeof(*frame));
646 	if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
647 		goto give_sigsegv;
648 
649 	err |= install_sigtramp(frame->rs_code, __NR_O32_rt_sigreturn);
650 
651 	/* Convert (siginfo_t -> compat_siginfo_t) and copy to user. */
652 	err |= copy_siginfo_to_user32(&frame->rs_info, info);
653 
654 	/* Create the ucontext.  */
655 	err |= __put_user(0, &frame->rs_uc.uc_flags);
656 	err |= __put_user(0, &frame->rs_uc.uc_link);
657 	sp = (int) (long) current->sas_ss_sp;
658 	err |= __put_user(sp,
659 	                  &frame->rs_uc.uc_stack.ss_sp);
660 	err |= __put_user(sas_ss_flags(regs->regs[29]),
661 	                  &frame->rs_uc.uc_stack.ss_flags);
662 	err |= __put_user(current->sas_ss_size,
663 	                  &frame->rs_uc.uc_stack.ss_size);
664 	err |= setup_sigcontext32(regs, &frame->rs_uc.uc_mcontext);
665 	err |= __copy_conv_sigset_to_user(&frame->rs_uc.uc_sigmask, set);
666 
667 	if (err)
668 		goto give_sigsegv;
669 
670 	/*
671 	 * Arguments to signal handler:
672 	 *
673 	 *   a0 = signal number
674 	 *   a1 = 0 (should be cause)
675 	 *   a2 = pointer to ucontext
676 	 *
677 	 * $25 and c0_epc point to the signal handler, $29 points to
678 	 * the struct rt_sigframe32.
679 	 */
680 	regs->regs[ 4] = signr;
681 	regs->regs[ 5] = (unsigned long) &frame->rs_info;
682 	regs->regs[ 6] = (unsigned long) &frame->rs_uc;
683 	regs->regs[29] = (unsigned long) frame;
684 	regs->regs[31] = (unsigned long) frame->rs_code;
685 	regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
686 
687 	DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
688 	       current->comm, current->pid,
689 	       frame, regs->cp0_epc, regs->regs[31]);
690 
691 	return 0;
692 
693 give_sigsegv:
694 	force_sigsegv(signr, current);
695 	return -EFAULT;
696 }
697 
698 /*
699  * o32 compatibility on 64-bit kernels, without DSP ASE
700  */
701 struct mips_abi mips_abi_32 = {
702 	.setup_frame	= setup_frame_32,
703 	.setup_rt_frame	= setup_rt_frame_32,
704 	.restart	= __NR_O32_restart_syscall
705 };
706 
707 asmlinkage int sys32_rt_sigaction(int sig, const struct sigaction32 __user *act,
708 				  struct sigaction32 __user *oact,
709 				  unsigned int sigsetsize)
710 {
711 	struct k_sigaction new_sa, old_sa;
712 	int ret = -EINVAL;
713 
714 	/* XXX: Don't preclude handling different sized sigset_t's.  */
715 	if (sigsetsize != sizeof(sigset_t))
716 		goto out;
717 
718 	if (act) {
719 		s32 handler;
720 		int err = 0;
721 
722 		if (!access_ok(VERIFY_READ, act, sizeof(*act)))
723 			return -EFAULT;
724 		err |= __get_user(handler, &act->sa_handler);
725 		new_sa.sa.sa_handler = (void __user *)(s64)handler;
726 		err |= __get_user(new_sa.sa.sa_flags, &act->sa_flags);
727 		err |= get_sigset(&new_sa.sa.sa_mask, &act->sa_mask);
728 		if (err)
729 			return -EFAULT;
730 	}
731 
732 	ret = do_sigaction(sig, act ? &new_sa : NULL, oact ? &old_sa : NULL);
733 
734 	if (!ret && oact) {
735 		int err = 0;
736 
737 		if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)))
738 			return -EFAULT;
739 
740 		err |= __put_user((u32)(u64)old_sa.sa.sa_handler,
741 		                   &oact->sa_handler);
742 		err |= __put_user(old_sa.sa.sa_flags, &oact->sa_flags);
743 		err |= put_sigset(&old_sa.sa.sa_mask, &oact->sa_mask);
744 		if (err)
745 			return -EFAULT;
746 	}
747 out:
748 	return ret;
749 }
750 
751 asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t __user *set,
752 	compat_sigset_t __user *oset, unsigned int sigsetsize)
753 {
754 	sigset_t old_set, new_set;
755 	int ret;
756 	mm_segment_t old_fs = get_fs();
757 
758 	if (set && get_sigset(&new_set, set))
759 		return -EFAULT;
760 
761 	set_fs(KERNEL_DS);
762 	ret = sys_rt_sigprocmask(how, set ? (sigset_t __user *)&new_set : NULL,
763 				 oset ? (sigset_t __user *)&old_set : NULL,
764 				 sigsetsize);
765 	set_fs(old_fs);
766 
767 	if (!ret && oset && put_sigset(&old_set, oset))
768 		return -EFAULT;
769 
770 	return ret;
771 }
772 
773 asmlinkage int sys32_rt_sigpending(compat_sigset_t __user *uset,
774 	unsigned int sigsetsize)
775 {
776 	int ret;
777 	sigset_t set;
778 	mm_segment_t old_fs = get_fs();
779 
780 	set_fs(KERNEL_DS);
781 	ret = sys_rt_sigpending((sigset_t __user *)&set, sigsetsize);
782 	set_fs(old_fs);
783 
784 	if (!ret && put_sigset(&set, uset))
785 		return -EFAULT;
786 
787 	return ret;
788 }
789 
790 asmlinkage int sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo)
791 {
792 	siginfo_t info;
793 	int ret;
794 	mm_segment_t old_fs = get_fs();
795 
796 	if (copy_from_user(&info, uinfo, 3*sizeof(int)) ||
797 	    copy_from_user(info._sifields._pad, uinfo->_sifields._pad, SI_PAD_SIZE))
798 		return -EFAULT;
799 	set_fs(KERNEL_DS);
800 	ret = sys_rt_sigqueueinfo(pid, sig, (siginfo_t __user *)&info);
801 	set_fs(old_fs);
802 	return ret;
803 }
804 
805 asmlinkage long
806 sys32_waitid(int which, compat_pid_t pid,
807 	     compat_siginfo_t __user *uinfo, int options,
808 	     struct compat_rusage __user *uru)
809 {
810 	siginfo_t info;
811 	struct rusage ru;
812 	long ret;
813 	mm_segment_t old_fs = get_fs();
814 
815 	info.si_signo = 0;
816 	set_fs(KERNEL_DS);
817 	ret = sys_waitid(which, pid, (siginfo_t __user *) &info, options,
818 			 uru ? (struct rusage __user *) &ru : NULL);
819 	set_fs(old_fs);
820 
821 	if (ret < 0 || info.si_signo == 0)
822 		return ret;
823 
824 	if (uru && (ret = put_compat_rusage(&ru, uru)))
825 		return ret;
826 
827 	BUG_ON(info.si_code & __SI_MASK);
828 	info.si_code |= __SI_CHLD;
829 	return copy_siginfo_to_user32(uinfo, &info);
830 }
831