|
@@ -597,13 +597,11 @@ int vfp_preserve_user_clear_hwstate(struct user_vfp __user *ufp,
|
|
|
}
|
|
|
|
|
|
/* Sanitise and restore the current VFP state from the provided structures. */
|
|
|
-int vfp_restore_user_hwstate(struct user_vfp __user *ufp,
|
|
|
- struct user_vfp_exc __user *ufp_exc)
|
|
|
+int vfp_restore_user_hwstate(struct user_vfp *ufp, struct user_vfp_exc *ufp_exc)
|
|
|
{
|
|
|
struct thread_info *thread = current_thread_info();
|
|
|
struct vfp_hard_struct *hwstate = &thread->vfpstate.hard;
|
|
|
unsigned long fpexc;
|
|
|
- int err = 0;
|
|
|
|
|
|
/* Disable VFP to avoid corrupting the new thread state. */
|
|
|
vfp_flush_hwstate(thread);
|
|
@@ -612,17 +610,16 @@ int vfp_restore_user_hwstate(struct user_vfp __user *ufp,
|
|
|
* Copy the floating point registers. There can be unused
|
|
|
* registers see asm/hwcap.h for details.
|
|
|
*/
|
|
|
- err |= __copy_from_user(&hwstate->fpregs, &ufp->fpregs,
|
|
|
- sizeof(hwstate->fpregs));
|
|
|
+ memcpy(&hwstate->fpregs, &ufp->fpregs, sizeof(hwstate->fpregs));
|
|
|
/*
|
|
|
* Copy the status and control register.
|
|
|
*/
|
|
|
- __get_user_error(hwstate->fpscr, &ufp->fpscr, err);
|
|
|
+ hwstate->fpscr = ufp->fpscr;
|
|
|
|
|
|
/*
|
|
|
* Sanitise and restore the exception registers.
|
|
|
*/
|
|
|
- __get_user_error(fpexc, &ufp_exc->fpexc, err);
|
|
|
+ fpexc = ufp_exc->fpexc;
|
|
|
|
|
|
/* Ensure the VFP is enabled. */
|
|
|
fpexc |= FPEXC_EN;
|
|
@@ -631,10 +628,10 @@ int vfp_restore_user_hwstate(struct user_vfp __user *ufp,
|
|
|
fpexc &= ~(FPEXC_EX | FPEXC_FP2V);
|
|
|
hwstate->fpexc = fpexc;
|
|
|
|
|
|
- __get_user_error(hwstate->fpinst, &ufp_exc->fpinst, err);
|
|
|
- __get_user_error(hwstate->fpinst2, &ufp_exc->fpinst2, err);
|
|
|
+ hwstate->fpinst = ufp_exc->fpinst;
|
|
|
+ hwstate->fpinst2 = ufp_exc->fpinst2;
|
|
|
|
|
|
- return err ? -EFAULT : 0;
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
/*
|