|
@@ -813,6 +813,28 @@ asmlinkage void __attribute__((weak)) smp_threshold_interrupt(void)
|
|
|
{
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * __math_state_restore assumes that cr0.TS is already clear and the
|
|
|
+ * fpu state is all ready for use. Used during context switch.
|
|
|
+ */
|
|
|
+void __math_state_restore(void)
|
|
|
+{
|
|
|
+ struct thread_info *thread = current_thread_info();
|
|
|
+ struct task_struct *tsk = thread->task;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Paranoid restore. send a SIGSEGV if we fail to restore the state.
|
|
|
+ */
|
|
|
+ if (unlikely(restore_fpu_checking(tsk))) {
|
|
|
+ stts();
|
|
|
+ force_sig(SIGSEGV, tsk);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ thread->status |= TS_USEDFPU; /* So we fnsave on switch_to() */
|
|
|
+ tsk->fpu_counter++;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* 'math_state_restore()' saves the current math information in the
|
|
|
* old math state array, and gets the new ones from the current task
|
|
@@ -844,17 +866,8 @@ asmlinkage void math_state_restore(void)
|
|
|
}
|
|
|
|
|
|
clts(); /* Allow maths ops (or we recurse) */
|
|
|
- /*
|
|
|
- * Paranoid restore. send a SIGSEGV if we fail to restore the state.
|
|
|
- */
|
|
|
- if (unlikely(restore_fpu_checking(tsk))) {
|
|
|
- stts();
|
|
|
- force_sig(SIGSEGV, tsk);
|
|
|
- return;
|
|
|
- }
|
|
|
|
|
|
- thread->status |= TS_USEDFPU; /* So we fnsave on switch_to() */
|
|
|
- tsk->fpu_counter++;
|
|
|
+ __math_state_restore();
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(math_state_restore);
|
|
|
|