diff --git a/[refs] b/[refs] index ce861b4a9305..fa12dabfe382 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: efe44183f6bab5b8acb6a6182d95274978c8abb1 +refs/heads/master: 92d140e21f1ce8cf99320afbbcad73879128e6dc diff --git a/trunk/arch/x86/kernel/i387_64.c b/trunk/arch/x86/kernel/i387_64.c index 56c1f1147109..bfaff28fb134 100644 --- a/trunk/arch/x86/kernel/i387_64.c +++ b/trunk/arch/x86/kernel/i387_64.c @@ -92,13 +92,14 @@ int save_i387(struct _fpstate __user *buf) if (task_thread_info(tsk)->status & TS_USEDFPU) { err = save_i387_checking((struct i387_fxsave_struct __user *)buf); if (err) return err; + task_thread_info(tsk)->status &= ~TS_USEDFPU; stts(); - } else { - if (__copy_to_user(buf, &tsk->thread.i387.fxsave, + } else { + if (__copy_to_user(buf, &tsk->thread.i387.fxsave, sizeof(struct i387_fxsave_struct))) return -1; - } - return 1; + } + return 1; } /* diff --git a/trunk/include/asm-x86/i387_64.h b/trunk/include/asm-x86/i387_64.h index 0217b74cc9fc..3a4ffba3d6bc 100644 --- a/trunk/include/asm-x86/i387_64.h +++ b/trunk/include/asm-x86/i387_64.h @@ -203,6 +203,11 @@ static inline void save_init_fpu(struct task_struct *tsk) */ static inline int restore_i387(struct _fpstate __user *buf) { + set_used_math(); + if (!(task_thread_info(current)->status & TS_USEDFPU)) { + clts(); + task_thread_info(current)->status |= TS_USEDFPU; + } return restore_fpu_checking((__force struct i387_fxsave_struct *)buf); }