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
6 * Copyright (C) 1991, 1992 Linus Torvalds
7 * Copyright (C) 1994 - 2000, 2006 Ralf Baechle
8 * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
10 #include <linux/cache.h>
11 #include <linux/compat.h>
12 #include <linux/sched.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>
27 #include <asm/compat-signal.h>
28 #include <linux/bitops.h>
29 #include <asm/cacheflush.h>
31 #include <asm/ucontext.h>
37 #include "signal-common.h"
39 static int (*save_fp_context32)(struct sigcontext32 __user *sc);
40 static int (*restore_fp_context32)(struct sigcontext32 __user *sc);
42 extern asmlinkage int _save_fp_context32(struct sigcontext32 __user *sc);
43 extern asmlinkage int _restore_fp_context32(struct sigcontext32 __user *sc);
46 * Including <asm/unistd.h> would give use the 64-bit syscall numbers ...
48 #define __NR_O32_restart_syscall 4253
50 /* 32-bit compatibility types */
52 typedef unsigned int __sighandler32_t;
53 typedef void (*vfptr_t)(void);
58 compat_stack_t uc_stack;
59 struct sigcontext32 uc_mcontext;
60 compat_sigset_t uc_sigmask; /* mask last for extensibility */
64 u32 sf_ass[4]; /* argument save space for o32 */
65 u32 sf_pad[2]; /* Was: signal trampoline */
66 struct sigcontext32 sf_sc;
67 compat_sigset_t sf_mask;
70 struct rt_sigframe32 {
71 u32 rs_ass[4]; /* argument save space for o32 */
72 u32 rs_pad[2]; /* Was: signal trampoline */
73 compat_siginfo_t rs_info;
74 struct ucontext32 rs_uc;
78 * Thread saved context copy to/from a signal context presumed to be on the
79 * user stack, and therefore accessed with appropriate macros from uaccess.h.
81 static int copy_fp_to_sigcontext32(struct sigcontext32 __user *sc)
85 int inc = test_thread_flag(TIF_32BIT_FPREGS) ? 2 : 1;
87 for (i = 0; i < 32; i += inc) {
89 __put_user(get_fpr64(¤t->thread.fpu.fpr[i], 0),
92 err |= __put_user(current->thread.fpu.fcr31, &sc->sc_fpc_csr);
97 static int copy_fp_from_sigcontext32(struct sigcontext32 __user *sc)
101 int inc = test_thread_flag(TIF_32BIT_FPREGS) ? 2 : 1;
104 for (i = 0; i < 32; i += inc) {
105 err |= __get_user(fpr_val, &sc->sc_fpregs[i]);
106 set_fpr64(¤t->thread.fpu.fpr[i], 0, fpr_val);
108 err |= __get_user(current->thread.fpu.fcr31, &sc->sc_fpc_csr);
114 * sigcontext handlers
116 static int protected_save_fp_context32(struct sigcontext32 __user *sc)
121 err = own_fpu_inatomic(1);
123 err = save_fp_context32(sc); /* this might fail */
127 /* touch the sigcontext and try again */
128 err = __put_user(0, &sc->sc_fpregs[0]) |
129 __put_user(0, &sc->sc_fpregs[31]) |
130 __put_user(0, &sc->sc_fpc_csr);
132 break; /* really bad sigcontext */
137 static int protected_restore_fp_context32(struct sigcontext32 __user *sc)
139 int err, tmp __maybe_unused;
142 err = own_fpu_inatomic(0);
144 err = restore_fp_context32(sc); /* this might fail */
148 /* touch the sigcontext and try again */
149 err = __get_user(tmp, &sc->sc_fpregs[0]) |
150 __get_user(tmp, &sc->sc_fpregs[31]) |
151 __get_user(tmp, &sc->sc_fpc_csr);
153 break; /* really bad sigcontext */
158 static int setup_sigcontext32(struct pt_regs *regs,
159 struct sigcontext32 __user *sc)
165 err |= __put_user(regs->cp0_epc, &sc->sc_pc);
167 err |= __put_user(0, &sc->sc_regs[0]);
168 for (i = 1; i < 32; i++)
169 err |= __put_user(regs->regs[i], &sc->sc_regs[i]);
171 err |= __put_user(regs->hi, &sc->sc_mdhi);
172 err |= __put_user(regs->lo, &sc->sc_mdlo);
174 err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
175 err |= __put_user(mfhi1(), &sc->sc_hi1);
176 err |= __put_user(mflo1(), &sc->sc_lo1);
177 err |= __put_user(mfhi2(), &sc->sc_hi2);
178 err |= __put_user(mflo2(), &sc->sc_lo2);
179 err |= __put_user(mfhi3(), &sc->sc_hi3);
180 err |= __put_user(mflo3(), &sc->sc_lo3);
183 used_math = !!used_math();
184 err |= __put_user(used_math, &sc->sc_used_math);
188 * Save FPU state to signal context. Signal handler
189 * will "inherit" current FPU state.
191 err |= protected_save_fp_context32(sc);
197 check_and_restore_fp_context32(struct sigcontext32 __user *sc)
201 err = sig = fpcsr_pending(&sc->sc_fpc_csr);
204 err |= protected_restore_fp_context32(sc);
208 static int restore_sigcontext32(struct pt_regs *regs,
209 struct sigcontext32 __user *sc)
216 /* Always make any pending restarted system calls return -EINTR */
217 current_thread_info()->restart_block.fn = do_no_restart_syscall;
219 err |= __get_user(regs->cp0_epc, &sc->sc_pc);
220 err |= __get_user(regs->hi, &sc->sc_mdhi);
221 err |= __get_user(regs->lo, &sc->sc_mdlo);
223 err |= __get_user(treg, &sc->sc_hi1); mthi1(treg);
224 err |= __get_user(treg, &sc->sc_lo1); mtlo1(treg);
225 err |= __get_user(treg, &sc->sc_hi2); mthi2(treg);
226 err |= __get_user(treg, &sc->sc_lo2); mtlo2(treg);
227 err |= __get_user(treg, &sc->sc_hi3); mthi3(treg);
228 err |= __get_user(treg, &sc->sc_lo3); mtlo3(treg);
229 err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
232 for (i = 1; i < 32; i++)
233 err |= __get_user(regs->regs[i], &sc->sc_regs[i]);
235 err |= __get_user(used_math, &sc->sc_used_math);
236 conditional_used_math(used_math);
239 /* restore fpu context if we have used it before */
241 err = check_and_restore_fp_context32(sc);
243 /* signal handler may have used FPU. Give it up. */
253 extern void __put_sigset_unknown_nsig(void);
254 extern void __get_sigset_unknown_nsig(void);
256 static inline int put_sigset(const sigset_t *kbuf, compat_sigset_t __user *ubuf)
260 if (!access_ok(VERIFY_WRITE, ubuf, sizeof(*ubuf)))
263 switch (_NSIG_WORDS) {
265 __put_sigset_unknown_nsig();
267 err |= __put_user(kbuf->sig[1] >> 32, &ubuf->sig[3]);
268 err |= __put_user(kbuf->sig[1] & 0xffffffff, &ubuf->sig[2]);
270 err |= __put_user(kbuf->sig[0] >> 32, &ubuf->sig[1]);
271 err |= __put_user(kbuf->sig[0] & 0xffffffff, &ubuf->sig[0]);
277 static inline int get_sigset(sigset_t *kbuf, const compat_sigset_t __user *ubuf)
280 unsigned long sig[4];
282 if (!access_ok(VERIFY_READ, ubuf, sizeof(*ubuf)))
285 switch (_NSIG_WORDS) {
287 __get_sigset_unknown_nsig();
289 err |= __get_user(sig[3], &ubuf->sig[3]);
290 err |= __get_user(sig[2], &ubuf->sig[2]);
291 kbuf->sig[1] = sig[2] | (sig[3] << 32);
293 err |= __get_user(sig[1], &ubuf->sig[1]);
294 err |= __get_user(sig[0], &ubuf->sig[0]);
295 kbuf->sig[0] = sig[0] | (sig[1] << 32);
302 * Atomically swap in the new signal mask, and wait for a signal.
305 asmlinkage int sys32_sigsuspend(compat_sigset_t __user *uset)
307 return compat_sys_rt_sigsuspend(uset, sizeof(compat_sigset_t));
310 SYSCALL_DEFINE3(32_sigaction, long, sig, const struct compat_sigaction __user *, act,
311 struct compat_sigaction __user *, oact)
313 struct k_sigaction new_ka, old_ka;
321 if (!access_ok(VERIFY_READ, act, sizeof(*act)))
323 err |= __get_user(handler, &act->sa_handler);
324 new_ka.sa.sa_handler = (void __user *)(s64)handler;
325 err |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
326 err |= __get_user(mask, &act->sa_mask.sig[0]);
330 siginitset(&new_ka.sa.sa_mask, mask);
333 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
336 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)))
338 err |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
339 err |= __put_user((u32)(u64)old_ka.sa.sa_handler,
341 err |= __put_user(old_ka.sa.sa_mask.sig[0], oact->sa_mask.sig);
342 err |= __put_user(0, &oact->sa_mask.sig[1]);
343 err |= __put_user(0, &oact->sa_mask.sig[2]);
344 err |= __put_user(0, &oact->sa_mask.sig[3]);
352 int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from)
356 if (!access_ok (VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
359 /* If you change siginfo_t structure, please be sure
360 this code is fixed accordingly.
361 It should never copy any pad contained in the structure
362 to avoid security leaks, but must copy the generic
363 3 ints plus the relevant union member.
364 This routine must convert siginfo from 64bit to 32bit as well
366 err = __put_user(from->si_signo, &to->si_signo);
367 err |= __put_user(from->si_errno, &to->si_errno);
368 err |= __put_user((short)from->si_code, &to->si_code);
369 if (from->si_code < 0)
370 err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
372 switch (from->si_code >> 16) {
373 case __SI_TIMER >> 16:
374 err |= __put_user(from->si_tid, &to->si_tid);
375 err |= __put_user(from->si_overrun, &to->si_overrun);
376 err |= __put_user(from->si_int, &to->si_int);
378 case __SI_CHLD >> 16:
379 err |= __put_user(from->si_utime, &to->si_utime);
380 err |= __put_user(from->si_stime, &to->si_stime);
381 err |= __put_user(from->si_status, &to->si_status);
383 err |= __put_user(from->si_pid, &to->si_pid);
384 err |= __put_user(from->si_uid, &to->si_uid);
386 case __SI_FAULT >> 16:
387 err |= __put_user((unsigned long)from->si_addr, &to->si_addr);
389 case __SI_POLL >> 16:
390 err |= __put_user(from->si_band, &to->si_band);
391 err |= __put_user(from->si_fd, &to->si_fd);
393 case __SI_RT >> 16: /* This is not generated by the kernel as of now. */
394 case __SI_MESGQ >> 16:
395 err |= __put_user(from->si_pid, &to->si_pid);
396 err |= __put_user(from->si_uid, &to->si_uid);
397 err |= __put_user(from->si_int, &to->si_int);
404 int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
406 memset(to, 0, sizeof *to);
408 if (copy_from_user(to, from, 3*sizeof(int)) ||
409 copy_from_user(to->_sifields._pad,
410 from->_sifields._pad, SI_PAD_SIZE32))
416 asmlinkage void sys32_sigreturn(nabi_no_regargs struct pt_regs regs)
418 struct sigframe32 __user *frame;
422 frame = (struct sigframe32 __user *) regs.regs[29];
423 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
425 if (__copy_conv_sigset_from_user(&blocked, &frame->sf_mask))
428 set_current_blocked(&blocked);
430 sig = restore_sigcontext32(®s, &frame->sf_sc);
434 force_sig(sig, current);
437 * Don't let your children do this ...
439 __asm__ __volatile__(
447 force_sig(SIGSEGV, current);
450 asmlinkage void sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
452 struct rt_sigframe32 __user *frame;
456 frame = (struct rt_sigframe32 __user *) regs.regs[29];
457 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
459 if (__copy_conv_sigset_from_user(&set, &frame->rs_uc.uc_sigmask))
462 set_current_blocked(&set);
464 sig = restore_sigcontext32(®s, &frame->rs_uc.uc_mcontext);
468 force_sig(sig, current);
470 if (compat_restore_altstack(&frame->rs_uc.uc_stack))
474 * Don't let your children do this ...
476 __asm__ __volatile__(
484 force_sig(SIGSEGV, current);
487 static int setup_frame_32(void *sig_return, struct k_sigaction *ka,
488 struct pt_regs *regs, int signr, sigset_t *set)
490 struct sigframe32 __user *frame;
493 frame = get_sigframe(ka, regs, sizeof(*frame));
494 if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
497 err |= setup_sigcontext32(regs, &frame->sf_sc);
498 err |= __copy_conv_sigset_to_user(&frame->sf_mask, set);
504 * Arguments to signal handler:
507 * a1 = 0 (should be cause)
508 * a2 = pointer to struct sigcontext
510 * $25 and c0_epc point to the signal handler, $29 points to the
513 regs->regs[ 4] = signr;
515 regs->regs[ 6] = (unsigned long) &frame->sf_sc;
516 regs->regs[29] = (unsigned long) frame;
517 regs->regs[31] = (unsigned long) sig_return;
518 regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
520 DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
521 current->comm, current->pid,
522 frame, regs->cp0_epc, regs->regs[31]);
527 force_sigsegv(signr, current);
531 static int setup_rt_frame_32(void *sig_return, struct k_sigaction *ka,
532 struct pt_regs *regs, int signr, sigset_t *set,
535 struct rt_sigframe32 __user *frame;
538 frame = get_sigframe(ka, regs, sizeof(*frame));
539 if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
542 /* Convert (siginfo_t -> compat_siginfo_t) and copy to user. */
543 err |= copy_siginfo_to_user32(&frame->rs_info, info);
545 /* Create the ucontext. */
546 err |= __put_user(0, &frame->rs_uc.uc_flags);
547 err |= __put_user(0, &frame->rs_uc.uc_link);
548 err |= __compat_save_altstack(&frame->rs_uc.uc_stack, regs->regs[29]);
549 err |= setup_sigcontext32(regs, &frame->rs_uc.uc_mcontext);
550 err |= __copy_conv_sigset_to_user(&frame->rs_uc.uc_sigmask, set);
556 * Arguments to signal handler:
559 * a1 = 0 (should be cause)
560 * a2 = pointer to ucontext
562 * $25 and c0_epc point to the signal handler, $29 points to
563 * the struct rt_sigframe32.
565 regs->regs[ 4] = signr;
566 regs->regs[ 5] = (unsigned long) &frame->rs_info;
567 regs->regs[ 6] = (unsigned long) &frame->rs_uc;
568 regs->regs[29] = (unsigned long) frame;
569 regs->regs[31] = (unsigned long) sig_return;
570 regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
572 DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
573 current->comm, current->pid,
574 frame, regs->cp0_epc, regs->regs[31]);
579 force_sigsegv(signr, current);
584 * o32 compatibility on 64-bit kernels, without DSP ASE
586 struct mips_abi mips_abi_32 = {
587 .setup_frame = setup_frame_32,
588 .signal_return_offset =
589 offsetof(struct mips_vdso, o32_signal_trampoline),
590 .setup_rt_frame = setup_rt_frame_32,
591 .rt_signal_return_offset =
592 offsetof(struct mips_vdso, o32_rt_signal_trampoline),
593 .restart = __NR_O32_restart_syscall
596 static int signal32_init(void)
599 save_fp_context32 = _save_fp_context32;
600 restore_fp_context32 = _restore_fp_context32;
602 save_fp_context32 = copy_fp_to_sigcontext32;
603 restore_fp_context32 = copy_fp_from_sigcontext32;
609 arch_initcall(signal32_init);