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