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? 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 13 Aug 2023 18:45:30 -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 13 Aug 2023 18:45:30 -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 13 Aug 2023 18:45:30 -0000 @@ -143,7 +143,7 @@ clockattach(dev, fns) */ /* - * Start the real-time and statistics clocks. + * Measure and initialize clock frequencies. */ void cpu_initclocks(void) @@ -193,7 +193,14 @@ cpu_initclocks(void) stathz = hz; profhz = stathz; clockintr_init(0); +} +/* + * Start the real-time and statistics clocks. + */ +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 13 Aug 2023 18:45:31 -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 13 Aug 2023 18:45:31 -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 13 Aug 2023 18:45:31 -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 13 Aug 2023 18:45:31 -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 13 Aug 2023 18:45:31 -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 13 Aug 2023 18:45:31 -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/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 13 Aug 2023 18:45:31 -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 13 Aug 2023 18:45:31 -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 13 Aug 2023 18:45:31 -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 13 Aug 2023 18:45:31 -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/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 13 Aug 2023 18:45:31 -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/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 13 Aug 2023 18:45:32 -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.666 diff -u -p -r1.666 machdep.c --- arch/i386/i386/machdep.c 9 Aug 2023 00:01:44 -0000 1.666 +++ arch/i386/i386/machdep.c 13 Aug 2023 18:45:32 -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 @@ -3434,6 +3435,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 13 Aug 2023 18:45:32 -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 13 Aug 2023 18:45:32 -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 13 Aug 2023 18:45:32 -0000 @@ -119,7 +119,7 @@ struct timecounter clock_tc = { }; /* - * Start the real-time and statistics clocks. + * Initialize clock frequencies. */ void cpu_initclocks() @@ -139,7 +139,14 @@ cpu_initclocks() stathz = hz; profhz = stathz; clockintr_init(0); +} +/* + * Start the real-time and statistics clocks. + */ +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 13 Aug 2023 18:45:32 -0000 @@ -147,8 +147,6 @@ decr_intr(struct clockframe *frame) (void) ppc_intr_disable(); } -void cpu_startclock(void); - void cpu_initclocks(void) { @@ -204,9 +202,6 @@ cpu_initclocks(void) evcount_attach(&clk_count, "clock", &clk_irq); - clock_initialized = 1; - cpu_startclock(); - ppc_intr_enable(intrstate); } @@ -214,6 +209,7 @@ void cpu_startclock(void) { clockintr_cpu_init(&dec_intrclock); + clock_initialized = 1; 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 13 Aug 2023 18:45:32 -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 13 Aug 2023 18:45:32 -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/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 13 Aug 2023 18:45:32 -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/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 13 Aug 2023 18:45:32 -0000 @@ -245,7 +245,7 @@ rtc_settime(struct todr_chip_handle *han } /* - * Start the clock interrupt. + * Initialize clock frequencies. */ void cpu_initclocks(void) @@ -260,7 +260,14 @@ cpu_initclocks(void) stathz = hz; profhz = stathz; clockintr_init(0); +} +/* + * Start the clock interrupt. + */ +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 13 Aug 2023 18:45:32 -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(); }