void exit_thread(void)
 {
+       preempt_disable();
        if (last_task_used_math == current)
                last_task_used_math = NULL;
        if (last_task_used_altivec == current)
        if (last_task_used_spe == current)
                last_task_used_spe = NULL;
 #endif
+       preempt_enable();
 }
 
 void flush_thread(void)
 {
+       preempt_disable();
        if (last_task_used_math == current)
                last_task_used_math = NULL;
        if (last_task_used_altivec == current)
        if (last_task_used_spe == current)
                last_task_used_spe = NULL;
 #endif
+       preempt_enable();
 }
 
 void
        regs->nip = nip;
        regs->gpr[1] = sp;
        regs->msr = MSR_USER;
+       preempt_disable();
        if (last_task_used_math == current)
                last_task_used_math = NULL;
        if (last_task_used_altivec == current)
        if (last_task_used_spe == current)
                last_task_used_spe = NULL;
 #endif
+       preempt_enable();
        memset(current->thread.fpr, 0, sizeof(current->thread.fpr));
        current->thread.fpscr.val = 0;
 #ifdef CONFIG_ALTIVEC