* Called from platform specific assembly code, this is the
  * secondary CPU entry point.
  */
-asmlinkage void secondary_start_kernel(void);
+asmlinkage void secondary_start_kernel(struct task_struct *task);
 
 
 /*
        };
        unsigned long swapper_pg_dir;
        void *stack;
+       struct task_struct *task;
 };
 extern struct secondary_data secondary_data;
 extern void secondary_startup(void);
 
        ret     r12
 1:     bl      __after_proc_init
        ldr     sp, [r7, #12]                   @ set up the stack pointer
+       ldr     r0, [r7, #16]                   @ set up task pointer
        mov     fp, #0
        b       secondary_start_kernel
 ENDPROC(secondary_startup)
 
 ENDPROC(secondary_startup_arm)
 
 ENTRY(__secondary_switched)
-       ldr_l   r7, secondary_data + 12         @ get secondary_data.stack
-       mov     sp, r7
+       adr_l   r7, secondary_data + 12         @ get secondary_data.stack
+       ldr     sp, [r7]
+       ldr     r0, [r7, #4]                    @ get secondary_data.task
        mov     fp, #0
        b       secondary_start_kernel
 ENDPROC(__secondary_switched)
 
        secondary_data.pgdir = virt_to_phys(idmap_pgd);
        secondary_data.swapper_pg_dir = get_arch_pgd(swapper_pg_dir);
 #endif
+       secondary_data.task = idle;
        sync_cache_w(&secondary_data);
 
        /*
         */
        __asm__("mov    sp, %0\n"
        "       mov     fp, #0\n"
+       "       mov     r0, %1\n"
        "       b       secondary_start_kernel"
                :
-               : "r" (task_stack_page(current) + THREAD_SIZE - 8));
+               : "r" (task_stack_page(current) + THREAD_SIZE - 8),
+                 "r" (current)
+               : "r0");
 }
 #endif /* CONFIG_HOTPLUG_CPU */
 
  * This is the secondary CPU boot entry.  We're using this CPUs
  * idle thread stack, but a set of temporary page tables.
  */
-asmlinkage void secondary_start_kernel(void)
+asmlinkage void secondary_start_kernel(struct task_struct *task)
 {
        struct mm_struct *mm = &init_mm;
        unsigned int cpu;