|
@@ -77,8 +77,6 @@ static int preserve_iwmmxt_context(struct iwmmxt_sigframe __user *frame)
|
|
|
kframe->magic = IWMMXT_MAGIC;
|
|
|
kframe->size = IWMMXT_STORAGE_SIZE;
|
|
|
iwmmxt_task_copy(current_thread_info(), &kframe->storage);
|
|
|
-
|
|
|
- err = __copy_to_user(frame, kframe, sizeof(*frame));
|
|
|
} else {
|
|
|
/*
|
|
|
* For bug-compatibility with older kernels, some space
|
|
@@ -86,10 +84,14 @@ static int preserve_iwmmxt_context(struct iwmmxt_sigframe __user *frame)
|
|
|
* Set the magic and size appropriately so that properly
|
|
|
* written userspace can skip it reliably:
|
|
|
*/
|
|
|
- __put_user_error(DUMMY_MAGIC, &frame->magic, err);
|
|
|
- __put_user_error(IWMMXT_STORAGE_SIZE, &frame->size, err);
|
|
|
+ *kframe = (struct iwmmxt_sigframe) {
|
|
|
+ .magic = DUMMY_MAGIC,
|
|
|
+ .size = IWMMXT_STORAGE_SIZE,
|
|
|
+ };
|
|
|
}
|
|
|
|
|
|
+ err = __copy_to_user(frame, kframe, sizeof(*kframe));
|
|
|
+
|
|
|
return err;
|
|
|
}
|
|
|
|
|
@@ -135,17 +137,18 @@ static int restore_iwmmxt_context(char __user **auxp)
|
|
|
|
|
|
static int preserve_vfp_context(struct vfp_sigframe __user *frame)
|
|
|
{
|
|
|
- const unsigned long magic = VFP_MAGIC;
|
|
|
- const unsigned long size = VFP_STORAGE_SIZE;
|
|
|
+ struct vfp_sigframe kframe;
|
|
|
int err = 0;
|
|
|
|
|
|
- __put_user_error(magic, &frame->magic, err);
|
|
|
- __put_user_error(size, &frame->size, err);
|
|
|
+ memset(&kframe, 0, sizeof(kframe));
|
|
|
+ kframe.magic = VFP_MAGIC;
|
|
|
+ kframe.size = VFP_STORAGE_SIZE;
|
|
|
|
|
|
+ err = vfp_preserve_user_clear_hwstate(&kframe.ufp, &kframe.ufp_exc);
|
|
|
if (err)
|
|
|
- return -EFAULT;
|
|
|
+ return err;
|
|
|
|
|
|
- return vfp_preserve_user_clear_hwstate(&frame->ufp, &frame->ufp_exc);
|
|
|
+ return __copy_to_user(frame, &kframe, sizeof(kframe));
|
|
|
}
|
|
|
|
|
|
static int restore_vfp_context(char __user **auxp)
|
|
@@ -288,30 +291,35 @@ static int
|
|
|
setup_sigframe(struct sigframe __user *sf, struct pt_regs *regs, sigset_t *set)
|
|
|
{
|
|
|
struct aux_sigframe __user *aux;
|
|
|
+ struct sigcontext context;
|
|
|
int err = 0;
|
|
|
|
|
|
- __put_user_error(regs->ARM_r0, &sf->uc.uc_mcontext.arm_r0, err);
|
|
|
- __put_user_error(regs->ARM_r1, &sf->uc.uc_mcontext.arm_r1, err);
|
|
|
- __put_user_error(regs->ARM_r2, &sf->uc.uc_mcontext.arm_r2, err);
|
|
|
- __put_user_error(regs->ARM_r3, &sf->uc.uc_mcontext.arm_r3, err);
|
|
|
- __put_user_error(regs->ARM_r4, &sf->uc.uc_mcontext.arm_r4, err);
|
|
|
- __put_user_error(regs->ARM_r5, &sf->uc.uc_mcontext.arm_r5, err);
|
|
|
- __put_user_error(regs->ARM_r6, &sf->uc.uc_mcontext.arm_r6, err);
|
|
|
- __put_user_error(regs->ARM_r7, &sf->uc.uc_mcontext.arm_r7, err);
|
|
|
- __put_user_error(regs->ARM_r8, &sf->uc.uc_mcontext.arm_r8, err);
|
|
|
- __put_user_error(regs->ARM_r9, &sf->uc.uc_mcontext.arm_r9, err);
|
|
|
- __put_user_error(regs->ARM_r10, &sf->uc.uc_mcontext.arm_r10, err);
|
|
|
- __put_user_error(regs->ARM_fp, &sf->uc.uc_mcontext.arm_fp, err);
|
|
|
- __put_user_error(regs->ARM_ip, &sf->uc.uc_mcontext.arm_ip, err);
|
|
|
- __put_user_error(regs->ARM_sp, &sf->uc.uc_mcontext.arm_sp, err);
|
|
|
- __put_user_error(regs->ARM_lr, &sf->uc.uc_mcontext.arm_lr, err);
|
|
|
- __put_user_error(regs->ARM_pc, &sf->uc.uc_mcontext.arm_pc, err);
|
|
|
- __put_user_error(regs->ARM_cpsr, &sf->uc.uc_mcontext.arm_cpsr, err);
|
|
|
-
|
|
|
- __put_user_error(current->thread.trap_no, &sf->uc.uc_mcontext.trap_no, err);
|
|
|
- __put_user_error(current->thread.error_code, &sf->uc.uc_mcontext.error_code, err);
|
|
|
- __put_user_error(current->thread.address, &sf->uc.uc_mcontext.fault_address, err);
|
|
|
- __put_user_error(set->sig[0], &sf->uc.uc_mcontext.oldmask, err);
|
|
|
+ context = (struct sigcontext) {
|
|
|
+ .arm_r0 = regs->ARM_r0,
|
|
|
+ .arm_r1 = regs->ARM_r1,
|
|
|
+ .arm_r2 = regs->ARM_r2,
|
|
|
+ .arm_r3 = regs->ARM_r3,
|
|
|
+ .arm_r4 = regs->ARM_r4,
|
|
|
+ .arm_r5 = regs->ARM_r5,
|
|
|
+ .arm_r6 = regs->ARM_r6,
|
|
|
+ .arm_r7 = regs->ARM_r7,
|
|
|
+ .arm_r8 = regs->ARM_r8,
|
|
|
+ .arm_r9 = regs->ARM_r9,
|
|
|
+ .arm_r10 = regs->ARM_r10,
|
|
|
+ .arm_fp = regs->ARM_fp,
|
|
|
+ .arm_ip = regs->ARM_ip,
|
|
|
+ .arm_sp = regs->ARM_sp,
|
|
|
+ .arm_lr = regs->ARM_lr,
|
|
|
+ .arm_pc = regs->ARM_pc,
|
|
|
+ .arm_cpsr = regs->ARM_cpsr,
|
|
|
+
|
|
|
+ .trap_no = current->thread.trap_no,
|
|
|
+ .error_code = current->thread.error_code,
|
|
|
+ .fault_address = current->thread.address,
|
|
|
+ .oldmask = set->sig[0],
|
|
|
+ };
|
|
|
+
|
|
|
+ err |= __copy_to_user(&sf->uc.uc_mcontext, &context, sizeof(context));
|
|
|
|
|
|
err |= __copy_to_user(&sf->uc.uc_sigmask, set, sizeof(*set));
|
|
|
|
|
@@ -328,7 +336,7 @@ setup_sigframe(struct sigframe __user *sf, struct pt_regs *regs, sigset_t *set)
|
|
|
if (err == 0)
|
|
|
err |= preserve_vfp_context(&aux->vfp);
|
|
|
#endif
|
|
|
- __put_user_error(0, &aux->end_magic, err);
|
|
|
+ err |= __put_user(0, &aux->end_magic);
|
|
|
|
|
|
return err;
|
|
|
}
|
|
@@ -491,7 +499,7 @@ setup_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
|
|
|
/*
|
|
|
* Set uc.uc_flags to a value which sc.trap_no would never have.
|
|
|
*/
|
|
|
- __put_user_error(0x5ac3c35a, &frame->uc.uc_flags, err);
|
|
|
+ err = __put_user(0x5ac3c35a, &frame->uc.uc_flags);
|
|
|
|
|
|
err |= setup_sigframe(frame, regs, set);
|
|
|
if (err == 0)
|
|
@@ -511,8 +519,8 @@ setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
|
|
|
|
|
|
err |= copy_siginfo_to_user(&frame->info, &ksig->info);
|
|
|
|
|
|
- __put_user_error(0, &frame->sig.uc.uc_flags, err);
|
|
|
- __put_user_error(NULL, &frame->sig.uc.uc_link, err);
|
|
|
+ err |= __put_user(0, &frame->sig.uc.uc_flags);
|
|
|
+ err |= __put_user(NULL, &frame->sig.uc.uc_link);
|
|
|
|
|
|
err |= __save_altstack(&frame->sig.uc.uc_stack, regs->ARM_sp);
|
|
|
err |= setup_sigframe(&frame->sig, regs, set);
|