if (c->x86_num_cores > 1) { for (i = 0; i < NR_CPUS; i++) { if (!cpu_isset(i, cpu_callout_map)) continue; if (phys_proc_id[cpu] == phys_proc_id[i]) { cpu_set(i, cpu_core_map[cpu]); } } } else cpu_core_map[cpu] = cpu_sibling_map[cpu]; 
static void __init smp_boot_cpus(unsigned int max_cpus){	unsigned apicid, cpu, bit, kicked;	nmi_watchdog_default();	/*	 * Setup boot CPU information	 */	smp_store_cpu_info(0); /* Final full version of the data */	printk(KERN_INFO "CPU%d: ", 0);	print_cpu_info(&cpu_data[0]);	current_thread_info()->cpu = 0;	smp_tune_scheduling();	if (!physid_isset(hard_smp_processor_id(), phys_cpu_present_map)) {		printk("weird, boot CPU (#%d) not listed by the BIOS.\n",		       hard_smp_processor_id());		physid_set(hard_smp_processor_id(), phys_cpu_present_map);	}	/*	 * If we couldn't find an SMP configuration at boot time,	 * get out of here now!	 */	if (!smp_found_config) {		printk(KERN_NOTICE "SMP motherboard not detected.\n");		io_apic_irqs = 0;		cpu_online_map = cpumask_of_cpu(0);		cpu_set(0, cpu_sibling_map[0]);		phys_cpu_present_map = physid_mask_of_physid(0);		if (APIC_init_uniprocessor())			printk(KERN_NOTICE "Local APIC not detected."					   " Using dummy APIC emulation.\n");		goto smp_done;	}	/*	 * Should not be necessary because the MP table should list the boot	 * CPU too, but we do it for the sake of robustness anyway.	 */	if (!physid_isset(boot_cpu_id, phys_cpu_present_map)) {		printk(KERN_NOTICE "weird, boot CPU (#%d) not listed by the BIOS.\n",								 boot_cpu_id);		physid_set(hard_smp_processor_id(), phys_cpu_present_map);	}	/*	 * If we couldn't find a local APIC, then get out of here now!	 */	if (APIC_INTEGRATED(apic_version[boot_cpu_id]) && !cpu_has_apic) {		printk(KERN_ERR "BIOS bug, local APIC #%d not detected!...\n",			boot_cpu_id);		printk(KERN_ERR "... forcing use of dummy APIC emulation. (tell your hw vendor)\n");		io_apic_irqs = 0;		cpu_online_map = cpumask_of_cpu(0);		cpu_set(0, cpu_sibling_map[0]);		phys_cpu_present_map = physid_mask_of_physid(0);		disable_apic = 1;		goto smp_done;	}	verify_local_APIC();	/*	 * If SMP should be disabled, then really disable it!	 */	if (!max_cpus) {		smp_found_config = 0;		printk(KERN_INFO "SMP mode deactivated, forcing use of dummy APIC emulation.\n");		io_apic_irqs = 0;		cpu_online_map = cpumask_of_cpu(0);		cpu_set(0, cpu_sibling_map[0]);		phys_cpu_present_map = physid_mask_of_physid(0);		disable_apic = 1;		goto smp_done;	}	connect_bsp_APIC();	setup_local_APIC();	if (GET_APIC_ID(apic_read(APIC_ID)) != boot_cpu_id)		BUG();	x86_cpu_to_apicid[0] = boot_cpu_id;	/*	 * Now scan the CPU present map and fire up the other CPUs.	 */	Dprintk("CPU present map: %lx\n", physids_coerce(phys_cpu_present_map));	kicked = 1;	for (bit = 0; kicked < NR_CPUS && bit < MAX_APICS; bit++) {		apicid = cpu_present_to_apicid(bit);		/*		 * Don't even attempt to start the boot CPU!		 */		if (apicid == boot_cpu_id || (apicid == BAD_APICID))			continue;		if (!physid_isset(apicid, phys_cpu_present_map))			continue;		if ((max_cpus >= 0) && (max_cpus <= cpucount+1))			continue;		do_boot_cpu(apicid);		++kicked;	}	/*	 * Cleanup possible dangling ends...	 */	{		/*		 * Install writable page 0 entry to set BIOS data area.		 */		local_flush_tlb();		/*		 * Paranoid:  Set warm reset code and vector here back		 * to default values.		 */		CMOS_WRITE(0, 0xf);		*((volatile int *) phys_to_virt(0x467)) = 0;	}	/*	 * Allow the user to impress friends.	 */	Dprintk("Before bogomips.\n");	if (!cpucount) {		printk(KERN_INFO "Only one processor found.\n");	} else {		unsigned long bogosum = 0;		for (cpu = 0; cpu < NR_CPUS; cpu++)			if (cpu_isset(cpu, cpu_callout_map))				bogosum += cpu_data[cpu].loops_per_jiffy;		printk(KERN_INFO "Total of %d processors activated (%lu.%02lu BogoMIPS).\n",			cpucount+1,			bogosum/(500000/HZ),			(bogosum/(5000/HZ))%100);		Dprintk("Before bogocount - setting activated=1.\n");	}	/*	 * Construct cpu_sibling_map[], so that we can tell the	 * sibling CPU efficiently.	 */	for (cpu = 0; cpu < NR_CPUS; cpu++)		cpus_clear(cpu_sibling_map[cpu]);	for (cpu = 0; cpu < NR_CPUS; cpu++) {		int siblings = 0;		int i;		if (!cpu_isset(cpu, cpu_callout_map))			continue;		if (smp_num_siblings > 1) {			for (i = 0; i < NR_CPUS; i++) {				if (!cpu_isset(i, cpu_callout_map))					continue;				if (phys_proc_id[cpu] == phys_proc_id[i]) {					siblings++;					cpu_set(i, cpu_sibling_map[cpu]);				}			}		} else { 			siblings++;			cpu_set(cpu, cpu_sibling_map[cpu]);		}		if (siblings != smp_num_siblings) {			printk(KERN_WARNING 	       "WARNING: %d siblings found for CPU%d, should be %d\n", 			       siblings, cpu, smp_num_siblings);			smp_num_siblings = siblings;		}       	}	Dprintk("Boot done.\n");	/*	 * Here we can be sure that there is an IO-APIC in the system. Let's	 * go and set it up:	 */	if (!skip_ioapic_setup && nr_ioapics)		setup_IO_APIC();	else		nr_ioapics = 0;	setup_boot_APIC_clock();	/*	 * Synchronize the TSC with the AP	 */	if (cpu_has_tsc && cpucount)		synchronize_tsc_bp(); smp_done:	time_init_smp();}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/3dd9d514846cdca1dcef2e4fce666d85e199e844/smpboot.c/buggy/arch/x86_64/kernel/smpboot.c