22 #include <linux/signal.h>
28 #include <asm/uaccess.h>
83 int __unused[32 - (
sizeof (compat_sigset_t) /
sizeof (
int))];
101 #define VFP_MAGIC 0x56465001
102 #define VFP_STORAGE_SIZE sizeof(struct compat_vfp_sigframe)
121 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
127 #define MOV_R7_NR_SIGRETURN (0xe3a07000 | __NR_compat_sigreturn)
128 #define SVC_SYS_SIGRETURN (0xef000000 | __NR_compat_sigreturn)
129 #define MOV_R7_NR_RT_SIGRETURN (0xe3a07000 | __NR_compat_rt_sigreturn)
130 #define SVC_SYS_RT_SIGRETURN (0xef000000 | __NR_compat_rt_sigreturn)
136 #define SVC_THUMB_SIGRETURN (((0xdf00 | __NR_compat_sigreturn) << 16) | \
137 0x2700 | __NR_compat_sigreturn)
138 #define SVC_THUMB_RT_SIGRETURN (((0xdf00 | __NR_compat_rt_sigreturn) << 16) | \
139 0x2700 | __NR_compat_rt_sigreturn)
151 static inline int put_sigset_t(compat_sigset_t __user *uset,
sigset_t *
set)
153 compat_sigset_t cset;
155 cset.sig[0] =
set->sig[0] & 0xffffffffull;
156 cset.sig[1] =
set->sig[0] >> 32;
161 static inline int get_sigset_t(
sigset_t *
set,
162 const compat_sigset_t __user *uset)
169 set->sig[0] = s32.sig[0] | (((
long)s32.sig[1]) << 32);
201 err |=
__put_user(from->si_overrun, &to->si_overrun);
206 err |=
__put_user(from->si_band, &to->si_band);
218 err |=
__put_user(from->si_addr_lsb, &to->si_addr_lsb);
224 err |=
__put_user(from->si_status, &to->si_status);
225 err |=
__put_user(from->si_utime, &to->si_utime);
226 err |=
__put_user(from->si_stime, &to->si_stime);
244 memset(to, 0,
sizeof *to);
282 sizeof(frame->ufp.fpregs));
285 fpscr = (fpsimd->
fpsr & VFP_FPSCR_STAT_MASK) |
286 (fpsimd->
fpcr & VFP_FPSCR_CTRL_MASK);
322 sizeof(frame->ufp.fpregs));
326 fpsimd.
fpsr = fpscr & VFP_FPSCR_STAT_MASK;
327 fpsimd.
fpcr = fpscr & VFP_FPSCR_CTRL_MASK;
350 siginitset(&
current->blocked, mask);
371 new_ka.
sa.sa_handler = compat_ptr(handler);
372 new_ka.
sa.sa_restorer = compat_ptr(restorer);
373 siginitset(&new_ka.
sa.sa_mask, mask);
381 &oact->sa_handler) ||
383 &oact->sa_restorer) ||
401 if (sigsetsize !=
sizeof(compat_sigset_t))
407 ret =
get_user(handler, &act->sa_handler);
408 new_ka.
sa.sa_handler = compat_ptr(handler);
409 ret |=
get_user(restorer, &act->sa_restorer);
410 new_ka.
sa.sa_restorer = compat_ptr(restorer);
411 ret |= get_sigset_t(&new_ka.
sa.sa_mask, &act->sa_mask);
419 ret =
put_user(ptr_to_compat(old_ka.
sa.sa_handler), &oact->sa_handler);
420 ret |= put_sigset_t(&oact->sa_mask, &old_ka.
sa.sa_mask);
438 if (
get_user(ss_sp, &newstack->ss_sp) ||
442 uss.
ss_sp = compat_ptr(ss_sp);
455 if (!ret && oldstack &&
463 static int compat_restore_sigframe(
struct pt_regs *
regs,
470 err = get_sigset_t(&
set, &sf->uc.uc_sigmask);
499 err |= !valid_user_regs(®s->
user_regs);
503 err |= compat_restore_vfp_context(&aux->
vfp);
520 if (regs->compat_sp & 7)
528 if (compat_restore_sigframe(regs, frame))
531 return regs->
regs[0];
554 if (regs->compat_sp & 7)
562 if (compat_restore_sigframe(regs, &frame->
sig))
566 ptr_to_compat((
void __user *)
NULL),
567 regs->compat_sp) == -
EFAULT)
570 return regs->
regs[0];
591 if ((ka->
sa.sa_flags &
SA_ONSTACK) && !sas_ss_flags(sp))
628 retcode = ptr_to_compat(ka->
sa.sa_restorer);
631 unsigned int idx = thumb << 1;
636 retcode = AARCH32_VECTORS_BASE +
637 AARCH32_KERN_SIGRET_CODE_OFFSET +
641 regs->
regs[0] = usig;
642 regs->compat_sp = ptr_to_compat(frame);
679 err |= put_sigset_t(&sf->uc.uc_sigmask,
set);
684 err |= compat_preserve_vfp_context(&aux->
vfp);
700 frame = compat_get_sigframe(ka, regs,
sizeof(*frame));
710 memset(&stack, 0,
sizeof(stack));
712 stack.
ss_flags = sas_ss_flags(regs->compat_sp);
716 err |= compat_setup_sigframe(&frame->
sig, regs,
set);
718 err = compat_setup_return(regs, ka, frame->
sig.retcode, frame,
735 frame = compat_get_sigframe(ka, regs,
sizeof(*frame));
742 err |= compat_setup_sigframe(frame, regs,
set);
744 err = compat_setup_return(regs, ka, frame->
retcode, frame, usig);
754 compat_sigset_t __user *oset,
763 if (get_sigset_t(&s,
set))
776 if (put_sigset_t(oset, &s))
794 if (put_sigset_t(
set, &s))