Index: include/cpu.h =================================================================== RCS file: /cvs/src/sys/arch/sparc64/include/cpu.h,v retrieving revision 1.95 diff -u -p -r1.95 cpu.h --- include/cpu.h 5 Jun 2020 14:25:05 -0000 1.95 +++ include/cpu.h 15 Jun 2020 04:33:36 -0000 @@ -115,7 +115,10 @@ struct cpu_info { struct proc *ci_fpproc; int ci_cpuid; - int ci_flags; + int ci_state; +#define CPU_S_PROBED 0 +#define CPU_S_ATTACHED 1 +#define CPU_S_RUNNING 2 int ci_upaid; #ifdef MULTIPROCESSOR int ci_itid; @@ -165,8 +168,6 @@ struct cpu_info { struct gmonparam *ci_gmon; #endif }; - -#define CPUF_RUNNING 0x0001 /* CPU is running */ extern struct cpu_info *cpus; Index: sparc64/cpu.c =================================================================== RCS file: /cvs/src/sys/arch/sparc64/sparc64/cpu.c,v retrieving revision 1.70 diff -u -p -r1.70 cpu.c --- sparc64/cpu.c 29 May 2020 04:42:24 -0000 1.70 +++ sparc64/cpu.c 15 Jun 2020 04:33:36 -0000 @@ -190,6 +190,72 @@ alloc_cpuinfo(struct mainbus_attach_args return (cpi); } +#ifdef MULTIPROCESSOR +void cpu_mp_startup(void); + +void +cpu_boot_secondary_processors(void) +{ + struct cpu_info *ci; + int i; + + for (ci = cpus; ci != NULL; ci = ci->ci_next) { + if (ci == curcpu()) { + KASSERT(ci->ci_state == CPU_S_RUNNING); + printf("%s: self (cpu %d)\n", __func__, + CPU_INFO_UNIT(ci)); + continue; + } + + if (ci->ci_state != CPU_S_ATTACHED) + printf("cpu%d: not attached yet!\n", CPU_INFO_UNIT(ci)); + + WRITE_ONCE(ci->ci_state, CPU_S_RUNNING); + membar_sync(); + + for (i = 0; i < 2000; i++) { + membar_sync(); + if (READ_ONCE(ci->ci_state) == CPU_S_RUNNING) { + printf("%s: running (cpu %d)\n", __func__, + CPU_INFO_UNIT(ci)); + break; + } + delay(10000); + } + } +} + +void +cpu_hatch(void) +{ + struct cpu_info *ci = curcpu(); + uint64_t mask; + int s; + + cpu_init(ci); + +//printf("cpu%d: %s itid %u\n", CPU_INFO_UNIT(ci), __func__, ci->ci_itid); + + mask = intr_disable(); + WRITE_ONCE(ci->ci_state, CPU_S_ATTACHED); + membar_sync(); + + while (READ_ONCE(ci->ci_state) != CPU_S_RUNNING) { + membar_sync(); + } + intr_restore(mask); + + s = splhigh(); + nanouptime(&ci->ci_schedstate.spc_runtime); + splx(s); + + cpu_start_clock(); + + SCHED_LOCK(s); + cpu_switchto(NULL, sched_chooseproc()); +} +#endif + int cpu_match(struct device *parent, void *match, void *aux) { @@ -238,6 +304,8 @@ cpu_attach(struct device *parent, struct register int i, l; u_int64_t ver = 0; extern u_int64_t cpu_clockrate[]; + int mycpuid = cpu_myid(); + char buf[32]; if (CPU_ISSUN4U || CPU_ISSUN4US) ver = getver(); @@ -273,9 +341,6 @@ cpu_attach(struct device *parent, struct cpu_cpuspeed = sparc64_cpuspeed; - if (ci->ci_upaid == cpu_myid()) - cpu_init(ci); - cacheinfo.c_physical = 1; /* Dunno... */ cacheinfo.c_split = 1; l = getpropint(node, "icache-line-size", 0); @@ -373,6 +438,46 @@ cpu_attach(struct device *parent, struct printf("\n"); cache_enable(); + +#ifdef MULTIPROCESSOR + if (OF_getprop(findroot(), "name", buf, sizeof(buf)) > 0 && + strcmp(buf, "SUNW,Ultra-Enterprise-10000") == 0) + ci->ci_itid = STARFIRE_UPAID2HWMID(ci->ci_upaid); + else + ci->ci_itid = ci->ci_upaid; + + printf("%s: itid %u\n", dev->dv_xname, ci->ci_itid); + + if (ci->ci_upaid == mycpuid) + cpu_init(ci); + else { + int cpuid; + + ci->ci_randseed = (arc4random() & 0x7fffffff) + 1; + + if (CPU_ISSUN4V) + cpuid = ci->ci_upaid; + else + cpuid = getpropint(ci->ci_node, "cpuid", -1); + + if (OF_test("SUNW,start-cpu-by-cpuid") == 0) { + prom_start_cpu_by_cpuid(cpuid, + (void *)cpu_mp_startup, ci->ci_paddr); + } else { + prom_start_cpu(ci->ci_node, + (void *)cpu_mp_startup, ci->ci_paddr); + } + + for (i = 0; i < 2000; i++) { + membar_sync(); + if (ci->ci_state == CPU_S_ATTACHED) { + printf("%s: attached\n", dev->dv_xname); + break; + } + delay(10000); + } + } +#endif /* MULTIPROCESSOR */ } int @@ -665,74 +770,6 @@ hummingbird_init(struct cpu_info *ci) return; cpu_setperf = hummingbird_setperf; -} -#endif - -#ifdef MULTIPROCESSOR -void cpu_mp_startup(void); - -void -cpu_boot_secondary_processors(void) -{ - struct cpu_info *ci; - int cpuid, i; - char buf[32]; - - if (OF_getprop(findroot(), "name", buf, sizeof(buf)) > 0 && - strcmp(buf, "SUNW,Ultra-Enterprise-10000") == 0) { - for (ci = cpus; ci != NULL; ci = ci->ci_next) - ci->ci_itid = STARFIRE_UPAID2HWMID(ci->ci_upaid); - } else { - for (ci = cpus; ci != NULL; ci = ci->ci_next) - ci->ci_itid = ci->ci_upaid; - } - - for (ci = cpus; ci != NULL; ci = ci->ci_next) { - if (ci->ci_upaid == cpu_myid()) - continue; - ci->ci_randseed = (arc4random() & 0x7fffffff) + 1; - - if (CPU_ISSUN4V) - cpuid = ci->ci_upaid; - else - cpuid = getpropint(ci->ci_node, "cpuid", -1); - - if (OF_test("SUNW,start-cpu-by-cpuid") == 0) { - prom_start_cpu_by_cpuid(cpuid, - (void *)cpu_mp_startup, ci->ci_paddr); - } else { - prom_start_cpu(ci->ci_node, - (void *)cpu_mp_startup, ci->ci_paddr); - } - - for (i = 0; i < 2000; i++) { - membar_sync(); - if (ci->ci_flags & CPUF_RUNNING) - break; - delay(10000); - } - } -} - -void -cpu_hatch(void) -{ - struct cpu_info *ci = curcpu(); - int s; - - cpu_init(ci); - - ci->ci_flags |= CPUF_RUNNING; - membar_sync(); - - s = splhigh(); - nanouptime(&ci->ci_schedstate.spc_runtime); - splx(s); - - cpu_start_clock(); - - SCHED_LOCK(s); - cpu_switchto(NULL, sched_chooseproc()); } #endif Index: sparc64/ipifuncs.c =================================================================== RCS file: /cvs/src/sys/arch/sparc64/sparc64/ipifuncs.c,v retrieving revision 1.19 diff -u -p -r1.19 ipifuncs.c --- sparc64/ipifuncs.c 6 Aug 2019 18:06:32 -0000 1.19 +++ sparc64/ipifuncs.c 15 Jun 2020 04:33:36 -0000 @@ -170,7 +170,7 @@ sun4u_broadcast_ipi(void (*func)(void), for (ci = cpus; ci != NULL; ci = ci->ci_next) { if (ci->ci_cpuid == cpu_number()) continue; - if ((ci->ci_flags & CPUF_RUNNING) == 0) + if (ci->ci_state != CPU_S_RUNNING) continue; sun4u_send_ipi(ci->ci_itid, func, arg0, arg1); } @@ -186,7 +186,7 @@ sun4v_broadcast_ipi(void (*func)(void), for (ci = cpus; ci != NULL; ci = ci->ci_next) { if (ci->ci_cpuid == cpu_number()) continue; - if ((ci->ci_flags & CPUF_RUNNING) == 0) + if (ci->ci_state != CPU_S_RUNNING) continue; stha(cpuset, ASI_PHYS_CACHED, ci->ci_itid); cpuset += sizeof(int16_t); @@ -243,7 +243,7 @@ smp_tlb_flush_ctx(int ctx) void cpu_unidle(struct cpu_info *ci) { - if (ci == curcpu() || db_active || ((ci->ci_flags & CPUF_RUNNING) == 0)) + if (ci == curcpu() || db_active || ci->ci_state != CPU_S_RUNNING) return; if (CPU_ISSUN4V) Index: sparc64/pmap.c =================================================================== RCS file: /cvs/src/sys/arch/sparc64/sparc64/pmap.c,v retrieving revision 1.103 diff -u -p -r1.103 pmap.c --- sparc64/pmap.c 4 Dec 2017 22:06:21 -0000 1.103 +++ sparc64/pmap.c 15 Jun 2020 04:33:36 -0000 @@ -1201,7 +1201,7 @@ remap_data: cpus->ci_cpcb = (struct pcb *)u0[0]; /* Need better source */ cpus->ci_upaid = cpu_myid(); cpus->ci_cpuid = 0; - cpus->ci_flags = CPUF_RUNNING; + cpus->ci_state = CPU_S_RUNNING; cpus->ci_fpproc = NULL; cpus->ci_spinup = main; /* Call main when we're running. */ cpus->ci_initstack = (void *)u0[1];