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