/* Setup the PC, SP, and GP of a secondary processor and start it running! smp_bootstrap is the place to resume from __KSTK_TOS(idle) is apparently the stack pointer (unsigned long)idle->thread_info the gp assumes a 1:1 mapping of TC => VPE  */
static void __cpuinit vsmp_boot_secondary(int cpu, struct task_struct *idle)
/* Setup the PC, SP, and GP of a secondary processor and start it running! smp_bootstrap is the place to resume from __KSTK_TOS(idle) is apparently the stack pointer (unsigned long)idle->thread_info the gp assumes a 1:1 mapping of TC => VPE  */
static void __cpuinit vsmp_boot_secondary(int cpu, struct task_struct *idle)
{
	struct thread_info *gp = task_thread_info(idle);
	dvpe();
	set_c0_mvpcontrol(MVPCONTROL_VPC);
	settc(cpu);
	write_tc_c0_tcrestart((unsigned long)&smp_bootstrap);
	write_tc_c0_tcstatus((read_tc_c0_tcstatus() & ~TCSTATUS_IXMT) | TCSTATUS_A);
	write_tc_c0_tchalt(0);
	write_vpe_c0_vpeconf0(read_vpe_c0_vpeconf0() | VPECONF0_VPA);
	write_tc_gpr_sp( __KSTK_TOS(idle));
	write_tc_gpr_gp((unsigned long)gp);
	flush_icache_range((unsigned long)gp,
	                   (unsigned long)(gp + sizeof(struct thread_info)));
	clear_c0_mvpcontrol(MVPCONTROL_VPC);
	evpe(EVPE_ENABLE);
}