extern void enable_kernel_spe(void);
 extern void load_up_spe(struct task_struct *);
 extern void giveup_all(struct task_struct *);
+extern void flush_all_to_thread(struct task_struct *);
 extern void switch_booke_debug_regs(struct debug_reg *new_debug);
 
 #ifdef CONFIG_PPC_FPU
 
 }
 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)
  */
 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
 
         * flush out all the special registers so we don't need
         * to save them in the snapshot
         */
-       flush_fp_to_thread(current);
-       flush_altivec_to_thread(current);
-       flush_spe_to_thread(current);
+       flush_all_to_thread(current);
 
 #ifdef CONFIG_PPC64
        hard_irq_disable();
 
                        goto out;
        }
 
-       flush_fp_to_thread(current);
-       flush_altivec_to_thread(current);
-       flush_vsx_to_thread(current);
+       flush_all_to_thread(current);
+
        vcpu->arch.wqp = &vcpu->arch.vcore->wq;
        vcpu->arch.pgdir = current->mm->pgd;
        vcpu->arch.state = KVMPPC_VCPU_BUSY_IN_HOST;