/* * Get SMP fully working before we start initializing devices. */ static void ap_finish(void) { int i; cpumask_t ncpus_mask = 0; for (i = 1; i <= ncpus; i++) ncpus_mask |= CPUMASK(i); mp_finish = 1; if (bootverbose) kprintf("Finish MP startup\n"); /* build our map of 'other' CPUs */ mycpu->gd_other_cpus = smp_startup_mask & ~CPUMASK(mycpu->gd_cpuid); /* * Let the other cpu's finish initializing and build their map * of 'other' CPUs. */ rel_mplock(); while (smp_active_mask != smp_startup_mask) { DELAY(100000); cpu_lfence(); } while (try_mplock() == 0) DELAY(100000); if (bootverbose) kprintf("Active CPU Mask: %08x\n", smp_active_mask); }
/* * Get SMP fully working before we start initializing devices. */ static void ap_finish(void) { mp_finish = 1; if (bootverbose) kprintf("Finish MP startup\n"); /* build our map of 'other' CPUs */ mycpu->gd_other_cpus = smp_startup_mask; CPUMASK_NANDBIT(mycpu->gd_other_cpus, mycpu->gd_cpuid); /* * Let the other cpu's finish initializing and build their map * of 'other' CPUs. */ rel_mplock(); while (CPUMASK_CMPMASKNEQ(smp_active_mask,smp_startup_mask)) { DELAY(100000); cpu_lfence(); } while (try_mplock() == 0) DELAY(100000); if (bootverbose) kprintf("Active CPU Mask: %08lx\n", (long)CPUMASK_LOWMASK(smp_active_mask)); }