|
@@ -367,6 +367,23 @@ void giveup_all(struct task_struct *tsk)
|
|
|
}
|
|
|
EXPORT_SYMBOL(giveup_all);
|
|
|
|
|
|
+void flush_all_to_thread(struct task_struct *tsk)
|
|
|
+{
|
|
|
+ if (tsk->thread.regs) {
|
|
|
+ preempt_disable();
|
|
|
+ BUG_ON(tsk != current);
|
|
|
+ giveup_all(tsk);
|
|
|
+
|
|
|
+#ifdef CONFIG_SPE
|
|
|
+ if (tsk->thread.regs->msr & MSR_SPE)
|
|
|
+ tsk->thread.spefscr = mfspr(SPRN_SPEFSCR);
|
|
|
+#endif
|
|
|
+
|
|
|
+ preempt_enable();
|
|
|
+ }
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(flush_all_to_thread);
|
|
|
+
|
|
|
#ifdef CONFIG_PPC_ADV_DEBUG_REGS
|
|
|
void do_send_trap(struct pt_regs *regs, unsigned long address,
|
|
|
unsigned long error_code, int signal_code, int breakpt)
|
|
@@ -1137,10 +1154,7 @@ release_thread(struct task_struct *t)
|
|
|
*/
|
|
|
int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
|
|
|
{
|
|
|
- flush_fp_to_thread(src);
|
|
|
- flush_altivec_to_thread(src);
|
|
|
- flush_vsx_to_thread(src);
|
|
|
- flush_spe_to_thread(src);
|
|
|
+ flush_all_to_thread(src);
|
|
|
/*
|
|
|
* Flush TM state out so we can copy it. __switch_to_tm() does this
|
|
|
* flush but it removes the checkpointed state from the current CPU and
|