vserver 1.9.5.x5
[linux-2.6.git] / arch / arm / kernel / process.c
index 8d9db74..dbd8ca8 100644 (file)
@@ -97,6 +97,8 @@ void default_idle(void)
  */
 void cpu_idle(void)
 {
+       local_fiq_enable();
+
        /* endless idle loop with no priority at all */
        while (1) {
                void (*idle)(void) = pm_idle;
@@ -313,11 +315,23 @@ void flush_thread(void)
 
        memset(thread->used_cp, 0, sizeof(thread->used_cp));
        memset(&tsk->thread.debug, 0, sizeof(struct debug_info));
+#if defined(CONFIG_IWMMXT)
+       iwmmxt_task_release(thread);
+#endif
        fp_init(&thread->fpstate);
+#if defined(CONFIG_VFP)
+       vfp_flush_thread(&thread->vfpstate);
+#endif
 }
 
 void release_thread(struct task_struct *dead_task)
 {
+#if defined(CONFIG_VFP)
+       vfp_release_thread(&dead_task->thread_info->vfpstate);
+#endif
+#if defined(CONFIG_IWMMXT)
+       iwmmxt_task_release(dead_task->thread_info);
+#endif
 }
 
 asmlinkage void ret_from_fork(void) __asm__("ret_from_fork");
@@ -338,6 +352,9 @@ copy_thread(int nr, unsigned long clone_flags, unsigned long stack_start,
        thread->cpu_context.sp = (unsigned long)childregs;
        thread->cpu_context.pc = (unsigned long)ret_from_fork;
 
+       if (clone_flags & CLONE_SETTLS)
+               thread->tp_value = regs->ARM_r3;
+
        return 0;
 }