On Sun, Aug 13, 2023 at 01:48:21PM -0500, Scott Cheloha wrote: > This is the next patch in the clock interrupt reorganization series. > > Before we continue breaking up the hardclock(9) we need to detour into > the MD code. > > This patch divides the "initialization" parts of cpu_initclocks() from > the "start the clock interrupt" parts. Seprating the two parts leaves > initclocks() an opportunity to prepare the primary CPU for clock > interrupt dispatch in a machine-independent manner before actually > pulling the trigger. It's nearly impossible to do any MI setup during > initclocks() because cpu_initclocks() does everything in one go: both > initialization and kickoff are done when cpu_initclocks() returns. > > Many platforms have a "cpu_startclock()" function, so this patch takes > that de facto standard and makes it a rule: cpu_startclock() is now > required. It is prototyped in sys/systm.h and every platform must > implement it. > > The revised initclocks() sequence is then: > > 1. Call cpu_initclocks(). At minimum, cpu_initclocks() ensures > hz, stathz, and profhz are initialized. All the machine > independent setup in step (2) (currently) depends upon > these machine-dependent values. > > 2. Compute intervals using hz, stathz, and profhz. > > In a later step I will move the full contents of clockintr_init() > up into initclocks() and get rid of clockintr_init() entirely. > > 3. Call cpu_startclock(). At minimum, cpu_startclock() starts the > clock interrupt dispatch cycle on the primary CPU. > > I have compiled/booted this patch on amd64 (lapic path), arm64, i386 > (lapic path), macppc, octeon, and sparc64 (sun4v). > > I am looking for compile/boot tests on alpha, armv7, hppa, landisk, > luna88k, powerpc64, and riscv64. I think armv7 is the tricky one > here. Everything else is relatively straightforward, though I may > have missed a few stray variables here or there. > > Test results? Ok?
Here is an updated patch that removes several MD prototypes for cpu_startclock() that I missed the first time through. I went back and tested these again: - amd64 (lapic) - arm64 - i386 (lapic) - powerpc/macppc - mips64/octeon (loongson should be fine) - sparc64 (sys_tick; tick/stick should be fine) arm/armv7 and riscv64 were tested under the previous version, but I would appreciate a second compile-test to make sure the header changes in the updated patch did not break the build (CC phessler@, jsg@). I am still seeking compile/boot-tests for the following: - alpha - hppa - m88k/luna88k - powerpc64 - sh/landisk Test results? Ok? Index: kern/kern_clock.c =================================================================== RCS file: /cvs/src/sys/kern/kern_clock.c,v retrieving revision 1.113 diff -u -p -r1.113 kern_clock.c --- kern/kern_clock.c 12 Aug 2023 13:19:28 -0000 1.113 +++ kern/kern_clock.c 19 Aug 2023 18:16:16 -0000 @@ -103,6 +103,9 @@ initclocks(void) profclock_period = 1000000000 / profhz; inittimecounter(); + + /* Start dispatching clock interrupts on the primary CPU. */ + cpu_startclock(); } /* Index: sys/systm.h =================================================================== RCS file: /cvs/src/sys/sys/systm.h,v retrieving revision 1.164 diff -u -p -r1.164 systm.h --- sys/systm.h 5 Aug 2023 20:07:56 -0000 1.164 +++ sys/systm.h 19 Aug 2023 18:16:17 -0000 @@ -243,6 +243,7 @@ void initclocks(void); void inittodr(time_t); void resettodr(void); void cpu_initclocks(void); +void cpu_startclock(void); void startprofclock(struct process *); void stopprofclock(struct process *); Index: arch/alpha/alpha/clock.c =================================================================== RCS file: /cvs/src/sys/arch/alpha/alpha/clock.c,v retrieving revision 1.28 diff -u -p -r1.28 clock.c --- arch/alpha/alpha/clock.c 25 Jul 2023 18:16:19 -0000 1.28 +++ arch/alpha/alpha/clock.c 19 Aug 2023 18:16:17 -0000 @@ -193,7 +193,11 @@ cpu_initclocks(void) stathz = hz; profhz = stathz; clockintr_init(0); +} +void +cpu_startclock(void) +{ clockintr_cpu_init(NULL); /* Index: arch/amd64/amd64/machdep.c =================================================================== RCS file: /cvs/src/sys/arch/amd64/amd64/machdep.c,v retrieving revision 1.286 diff -u -p -r1.286 machdep.c --- arch/amd64/amd64/machdep.c 27 Jul 2023 00:28:25 -0000 1.286 +++ arch/amd64/amd64/machdep.c 19 Aug 2023 18:16:18 -0000 @@ -227,6 +227,7 @@ paddr_t avail_end; void (*delay_func)(int) = i8254_delay; void (*initclock_func)(void) = i8254_initclocks; +void (*startclock_func)(void) = i8254_start_both_clocks; /* * Format of boot information passed to us by 32-bit /boot @@ -1878,6 +1879,12 @@ void cpu_initclocks(void) { (*initclock_func)(); +} + +void +cpu_startclock(void) +{ + (*startclock_func)(); } void Index: arch/amd64/amd64/lapic.c =================================================================== RCS file: /cvs/src/sys/arch/amd64/amd64/lapic.c,v retrieving revision 1.68 diff -u -p -r1.68 lapic.c --- arch/amd64/amd64/lapic.c 26 Apr 2023 10:52:55 -0000 1.68 +++ arch/amd64/amd64/lapic.c 19 Aug 2023 18:16:19 -0000 @@ -499,8 +499,6 @@ lapic_initclocks(void) stathz = hz; profhz = stathz * 10; clockintr_init(CL_RNDSTAT); - - lapic_startclock(); } @@ -599,6 +597,7 @@ skip_calibration: lapic_per_second * (1ULL << 32) / 1000000000; lapic_timer_nsec_max = UINT64_MAX / lapic_timer_nsec_cycle_ratio; initclock_func = lapic_initclocks; + startclock_func = lapic_startclock; } /* Index: arch/amd64/include/cpu.h =================================================================== RCS file: /cvs/src/sys/arch/amd64/include/cpu.h,v retrieving revision 1.158 diff -u -p -r1.158 cpu.h --- arch/amd64/include/cpu.h 27 Jul 2023 00:28:24 -0000 1.158 +++ arch/amd64/include/cpu.h 19 Aug 2023 18:16:19 -0000 @@ -408,6 +408,8 @@ int amd64_pa_used(paddr_t); extern void (*cpu_idle_cycle_fcn)(void); #define cpu_idle_cycle() (*cpu_idle_cycle_fcn)() #define cpu_idle_leave() do { /* nothing */ } while (0) +extern void (*initclock_func)(void); +extern void (*startclock_func)(void); struct region_descriptor; void lgdt(struct region_descriptor *); @@ -418,7 +420,6 @@ void switch_exit(struct proc *, void (*) void proc_trampoline(void); /* clock.c */ -extern void (*initclock_func)(void); void startclocks(void); void rtcinit(void); void rtcstart(void); @@ -426,6 +427,7 @@ void rtcstop(void); void i8254_delay(int); void i8254_initclocks(void); void i8254_startclock(void); +void i8254_start_both_clocks(void); void i8254_inittimecounter(void); void i8254_inittimecounter_simple(void); Index: arch/amd64/isa/clock.c =================================================================== RCS file: /cvs/src/sys/arch/amd64/isa/clock.c,v retrieving revision 1.40 diff -u -p -r1.40 clock.c --- arch/amd64/isa/clock.c 25 Jul 2023 18:16:19 -0000 1.40 +++ arch/amd64/isa/clock.c 19 Aug 2023 18:16:19 -0000 @@ -284,7 +284,11 @@ i8254_initclocks(void) stathz = 128; profhz = 1024; /* XXX does not divide into 1 billion */ clockintr_init(0); +} +void +i8254_start_both_clocks(void) +{ clockintr_cpu_init(NULL); /* Index: arch/arm/cortex/agtimer.c =================================================================== RCS file: /cvs/src/sys/arch/arm/cortex/agtimer.c,v retrieving revision 1.18 diff -u -p -r1.18 agtimer.c --- arch/arm/cortex/agtimer.c 25 Jul 2023 18:16:19 -0000 1.18 +++ arch/arm/cortex/agtimer.c 19 Aug 2023 18:16:19 -0000 @@ -227,7 +227,6 @@ void agtimer_cpu_initclocks(void) { struct agtimer_softc *sc = agtimer_cd.cd_devs[0]; - uint32_t reg; stathz = hz; profhz = stathz * 10; @@ -237,21 +236,11 @@ agtimer_cpu_initclocks(void) agtimer_set_clockrate(agtimer_frequency); } - clockintr_cpu_init(&agtimer_intrclock); - /* Setup secure and non-secure timer IRQs. */ arm_intr_establish_fdt_idx(sc->sc_node, 0, IPL_CLOCK, agtimer_intr, NULL, "tick"); arm_intr_establish_fdt_idx(sc->sc_node, 1, IPL_CLOCK, agtimer_intr, NULL, "tick"); - - reg = agtimer_get_ctrl(); - reg &= ~GTIMER_CNTP_CTL_IMASK; - reg |= GTIMER_CNTP_CTL_ENABLE; - agtimer_set_tval(INT32_MAX); - agtimer_set_ctrl(reg); - - clockintr_trigger(); } void Index: arch/arm/cortex/amptimer.c =================================================================== RCS file: /cvs/src/sys/arch/arm/cortex/amptimer.c,v retrieving revision 1.17 diff -u -p -r1.17 amptimer.c --- arch/arm/cortex/amptimer.c 25 Jul 2023 18:16:19 -0000 1.17 +++ arch/arm/cortex/amptimer.c 19 Aug 2023 18:16:19 -0000 @@ -301,10 +301,6 @@ amptimer_cpu_initclocks(void) /* Enable private timer counter and interrupt. */ bus_space_write_4(sc->sc_iot, sc->sc_pioh, PTIMER_CTRL, (PTIMER_CTRL_ENABLE | PTIMER_CTRL_IRQEN)); - - /* Start the clock interrupt cycle. */ - clockintr_cpu_init(&timer_intrclock); - clockintr_trigger(); } void Index: arch/arm/include/cpu.h =================================================================== RCS file: /cvs/src/sys/arch/arm/include/cpu.h,v retrieving revision 1.63 diff -u -p -r1.63 cpu.h --- arch/arm/include/cpu.h 25 Jul 2023 18:16:19 -0000 1.63 +++ arch/arm/include/cpu.h 19 Aug 2023 18:16:19 -0000 @@ -329,8 +329,6 @@ intr_restore(u_long cpsr) __asm volatile ("msr cpsr_c, %0" :: "r"(cpsr)); } -void cpu_startclock(void); - #endif /* _KERNEL */ #ifdef MULTIPROCESSOR Index: arch/armv7/omap/dmtimer.c =================================================================== RCS file: /cvs/src/sys/arch/armv7/omap/dmtimer.c,v retrieving revision 1.19 diff -u -p -r1.19 dmtimer.c --- arch/armv7/omap/dmtimer.c 25 Jul 2023 18:16:19 -0000 1.19 +++ arch/armv7/omap/dmtimer.c 19 Aug 2023 18:16:21 -0000 @@ -102,6 +102,7 @@ int dmtimer_intr(void *frame); void dmtimer_reset_tisr(void); void dmtimer_wait(int reg); void dmtimer_cpu_initclocks(void); +void dmtimer_cpu_startclock(void); void dmtimer_delay(u_int); void dmtimer_setstatclockrate(int newhz); @@ -195,7 +196,7 @@ dmtimer_attach(struct device *parent, st dmtimer_timecounter.tc_priv = sc; tc_init(&dmtimer_timecounter); arm_clock_register(dmtimer_cpu_initclocks, dmtimer_delay, - dmtimer_setstatclockrate, NULL); + dmtimer_setstatclockrate, dmtimer_cpu_startclock); } else panic("attaching too many dmtimers at 0x%lx", @@ -247,7 +248,11 @@ dmtimer_cpu_initclocks(void) bus_space_write_4(sc->sc_iot, sc->sc_ioh[0], DM_TLDR, 0); bus_space_write_4(sc->sc_iot, sc->sc_ioh[0], DM_TIER, DM_TIER_OVF_EN); bus_space_write_4(sc->sc_iot, sc->sc_ioh[0], DM_TWER, DM_TWER_OVF_EN); +} +void +dmtimer_cpu_startclock(void) +{ /* start the clock interrupt cycle */ clockintr_cpu_init(&dmtimer_intrclock); clockintr_trigger(); Index: arch/armv7/omap/gptimer.c =================================================================== RCS file: /cvs/src/sys/arch/armv7/omap/gptimer.c,v retrieving revision 1.20 diff -u -p -r1.20 gptimer.c --- arch/armv7/omap/gptimer.c 25 Jul 2023 18:16:19 -0000 1.20 +++ arch/armv7/omap/gptimer.c 19 Aug 2023 18:16:21 -0000 @@ -99,6 +99,7 @@ void gptimer_attach(struct device *paren int gptimer_intr(void *frame); void gptimer_wait(int reg); void gptimer_cpu_initclocks(void); +void gptimer_cpu_startclock(void); void gptimer_delay(u_int); void gptimer_reset_tisr(void); void gptimer_setstatclockrate(int newhz); @@ -176,7 +177,7 @@ gptimer_attach(struct device *parent, st aa->aa_dev->mem[0].addr); arm_clock_register(gptimer_cpu_initclocks, gptimer_delay, - gptimer_setstatclockrate, NULL); + gptimer_setstatclockrate, gptimer_cpu_startclock); } int @@ -216,7 +217,11 @@ gptimer_cpu_initclocks(void) gptimer_wait(GP_TWPS_ALL); bus_space_write_4(gptimer_iot, gptimer_ioh0, GP_TWER, GP_TWER_OVF_EN); gptimer_wait(GP_TWPS_ALL); +} +void +gptimer_cpu_startclock(void) +{ /* start the clock interrupt cycle */ clockintr_cpu_init(&gptimer_intrclock); clockintr_trigger(); Index: arch/armv7/sunxi/sxitimer.c =================================================================== RCS file: /cvs/src/sys/arch/armv7/sunxi/sxitimer.c,v retrieving revision 1.21 diff -u -p -r1.21 sxitimer.c --- arch/armv7/sunxi/sxitimer.c 25 Jul 2023 18:16:19 -0000 1.21 +++ arch/armv7/sunxi/sxitimer.c 19 Aug 2023 18:16:21 -0000 @@ -77,6 +77,7 @@ void sxitimer_attach(struct device *, st int sxitimer_tickintr(void *); int sxitimer_statintr(void *); void sxitimer_cpu_initclocks(void); +void sxitimer_cpu_startclock(void); void sxitimer_setstatclockrate(int); uint64_t sxitimer_readcnt64(void); uint32_t sxitimer_readcnt32(void); @@ -191,7 +192,7 @@ sxitimer_attach(struct device *parent, s tc_init(&sxitimer_timecounter); arm_clock_register(sxitimer_cpu_initclocks, sxitimer_delay, - sxitimer_setstatclockrate, NULL); + sxitimer_setstatclockrate, sxitimer_cpu_startclock); printf(": %d kHz", sxitimer_freq[CNTRTIMER] / 1000); @@ -229,7 +230,11 @@ sxitimer_cpu_initclocks(void) bus_space_write_4(sxitimer_iot, sxitimer_ioh, TIMER_CTRL(CNTRTIMER), ctrl | TIMER_ENABLE | TIMER_RELOAD | TIMER_CONTINOUS); +} +void +sxitimer_cpu_startclock(void) +{ /* start clock interrupt cycle */ clockintr_cpu_init(&sxitimer_intrclock); clockintr_trigger(); Index: arch/arm64/dev/agtimer.c =================================================================== RCS file: /cvs/src/sys/arch/arm64/dev/agtimer.c,v retrieving revision 1.25 diff -u -p -r1.25 agtimer.c --- arch/arm64/dev/agtimer.c 11 Aug 2023 01:28:19 -0000 1.25 +++ arch/arm64/dev/agtimer.c 19 Aug 2023 18:16:21 -0000 @@ -290,8 +290,6 @@ void agtimer_cpu_initclocks(void) { struct agtimer_softc *sc = agtimer_cd.cd_devs[0]; - uint32_t reg; - uint64_t kctl; stathz = hz; profhz = stathz * 10; @@ -304,20 +302,6 @@ agtimer_cpu_initclocks(void) /* configure virtual timer interrupt */ sc->sc_ih = arm_intr_establish_fdt_idx(sc->sc_node, 2, IPL_CLOCK|IPL_MPSAFE, agtimer_intr, NULL, "tick"); - - clockintr_cpu_init(&agtimer_intrclock); - - reg = agtimer_get_ctrl(); - reg &= ~GTIMER_CNTV_CTL_IMASK; - reg |= GTIMER_CNTV_CTL_ENABLE; - agtimer_set_tval(INT32_MAX); - agtimer_set_ctrl(reg); - - clockintr_trigger(); - - /* enable userland access to virtual counter */ - kctl = READ_SPECIALREG(CNTKCTL_EL1); - WRITE_SPECIALREG(CNTKCTL_EL1, kctl | CNTKCTL_EL0VCTEN); } void @@ -343,7 +327,8 @@ agtimer_startclock(void) uint64_t kctl; uint32_t reg; - arm_intr_route(sc->sc_ih, 1, curcpu()); + if (!CPU_IS_PRIMARY(curcpu())) + arm_intr_route(sc->sc_ih, 1, curcpu()); clockintr_cpu_init(&agtimer_intrclock); Index: arch/arm64/include/cpu.h =================================================================== RCS file: /cvs/src/sys/arch/arm64/include/cpu.h,v retrieving revision 1.38 diff -u -p -r1.38 cpu.h --- arch/arm64/include/cpu.h 25 Jul 2023 18:16:20 -0000 1.38 +++ arch/arm64/include/cpu.h 19 Aug 2023 18:16:21 -0000 @@ -344,7 +344,6 @@ intr_restore(u_long daif) } void cpu_halt(void); -void cpu_startclock(void); int cpu_suspend_primary(void); void cpu_resume_secondary(struct cpu_info *); Index: arch/hppa/dev/clock.c =================================================================== RCS file: /cvs/src/sys/arch/hppa/dev/clock.c,v retrieving revision 1.36 diff -u -p -r1.36 clock.c --- arch/hppa/dev/clock.c 25 Jul 2023 18:16:20 -0000 1.36 +++ arch/hppa/dev/clock.c 19 Aug 2023 18:16:21 -0000 @@ -120,8 +120,6 @@ cpu_initclocks(void) itmr_nsec_cycle_ratio = itmr_freq * (1ULL << 32) / 1000000000; itmr_nsec_max = UINT64_MAX / itmr_nsec_cycle_ratio; - - cpu_startclock(); } void Index: arch/hppa/include/cpu.h =================================================================== RCS file: /cvs/src/sys/arch/hppa/include/cpu.h,v retrieving revision 1.100 diff -u -p -r1.100 cpu.h --- arch/hppa/include/cpu.h 25 Jul 2023 18:16:20 -0000 1.100 +++ arch/hppa/include/cpu.h 19 Aug 2023 18:16:21 -0000 @@ -241,7 +241,6 @@ int copy_on_fault(void); void proc_trampoline(void); int cpu_dumpsize(void); int cpu_dump(void); -void cpu_startclock(void); static inline unsigned int cpu_rnd_messybits(void) Index: arch/i386/i386/lapic.c =================================================================== RCS file: /cvs/src/sys/arch/i386/i386/lapic.c,v retrieving revision 1.55 diff -u -p -r1.55 lapic.c --- arch/i386/i386/lapic.c 9 Feb 2023 01:41:15 -0000 1.55 +++ arch/i386/i386/lapic.c 19 Aug 2023 18:16:21 -0000 @@ -327,8 +327,6 @@ lapic_initclocks(void) stathz = hz; profhz = stathz * 10; clockintr_init(CL_RNDSTAT); - - lapic_startclock(); } extern int gettick(void); /* XXX put in header file */ @@ -422,6 +420,7 @@ lapic_calibrate_timer(struct cpu_info *c lapic_per_second * (1ULL << 32) / 1000000000; lapic_timer_nsec_max = UINT64_MAX / lapic_timer_nsec_cycle_ratio; initclock_func = lapic_initclocks; + startclock_func = lapic_startclock; } /* Index: arch/i386/i386/machdep.c =================================================================== RCS file: /cvs/src/sys/arch/i386/i386/machdep.c,v retrieving revision 1.668 diff -u -p -r1.668 machdep.c --- arch/i386/i386/machdep.c 16 Aug 2023 09:51:39 -0000 1.668 +++ arch/i386/i386/machdep.c 19 Aug 2023 18:16:24 -0000 @@ -233,6 +233,7 @@ void (*cpusensors_setup)(struct cpu_info void (*delay_func)(int) = i8254_delay; void (*initclock_func)(void) = i8254_initclocks; +void (*startclock_func)(void) = i8254_start_both_clocks; /* * Extent maps to manage I/O and ISA memory hole space. Allocate @@ -3436,6 +3437,12 @@ void cpu_initclocks(void) { (*initclock_func)(); /* lapic or i8254 */ +} + +void +cpu_startclock(void) +{ + (*startclock_func)(); } void Index: arch/i386/include/cpu.h =================================================================== RCS file: /cvs/src/sys/arch/i386/include/cpu.h,v retrieving revision 1.182 diff -u -p -r1.182 cpu.h --- arch/i386/include/cpu.h 25 Jul 2023 18:16:20 -0000 1.182 +++ arch/i386/include/cpu.h 19 Aug 2023 18:16:27 -0000 @@ -399,6 +399,9 @@ extern int i386_has_sse2; extern void (*update_cpuspeed)(void); +extern void (*initclock_func)(void); +extern void (*startclock_func)(void); + /* machdep.c */ void dumpconf(void); void cpu_reset(void); @@ -416,7 +419,6 @@ void switch_exit(struct proc *); void proc_trampoline(void); /* clock.c */ -extern void (*initclock_func)(void); void startclocks(void); void rtcinit(void); void rtcstart(void); @@ -424,6 +426,7 @@ void rtcstop(void); void i8254_delay(int); void i8254_initclocks(void); void i8254_startclock(void); +void i8254_start_both_clocks(void); void i8254_inittimecounter(void); void i8254_inittimecounter_simple(void); Index: arch/i386/isa/clock.c =================================================================== RCS file: /cvs/src/sys/arch/i386/isa/clock.c,v retrieving revision 1.65 diff -u -p -r1.65 clock.c --- arch/i386/isa/clock.c 25 Jul 2023 18:16:20 -0000 1.65 +++ arch/i386/isa/clock.c 19 Aug 2023 18:16:27 -0000 @@ -427,7 +427,11 @@ i8254_initclocks(void) stathz = 128; profhz = 1024; /* XXX does not divide into 1 billion */ clockintr_init(0); +} +void +i8254_start_both_clocks(void) +{ clockintr_cpu_init(NULL); /* When using i8254 for clock, we also use the rtc for profclock */ Index: arch/luna88k/luna88k/clock.c =================================================================== RCS file: /cvs/src/sys/arch/luna88k/luna88k/clock.c,v retrieving revision 1.17 diff -u -p -r1.17 clock.c --- arch/luna88k/luna88k/clock.c 25 Jul 2023 18:16:20 -0000 1.17 +++ arch/luna88k/luna88k/clock.c 19 Aug 2023 18:16:27 -0000 @@ -139,7 +139,11 @@ cpu_initclocks() stathz = hz; profhz = stathz; clockintr_init(0); +} +void +cpu_startclock(void) +{ clockintr_cpu_init(NULL); clockinitted = 1; Index: arch/macppc/macppc/clock.c =================================================================== RCS file: /cvs/src/sys/arch/macppc/macppc/clock.c,v retrieving revision 1.55 diff -u -p -r1.55 clock.c --- arch/macppc/macppc/clock.c 25 Jul 2023 18:16:20 -0000 1.55 +++ arch/macppc/macppc/clock.c 19 Aug 2023 18:16:35 -0000 @@ -147,8 +147,6 @@ decr_intr(struct clockframe *frame) (void) ppc_intr_disable(); } -void cpu_startclock(void); - void cpu_initclocks(void) { @@ -204,15 +202,13 @@ cpu_initclocks(void) evcount_attach(&clk_count, "clock", &clk_irq); - clock_initialized = 1; - cpu_startclock(); - ppc_intr_enable(intrstate); } void cpu_startclock(void) { + clock_initialized = 1; clockintr_cpu_init(&dec_intrclock); clockintr_trigger(); } Index: arch/mips64/mips64/mips64_machdep.c =================================================================== RCS file: /cvs/src/sys/arch/mips64/mips64/mips64_machdep.c,v retrieving revision 1.42 diff -u -p -r1.42 mips64_machdep.c --- arch/mips64/mips64/mips64_machdep.c 25 Jul 2023 18:16:20 -0000 1.42 +++ arch/mips64/mips64/mips64_machdep.c 19 Aug 2023 18:16:35 -0000 @@ -322,12 +322,16 @@ cpu_initclocks(void) (uint64_t)ci->ci_hw.clock / CP0_CYCLE_DIVIDER; tc_init(&cp0_timecounter); } +} +void +cpu_startclock(void) +{ #ifdef DIAGNOSTIC if (md_startclock == NULL) panic("no clock"); #endif - (*md_startclock)(ci); + (*md_startclock)(curcpu()); } void Index: arch/powerpc64/powerpc64/clock.c =================================================================== RCS file: /cvs/src/sys/arch/powerpc64/powerpc64/clock.c,v retrieving revision 1.11 diff -u -p -r1.11 clock.c --- arch/powerpc64/powerpc64/clock.c 25 Jul 2023 18:16:21 -0000 1.11 +++ arch/powerpc64/powerpc64/clock.c 19 Aug 2023 18:16:35 -0000 @@ -53,8 +53,6 @@ static struct timecounter tb_timecounter .tc_user = TC_TB, }; -void cpu_startclock(void); - void dec_rearm(void *unused, uint64_t nsecs) { @@ -99,8 +97,6 @@ cpu_initclocks(void) clockintr_init(CL_RNDSTAT); evcount_attach(&clock_count, "clock", NULL); - - cpu_startclock(); } void Index: arch/powerpc64/include/cpu.h =================================================================== RCS file: /cvs/src/sys/arch/powerpc64/include/cpu.h,v retrieving revision 1.33 diff -u -p -r1.33 cpu.h --- arch/powerpc64/include/cpu.h 29 Nov 2022 01:04:44 -0000 1.33 +++ arch/powerpc64/include/cpu.h 19 Aug 2023 18:16:35 -0000 @@ -153,7 +153,6 @@ curcpu(void) void cpu_kick(struct cpu_info *); void cpu_unidle(struct cpu_info *); void cpu_boot_secondary_processors(void); -void cpu_startclock(void); extern void (*ul_setperf)(int); void mp_setperf(int); Index: arch/riscv64/riscv64/clock.c =================================================================== RCS file: /cvs/src/sys/arch/riscv64/riscv64/clock.c,v retrieving revision 1.10 diff -u -p -r1.10 clock.c --- arch/riscv64/riscv64/clock.c 25 Jul 2023 18:16:21 -0000 1.10 +++ arch/riscv64/riscv64/clock.c 19 Aug 2023 18:16:35 -0000 @@ -56,7 +56,6 @@ static struct timecounter tb_timecounter .tc_user = TC_TB, }; -void cpu_startclock(void); int clock_intr(void *); void @@ -100,8 +99,6 @@ cpu_initclocks(void) evcount_attach(&clock_count, "clock", NULL); evcount_percpu(&clock_count); - - cpu_startclock(); } void Index: arch/riscv64/include/cpu.h =================================================================== RCS file: /cvs/src/sys/arch/riscv64/include/cpu.h,v retrieving revision 1.17 diff -u -p -r1.17 cpu.h --- arch/riscv64/include/cpu.h 5 Aug 2023 05:45:52 -0000 1.17 +++ arch/riscv64/include/cpu.h 19 Aug 2023 18:16:38 -0000 @@ -171,7 +171,6 @@ extern struct cpu_info *cpu_info_list; extern struct cpu_info *cpu_info[MAXCPUS]; void cpu_boot_secondary_processors(void); -void cpu_startclock(void); #endif /* !MULTIPROCESSOR */ Index: arch/sh/sh/clock.c =================================================================== RCS file: /cvs/src/sys/arch/sh/sh/clock.c,v retrieving revision 1.15 diff -u -p -r1.15 clock.c --- arch/sh/sh/clock.c 25 Jul 2023 18:16:21 -0000 1.15 +++ arch/sh/sh/clock.c 19 Aug 2023 18:16:38 -0000 @@ -260,7 +260,11 @@ cpu_initclocks(void) stathz = hz; profhz = stathz; clockintr_init(0); +} +void +cpu_startclock(void) +{ clockintr_cpu_init(NULL); /* Index: arch/sparc64/sparc64/clock.c =================================================================== RCS file: /cvs/src/sys/arch/sparc64/sparc64/clock.c,v retrieving revision 1.79 diff -u -p -r1.79 clock.c --- arch/sparc64/sparc64/clock.c 7 Aug 2023 17:11:13 -0000 1.79 +++ arch/sparc64/sparc64/clock.c 19 Aug 2023 18:16:38 -0000 @@ -562,7 +562,11 @@ cpu_initclocks(void) for (ci = cpus; ci != NULL; ci = ci->ci_next) memcpy(&ci->ci_tickintr, &level0, sizeof(level0)); +} +void +cpu_startclock(void) +{ cpu_start_clock(); }