Merge branches 'x86-cleanups-for-linus', 'x86-vmware-for-linus', 'x86-mtrr-for-linus...
[sfrench/cifs-2.6.git] / arch / x86 / kernel / xsave.c
index 37e68fc5e24a4daa33bcb6c730162a0969c91430..a4ae302f03aa8b93fc18c1e71cf0afe3a2f8af02 100644 (file)
@@ -36,15 +36,14 @@ int check_for_xstate(struct i387_fxsave_struct __user *buf,
 
        err = __copy_from_user(fx_sw_user, &buf->sw_reserved[0],
                               sizeof(struct _fpx_sw_bytes));
-
        if (err)
-               return err;
+               return -EFAULT;
 
        /*
         * First Magic check failed.
         */
        if (fx_sw_user->magic1 != FP_XSTATE_MAGIC1)
-               return -1;
+               return -EINVAL;
 
        /*
         * Check for error scenarios.
@@ -52,19 +51,21 @@ int check_for_xstate(struct i387_fxsave_struct __user *buf,
        if (fx_sw_user->xstate_size < min_xstate_size ||
            fx_sw_user->xstate_size > xstate_size ||
            fx_sw_user->xstate_size > fx_sw_user->extended_size)
-               return -1;
+               return -EINVAL;
 
        err = __get_user(magic2, (__u32 *) (((void *)fpstate) +
                                            fx_sw_user->extended_size -
                                            FP_XSTATE_MAGIC2_SIZE));
+       if (err)
+               return err;
        /*
         * Check for the presence of second magic word at the end of memory
         * layout. This detects the case where the user just copied the legacy
         * fpstate layout with out copying the extended state information
         * in the memory layout.
         */
-       if (err || magic2 != FP_XSTATE_MAGIC2)
-               return -1;
+       if (magic2 != FP_XSTATE_MAGIC2)
+               return -EFAULT;
 
        return 0;
 }
@@ -91,14 +92,6 @@ int save_i387_xstate(void __user *buf)
                return 0;
 
        if (task_thread_info(tsk)->status & TS_USEDFPU) {
-               /*
-                * Start with clearing the user buffer. This will present a
-                * clean context for the bytes not touched by the fxsave/xsave.
-                */
-               err = __clear_user(buf, sig_xstate_size);
-               if (err)
-                       return err;
-
                if (use_xsave())
                        err = xsave_user(buf);
                else
@@ -184,8 +177,8 @@ static int restore_user_xstate(void __user *buf)
         * init the state skipped by the user.
         */
        mask = pcntxt_mask & ~mask;
-
-       xrstor_state(init_xstate_buf, mask);
+       if (unlikely(mask))
+               xrstor_state(init_xstate_buf, mask);
 
        return 0;