Hello, and sorry for delay.

OpenBSD/luna88k GENERIC.MP kernel with your diff boots up normally on my real hardware. I am trying to "make build" on that kernel and it is working now, maybe it takes more 1~2 days.

-- aoyama

On 2023/08/20 3:44, Scott Cheloha wrote:
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