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(&amptimer_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();
 }
 

Reply via email to