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

Reply via email to