|
@@ -150,22 +150,18 @@ static int preserve_vfp_context(struct vfp_sigframe __user *frame)
|
|
|
|
|
|
static int restore_vfp_context(char __user **auxp)
|
|
|
{
|
|
|
- struct vfp_sigframe __user *frame =
|
|
|
- (struct vfp_sigframe __user *)*auxp;
|
|
|
- unsigned long magic;
|
|
|
- unsigned long size;
|
|
|
- int err = 0;
|
|
|
-
|
|
|
- __get_user_error(magic, &frame->magic, err);
|
|
|
- __get_user_error(size, &frame->size, err);
|
|
|
+ struct vfp_sigframe frame;
|
|
|
+ int err;
|
|
|
|
|
|
+ err = __copy_from_user(&frame, *auxp, sizeof(frame));
|
|
|
if (err)
|
|
|
- return -EFAULT;
|
|
|
- if (magic != VFP_MAGIC || size != VFP_STORAGE_SIZE)
|
|
|
+ return err;
|
|
|
+
|
|
|
+ if (frame.magic != VFP_MAGIC || frame.size != VFP_STORAGE_SIZE)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- *auxp += size;
|
|
|
- return vfp_restore_user_hwstate(&frame->ufp, &frame->ufp_exc);
|
|
|
+ *auxp += sizeof(frame);
|
|
|
+ return vfp_restore_user_hwstate(&frame.ufp, &frame.ufp_exc);
|
|
|
}
|
|
|
|
|
|
#endif
|
|
@@ -176,6 +172,7 @@ static int restore_vfp_context(char __user **auxp)
|
|
|
|
|
|
static int restore_sigframe(struct pt_regs *regs, struct sigframe __user *sf)
|
|
|
{
|
|
|
+ struct sigcontext context;
|
|
|
char __user *aux;
|
|
|
sigset_t set;
|
|
|
int err;
|
|
@@ -184,23 +181,26 @@ static int restore_sigframe(struct pt_regs *regs, struct sigframe __user *sf)
|
|
|
if (err == 0)
|
|
|
set_current_blocked(&set);
|
|
|
|
|
|
- __get_user_error(regs->ARM_r0, &sf->uc.uc_mcontext.arm_r0, err);
|
|
|
- __get_user_error(regs->ARM_r1, &sf->uc.uc_mcontext.arm_r1, err);
|
|
|
- __get_user_error(regs->ARM_r2, &sf->uc.uc_mcontext.arm_r2, err);
|
|
|
- __get_user_error(regs->ARM_r3, &sf->uc.uc_mcontext.arm_r3, err);
|
|
|
- __get_user_error(regs->ARM_r4, &sf->uc.uc_mcontext.arm_r4, err);
|
|
|
- __get_user_error(regs->ARM_r5, &sf->uc.uc_mcontext.arm_r5, err);
|
|
|
- __get_user_error(regs->ARM_r6, &sf->uc.uc_mcontext.arm_r6, err);
|
|
|
- __get_user_error(regs->ARM_r7, &sf->uc.uc_mcontext.arm_r7, err);
|
|
|
- __get_user_error(regs->ARM_r8, &sf->uc.uc_mcontext.arm_r8, err);
|
|
|
- __get_user_error(regs->ARM_r9, &sf->uc.uc_mcontext.arm_r9, err);
|
|
|
- __get_user_error(regs->ARM_r10, &sf->uc.uc_mcontext.arm_r10, err);
|
|
|
- __get_user_error(regs->ARM_fp, &sf->uc.uc_mcontext.arm_fp, err);
|
|
|
- __get_user_error(regs->ARM_ip, &sf->uc.uc_mcontext.arm_ip, err);
|
|
|
- __get_user_error(regs->ARM_sp, &sf->uc.uc_mcontext.arm_sp, err);
|
|
|
- __get_user_error(regs->ARM_lr, &sf->uc.uc_mcontext.arm_lr, err);
|
|
|
- __get_user_error(regs->ARM_pc, &sf->uc.uc_mcontext.arm_pc, err);
|
|
|
- __get_user_error(regs->ARM_cpsr, &sf->uc.uc_mcontext.arm_cpsr, err);
|
|
|
+ err |= __copy_from_user(&context, &sf->uc.uc_mcontext, sizeof(context));
|
|
|
+ if (err == 0) {
|
|
|
+ regs->ARM_r0 = context.arm_r0;
|
|
|
+ regs->ARM_r1 = context.arm_r1;
|
|
|
+ regs->ARM_r2 = context.arm_r2;
|
|
|
+ regs->ARM_r3 = context.arm_r3;
|
|
|
+ regs->ARM_r4 = context.arm_r4;
|
|
|
+ regs->ARM_r5 = context.arm_r5;
|
|
|
+ regs->ARM_r6 = context.arm_r6;
|
|
|
+ regs->ARM_r7 = context.arm_r7;
|
|
|
+ regs->ARM_r8 = context.arm_r8;
|
|
|
+ regs->ARM_r9 = context.arm_r9;
|
|
|
+ regs->ARM_r10 = context.arm_r10;
|
|
|
+ regs->ARM_fp = context.arm_fp;
|
|
|
+ regs->ARM_ip = context.arm_ip;
|
|
|
+ regs->ARM_sp = context.arm_sp;
|
|
|
+ regs->ARM_lr = context.arm_lr;
|
|
|
+ regs->ARM_pc = context.arm_pc;
|
|
|
+ regs->ARM_cpsr = context.arm_cpsr;
|
|
|
+ }
|
|
|
|
|
|
err |= !valid_user_regs(regs);
|
|
|
|