void cpu_reset(void) { #ifdef SMP if (smp_active_mask == 1) { cpu_reset_real(); /* NOTREACHED */ } else { cpumask_t map; int cnt; kprintf("cpu_reset called on cpu#%d\n",mycpu->gd_cpuid); map = mycpu->gd_other_cpus & ~stopped_cpus & smp_active_mask; if (map != 0) { kprintf("cpu_reset: Stopping other CPUs\n"); stop_cpus(map); /* Stop all other CPUs */ } if (mycpu->gd_cpuid == 0) { DELAY(1000000); cpu_reset_real(); /* NOTREACHED */ } else { /* We are not BSP (CPU #0) */ cpu_reset_proxyid = mycpu->gd_cpuid; cpustop_restartfunc = cpu_reset_proxy; kprintf("cpu_reset: Restarting BSP\n"); started_cpus = (1<<0); /* Restart CPU #0 */ cnt = 0; while (cpu_reset_proxy_active == 0 && cnt < 10000000) cnt++; /* Wait for BSP to announce restart */ if (cpu_reset_proxy_active == 0) kprintf("cpu_reset: Failed to restart BSP\n"); __asm __volatile("cli" : : : "memory"); cpu_reset_proxy_active = 2; cnt = 0; while (cpu_reset_proxy_active == 2 && cnt < 10000000) cnt++; /* Do nothing */ if (cpu_reset_proxy_active == 2) { kprintf("cpu_reset: BSP did not grab mp lock\n"); cpu_reset_real(); /* XXX: Bogus ? */ } cpu_reset_proxy_active = 4; __asm __volatile("sti" : : : "memory"); while (1); /* NOTREACHED */ } } #else cpu_reset_real(); #endif }
static void cpu_reset_proxy(void) { cpu_reset_proxy_active = 1; while (cpu_reset_proxy_active == 1) ; /* Wait for other cpu to disable interupts */ kprintf("cpu_reset_proxy: Grabbed mp lock for BSP\n"); cpu_reset_proxy_active = 3; while (cpu_reset_proxy_active == 3) ; /* Wait for other cpu to enable interrupts */ stop_cpus(CPUMASK(cpu_reset_proxyid)); kprintf("cpu_reset_proxy: Stopped CPU %d\n", cpu_reset_proxyid); DELAY(1000000); cpu_reset_real(); }
static void cpu_reset_proxy() { cpuset_t tcrp; cpu_reset_proxy_active = 1; while (cpu_reset_proxy_active == 1) ia32_pause(); /* Wait for other cpu to see that we've started */ CPU_SETOF(cpu_reset_proxyid, &tcrp); stop_cpus(tcrp); printf("cpu_reset_proxy: Stopped CPU %d\n", cpu_reset_proxyid); DELAY(1000000); cpu_reset_real(); }
void cpu_reset() { #ifdef SMP cpuset_t map; u_int cnt; if (smp_started) { map = all_cpus; CPU_CLR(PCPU_GET(cpuid), &map); CPU_NAND(&map, &stopped_cpus); if (!CPU_EMPTY(&map)) { printf("cpu_reset: Stopping other CPUs\n"); stop_cpus(map); } if (PCPU_GET(cpuid) != 0) { cpu_reset_proxyid = PCPU_GET(cpuid); cpustop_restartfunc = cpu_reset_proxy; cpu_reset_proxy_active = 0; printf("cpu_reset: Restarting BSP\n"); /* Restart CPU #0. */ CPU_SETOF(0, &started_cpus); wmb(); cnt = 0; while (cpu_reset_proxy_active == 0 && cnt < 10000000) { ia32_pause(); cnt++; /* Wait for BSP to announce restart */ } if (cpu_reset_proxy_active == 0) printf("cpu_reset: Failed to restart BSP\n"); enable_intr(); cpu_reset_proxy_active = 2; while (1) ia32_pause(); /* NOTREACHED */ } DELAY(1000000); } #endif cpu_reset_real(); /* NOTREACHED */ }
void cpu_reset(void) { cpu_reset_real(); }