int __init __cpu_up(unsigned int cpu) 
int __cpuinit __cpu_up(unsigned int cpu) 
int __init __cpu_up(unsigned int cpu){	struct task_struct *idle;	pgd_t *pgd;	pmd_t *pmd;	int ret;	/*	 * Spawn a new process manually.  Grab a pointer to	 * its task struct so we can mess with it	 */	idle = fork_idle(cpu);	if (IS_ERR(idle)) {		printk(KERN_ERR "CPU%u: fork() failed\n", cpu);		return PTR_ERR(idle);	}	/*	 * Allocate initial page tables to allow the new CPU to	 * enable the MMU safely.  This essentially means a set	 * of our "standard" page tables, with the addition of	 * a 1:1 mapping for the physical address of the kernel.	 */	pgd = pgd_alloc(&init_mm);	pmd = pmd_offset(pgd, PHYS_OFFSET);	*pmd = __pmd((PHYS_OFFSET & PGDIR_MASK) |		     PMD_TYPE_SECT | PMD_SECT_AP_WRITE);	/*	 * We need to tell the secondary core where to find	 * its stack and the page tables.	 */	secondary_data.stack = (void *)idle->thread_info + THREAD_SIZE - 8;	secondary_data.pgdir = virt_to_phys(pgd);	wmb();	/*	 * Now bring the CPU into our world.	 */	ret = boot_secondary(cpu, idle);	if (ret == 0) {		unsigned long timeout;		/*		 * CPU was successfully started, wait for it		 * to come online or time out.		 */		timeout = jiffies + HZ;		while (time_before(jiffies, timeout)) {			if (cpu_online(cpu))				break;			udelay(10);			barrier();		}		if (!cpu_online(cpu))			ret = -EIO;	}	secondary_data.stack = 0;	secondary_data.pgdir = 0;	*pmd_offset(pgd, PHYS_OFFSET) = __pmd(0);	pgd_free(pgd);	if (ret) {		printk(KERN_CRIT "CPU%u: processor failed to boot\n", cpu);		/*		 * FIXME: We need to clean up the new idle thread. --rmk		 */	}	return ret;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/bd6f68af298cab4e059f8489b56e46ae36243fcc/smp.c/buggy/arch/arm/kernel/smp.c