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
);
45 extern asmlinkage
int fpu_emulator_save_context32(struct sigcontext32 __user
*sc
);
46 extern asmlinkage
int fpu_emulator_restore_context32(struct sigcontext32 __user
*sc
);
49 * Including <asm/unistd.h> would give use the 64-bit syscall numbers ...
51 #define __NR_O32_restart_syscall 4253
53 /* 32-bit compatibility types */
55 typedef unsigned int __sighandler32_t
;
56 typedef void (*vfptr_t
)(void);
59 unsigned int sa_flags
;
60 __sighandler32_t sa_handler
;
61 compat_sigset_t sa_mask
;
67 compat_stack_t uc_stack
;
68 struct sigcontext32 uc_mcontext
;
69 compat_sigset_t uc_sigmask
; /* mask last for extensibility */
73 u32 sf_ass
[4]; /* argument save space for o32 */
74 u32 sf_pad
[2]; /* Was: signal trampoline */
75 struct sigcontext32 sf_sc
;
76 compat_sigset_t sf_mask
;
79 struct rt_sigframe32
{
80 u32 rs_ass
[4]; /* argument save space for o32 */
81 u32 rs_pad
[2]; /* Was: signal trampoline */
82 compat_siginfo_t rs_info
;
83 struct ucontext32 rs_uc
;
89 static int protected_save_fp_context32(struct sigcontext32 __user
*sc
)
95 err
= save_fp_context32(sc
); /* this might fail */
99 /* touch the sigcontext and try again */
100 err
= __put_user(0, &sc
->sc_fpregs
[0]) |
101 __put_user(0, &sc
->sc_fpregs
[31]) |
102 __put_user(0, &sc
->sc_fpc_csr
);
104 break; /* really bad sigcontext */
109 static int protected_restore_fp_context32(struct sigcontext32 __user
*sc
)
111 int err
, tmp __maybe_unused
;
115 err
= restore_fp_context32(sc
); /* this might fail */
119 /* touch the sigcontext and try again */
120 err
= __get_user(tmp
, &sc
->sc_fpregs
[0]) |
121 __get_user(tmp
, &sc
->sc_fpregs
[31]) |
122 __get_user(tmp
, &sc
->sc_fpc_csr
);
124 break; /* really bad sigcontext */
129 static int setup_sigcontext32(struct pt_regs
*regs
,
130 struct sigcontext32 __user
*sc
)
136 err
|= __put_user(regs
->cp0_epc
, &sc
->sc_pc
);
138 err
|= __put_user(0, &sc
->sc_regs
[0]);
139 for (i
= 1; i
< 32; i
++)
140 err
|= __put_user(regs
->regs
[i
], &sc
->sc_regs
[i
]);
142 err
|= __put_user(regs
->hi
, &sc
->sc_mdhi
);
143 err
|= __put_user(regs
->lo
, &sc
->sc_mdlo
);
145 err
|= __put_user(rddsp(DSP_MASK
), &sc
->sc_dsp
);
146 err
|= __put_user(mfhi1(), &sc
->sc_hi1
);
147 err
|= __put_user(mflo1(), &sc
->sc_lo1
);
148 err
|= __put_user(mfhi2(), &sc
->sc_hi2
);
149 err
|= __put_user(mflo2(), &sc
->sc_lo2
);
150 err
|= __put_user(mfhi3(), &sc
->sc_hi3
);
151 err
|= __put_user(mflo3(), &sc
->sc_lo3
);
154 used_math
= !!used_math();
155 err
|= __put_user(used_math
, &sc
->sc_used_math
);
159 * Save FPU state to signal context. Signal handler
160 * will "inherit" current FPU state.
162 err
|= protected_save_fp_context32(sc
);
168 check_and_restore_fp_context32(struct sigcontext32 __user
*sc
)
172 err
= sig
= fpcsr_pending(&sc
->sc_fpc_csr
);
175 err
|= protected_restore_fp_context32(sc
);
179 static int restore_sigcontext32(struct pt_regs
*regs
,
180 struct sigcontext32 __user
*sc
)
187 /* Always make any pending restarted system calls return -EINTR */
188 current_thread_info()->restart_block
.fn
= do_no_restart_syscall
;
190 err
|= __get_user(regs
->cp0_epc
, &sc
->sc_pc
);
191 err
|= __get_user(regs
->hi
, &sc
->sc_mdhi
);
192 err
|= __get_user(regs
->lo
, &sc
->sc_mdlo
);
194 err
|= __get_user(treg
, &sc
->sc_hi1
); mthi1(treg
);
195 err
|= __get_user(treg
, &sc
->sc_lo1
); mtlo1(treg
);
196 err
|= __get_user(treg
, &sc
->sc_hi2
); mthi2(treg
);
197 err
|= __get_user(treg
, &sc
->sc_lo2
); mtlo2(treg
);
198 err
|= __get_user(treg
, &sc
->sc_hi3
); mthi3(treg
);
199 err
|= __get_user(treg
, &sc
->sc_lo3
); mtlo3(treg
);
200 err
|= __get_user(treg
, &sc
->sc_dsp
); wrdsp(treg
, DSP_MASK
);
203 for (i
= 1; i
< 32; i
++)
204 err
|= __get_user(regs
->regs
[i
], &sc
->sc_regs
[i
]);
206 err
|= __get_user(used_math
, &sc
->sc_used_math
);
207 conditional_used_math(used_math
);
210 /* restore fpu context if we have used it before */
212 err
= check_and_restore_fp_context32(sc
);
214 /* signal handler may have used FPU. Give it up. */
224 extern void __put_sigset_unknown_nsig(void);
225 extern void __get_sigset_unknown_nsig(void);
227 static inline int put_sigset(const sigset_t
*kbuf
, compat_sigset_t __user
*ubuf
)
231 if (!access_ok(VERIFY_WRITE
, ubuf
, sizeof(*ubuf
)))
234 switch (_NSIG_WORDS
) {
236 __put_sigset_unknown_nsig();
238 err
|= __put_user(kbuf
->sig
[1] >> 32, &ubuf
->sig
[3]);
239 err
|= __put_user(kbuf
->sig
[1] & 0xffffffff, &ubuf
->sig
[2]);
241 err
|= __put_user(kbuf
->sig
[0] >> 32, &ubuf
->sig
[1]);
242 err
|= __put_user(kbuf
->sig
[0] & 0xffffffff, &ubuf
->sig
[0]);
248 static inline int get_sigset(sigset_t
*kbuf
, const compat_sigset_t __user
*ubuf
)
251 unsigned long sig
[4];
253 if (!access_ok(VERIFY_READ
, ubuf
, sizeof(*ubuf
)))
256 switch (_NSIG_WORDS
) {
258 __get_sigset_unknown_nsig();
260 err
|= __get_user(sig
[3], &ubuf
->sig
[3]);
261 err
|= __get_user(sig
[2], &ubuf
->sig
[2]);
262 kbuf
->sig
[1] = sig
[2] | (sig
[3] << 32);
264 err
|= __get_user(sig
[1], &ubuf
->sig
[1]);
265 err
|= __get_user(sig
[0], &ubuf
->sig
[0]);
266 kbuf
->sig
[0] = sig
[0] | (sig
[1] << 32);
273 * Atomically swap in the new signal mask, and wait for a signal.
276 asmlinkage
int sys32_sigsuspend(compat_sigset_t __user
*uset
)
278 return compat_sys_rt_sigsuspend(uset
, sizeof(compat_sigset_t
));
281 SYSCALL_DEFINE3(32_sigaction
, long, sig
, const struct sigaction32 __user
*, act
,
282 struct sigaction32 __user
*, oact
)
284 struct k_sigaction new_ka
, old_ka
;
292 if (!access_ok(VERIFY_READ
, act
, sizeof(*act
)))
294 err
|= __get_user(handler
, &act
->sa_handler
);
295 new_ka
.sa
.sa_handler
= (void __user
*)(s64
)handler
;
296 err
|= __get_user(new_ka
.sa
.sa_flags
, &act
->sa_flags
);
297 err
|= __get_user(mask
, &act
->sa_mask
.sig
[0]);
301 siginitset(&new_ka
.sa
.sa_mask
, mask
);
304 ret
= do_sigaction(sig
, act
? &new_ka
: NULL
, oact
? &old_ka
: NULL
);
307 if (!access_ok(VERIFY_WRITE
, oact
, sizeof(*oact
)))
309 err
|= __put_user(old_ka
.sa
.sa_flags
, &oact
->sa_flags
);
310 err
|= __put_user((u32
)(u64
)old_ka
.sa
.sa_handler
,
312 err
|= __put_user(old_ka
.sa
.sa_mask
.sig
[0], oact
->sa_mask
.sig
);
313 err
|= __put_user(0, &oact
->sa_mask
.sig
[1]);
314 err
|= __put_user(0, &oact
->sa_mask
.sig
[2]);
315 err
|= __put_user(0, &oact
->sa_mask
.sig
[3]);
323 int copy_siginfo_to_user32(compat_siginfo_t __user
*to
, siginfo_t
*from
)
327 if (!access_ok (VERIFY_WRITE
, to
, sizeof(compat_siginfo_t
)))
330 /* If you change siginfo_t structure, please be sure
331 this code is fixed accordingly.
332 It should never copy any pad contained in the structure
333 to avoid security leaks, but must copy the generic
334 3 ints plus the relevant union member.
335 This routine must convert siginfo from 64bit to 32bit as well
337 err
= __put_user(from
->si_signo
, &to
->si_signo
);
338 err
|= __put_user(from
->si_errno
, &to
->si_errno
);
339 err
|= __put_user((short)from
->si_code
, &to
->si_code
);
340 if (from
->si_code
< 0)
341 err
|= __copy_to_user(&to
->_sifields
._pad
, &from
->_sifields
._pad
, SI_PAD_SIZE
);
343 switch (from
->si_code
>> 16) {
344 case __SI_TIMER
>> 16:
345 err
|= __put_user(from
->si_tid
, &to
->si_tid
);
346 err
|= __put_user(from
->si_overrun
, &to
->si_overrun
);
347 err
|= __put_user(from
->si_int
, &to
->si_int
);
349 case __SI_CHLD
>> 16:
350 err
|= __put_user(from
->si_utime
, &to
->si_utime
);
351 err
|= __put_user(from
->si_stime
, &to
->si_stime
);
352 err
|= __put_user(from
->si_status
, &to
->si_status
);
354 err
|= __put_user(from
->si_pid
, &to
->si_pid
);
355 err
|= __put_user(from
->si_uid
, &to
->si_uid
);
357 case __SI_FAULT
>> 16:
358 err
|= __put_user((unsigned long)from
->si_addr
, &to
->si_addr
);
360 case __SI_POLL
>> 16:
361 err
|= __put_user(from
->si_band
, &to
->si_band
);
362 err
|= __put_user(from
->si_fd
, &to
->si_fd
);
364 case __SI_RT
>> 16: /* This is not generated by the kernel as of now. */
365 case __SI_MESGQ
>> 16:
366 err
|= __put_user(from
->si_pid
, &to
->si_pid
);
367 err
|= __put_user(from
->si_uid
, &to
->si_uid
);
368 err
|= __put_user(from
->si_int
, &to
->si_int
);
375 int copy_siginfo_from_user32(siginfo_t
*to
, compat_siginfo_t __user
*from
)
377 memset(to
, 0, sizeof *to
);
379 if (copy_from_user(to
, from
, 3*sizeof(int)) ||
380 copy_from_user(to
->_sifields
._pad
,
381 from
->_sifields
._pad
, SI_PAD_SIZE32
))
387 asmlinkage
void sys32_sigreturn(nabi_no_regargs
struct pt_regs regs
)
389 struct sigframe32 __user
*frame
;
393 frame
= (struct sigframe32 __user
*) regs
.regs
[29];
394 if (!access_ok(VERIFY_READ
, frame
, sizeof(*frame
)))
396 if (__copy_conv_sigset_from_user(&blocked
, &frame
->sf_mask
))
399 set_current_blocked(&blocked
);
401 sig
= restore_sigcontext32(®s
, &frame
->sf_sc
);
405 force_sig(sig
, current
);
408 * Don't let your children do this ...
410 __asm__
__volatile__(
418 force_sig(SIGSEGV
, current
);
421 asmlinkage
void sys32_rt_sigreturn(nabi_no_regargs
struct pt_regs regs
)
423 struct rt_sigframe32 __user
*frame
;
427 frame
= (struct rt_sigframe32 __user
*) regs
.regs
[29];
428 if (!access_ok(VERIFY_READ
, frame
, sizeof(*frame
)))
430 if (__copy_conv_sigset_from_user(&set
, &frame
->rs_uc
.uc_sigmask
))
433 set_current_blocked(&set
);
435 sig
= restore_sigcontext32(®s
, &frame
->rs_uc
.uc_mcontext
);
439 force_sig(sig
, current
);
441 if (compat_restore_altstack(&frame
->rs_uc
.uc_stack
))
445 * Don't let your children do this ...
447 __asm__
__volatile__(
455 force_sig(SIGSEGV
, current
);
458 static int setup_frame_32(void *sig_return
, struct k_sigaction
*ka
,
459 struct pt_regs
*regs
, int signr
, sigset_t
*set
)
461 struct sigframe32 __user
*frame
;
464 frame
= get_sigframe(ka
, regs
, sizeof(*frame
));
465 if (!access_ok(VERIFY_WRITE
, frame
, sizeof (*frame
)))
468 err
|= setup_sigcontext32(regs
, &frame
->sf_sc
);
469 err
|= __copy_conv_sigset_to_user(&frame
->sf_mask
, set
);
475 * Arguments to signal handler:
478 * a1 = 0 (should be cause)
479 * a2 = pointer to struct sigcontext
481 * $25 and c0_epc point to the signal handler, $29 points to the
484 regs
->regs
[ 4] = signr
;
486 regs
->regs
[ 6] = (unsigned long) &frame
->sf_sc
;
487 regs
->regs
[29] = (unsigned long) frame
;
488 regs
->regs
[31] = (unsigned long) sig_return
;
489 regs
->cp0_epc
= regs
->regs
[25] = (unsigned long) ka
->sa
.sa_handler
;
491 DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
492 current
->comm
, current
->pid
,
493 frame
, regs
->cp0_epc
, regs
->regs
[31]);
498 force_sigsegv(signr
, current
);
502 static int setup_rt_frame_32(void *sig_return
, struct k_sigaction
*ka
,
503 struct pt_regs
*regs
, int signr
, sigset_t
*set
,
506 struct rt_sigframe32 __user
*frame
;
509 frame
= get_sigframe(ka
, regs
, sizeof(*frame
));
510 if (!access_ok(VERIFY_WRITE
, frame
, sizeof (*frame
)))
513 /* Convert (siginfo_t -> compat_siginfo_t) and copy to user. */
514 err
|= copy_siginfo_to_user32(&frame
->rs_info
, info
);
516 /* Create the ucontext. */
517 err
|= __put_user(0, &frame
->rs_uc
.uc_flags
);
518 err
|= __put_user(0, &frame
->rs_uc
.uc_link
);
519 err
|= __compat_save_altstack(&frame
->rs_uc
.uc_stack
, regs
->regs
[29]);
520 err
|= setup_sigcontext32(regs
, &frame
->rs_uc
.uc_mcontext
);
521 err
|= __copy_conv_sigset_to_user(&frame
->rs_uc
.uc_sigmask
, set
);
527 * Arguments to signal handler:
530 * a1 = 0 (should be cause)
531 * a2 = pointer to ucontext
533 * $25 and c0_epc point to the signal handler, $29 points to
534 * the struct rt_sigframe32.
536 regs
->regs
[ 4] = signr
;
537 regs
->regs
[ 5] = (unsigned long) &frame
->rs_info
;
538 regs
->regs
[ 6] = (unsigned long) &frame
->rs_uc
;
539 regs
->regs
[29] = (unsigned long) frame
;
540 regs
->regs
[31] = (unsigned long) sig_return
;
541 regs
->cp0_epc
= regs
->regs
[25] = (unsigned long) ka
->sa
.sa_handler
;
543 DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
544 current
->comm
, current
->pid
,
545 frame
, regs
->cp0_epc
, regs
->regs
[31]);
550 force_sigsegv(signr
, current
);
555 * o32 compatibility on 64-bit kernels, without DSP ASE
557 struct mips_abi mips_abi_32
= {
558 .setup_frame
= setup_frame_32
,
559 .signal_return_offset
=
560 offsetof(struct mips_vdso
, o32_signal_trampoline
),
561 .setup_rt_frame
= setup_rt_frame_32
,
562 .rt_signal_return_offset
=
563 offsetof(struct mips_vdso
, o32_rt_signal_trampoline
),
564 .restart
= __NR_O32_restart_syscall
567 SYSCALL_DEFINE4(32_rt_sigaction
, int, sig
,
568 const struct sigaction32 __user
*, act
,
569 struct sigaction32 __user
*, oact
, unsigned int, sigsetsize
)
571 struct k_sigaction new_sa
, old_sa
;
574 /* XXX: Don't preclude handling different sized sigset_t's. */
575 if (sigsetsize
!= sizeof(sigset_t
))
582 if (!access_ok(VERIFY_READ
, act
, sizeof(*act
)))
584 err
|= __get_user(handler
, &act
->sa_handler
);
585 new_sa
.sa
.sa_handler
= (void __user
*)(s64
)handler
;
586 err
|= __get_user(new_sa
.sa
.sa_flags
, &act
->sa_flags
);
587 err
|= get_sigset(&new_sa
.sa
.sa_mask
, &act
->sa_mask
);
592 ret
= do_sigaction(sig
, act
? &new_sa
: NULL
, oact
? &old_sa
: NULL
);
597 if (!access_ok(VERIFY_WRITE
, oact
, sizeof(*oact
)))
600 err
|= __put_user((u32
)(u64
)old_sa
.sa
.sa_handler
,
602 err
|= __put_user(old_sa
.sa
.sa_flags
, &oact
->sa_flags
);
603 err
|= put_sigset(&old_sa
.sa
.sa_mask
, &oact
->sa_mask
);
611 static int signal32_init(void)
614 save_fp_context32
= _save_fp_context32
;
615 restore_fp_context32
= _restore_fp_context32
;
617 save_fp_context32
= fpu_emulator_save_context32
;
618 restore_fp_context32
= fpu_emulator_restore_context32
;
624 arch_initcall(signal32_init
);