all platforms: separate cpu_initclocks() from cpu_startclock()
authorcheloha <cheloha@openbsd.org>
Wed, 23 Aug 2023 01:55:45 +0000 (01:55 +0000)
committercheloha <cheloha@openbsd.org>
Wed, 23 Aug 2023 01:55:45 +0000 (01:55 +0000)
To give the primary CPU an opportunity to perform clock interrupt
preparation in a machine-independent manner we need to separate the
"initialization" parts of cpu_initclocks() from the "start the clock
interrupt" parts.  Currently, cpu_initclocks() does everything all at
once, so there is no space for this MI setup.

Many platforms have more-or-less already done this separation by
implementing a separate routine named "cpu_startclock()".  This patch
promotes cpu_startclock() from de facto standard to mandatory API.

- Prototype cpu_startclock() in sys/systm.h alongside cpu_initclocks().
  The separation of responsibility between the two routines is a bit
  fuzzy but the basic guidelines are as follows:

  + cpu_initclocks() must initialize hz, stathz, and profhz, and call
    clockintr_init().

  + cpu_startclock() must call clockintr_cpu_init() and start the clock
    interrupt cycle on the calling CPU.

  These guidelines will shift in the future, but that's the way things
  stand as of *this* commit.

- In initclocks(): first call cpu_initclocks(), then do MI setup, and
  last call cpu_startclock().

- On platforms where cpu_startclock() already exists: don't call
  cpu_startclock() from cpu_initclocks() anymore.

- On platforms where cpu_startclock() doesn't yet exist: implement it.
  Usually this is as simple as dividing cpu_initclocks() in two.

Tested on amd64 (i8254, lapic), arm64, i386 (i8254, lapic), macppc,
mips64/octeon, and sparc64.  Tested on arm/armv7 (agtimer(4)) by
phessler@ and jmatthew@.  Tested on m88k/luna88k by aoyama@.  Tested
on powerpc64 by gkoehler@ and mlarkin@.  Tested on riscv64 by
jmatthew@.

Thread: https://marc.info/?l=openbsd-tech&m=169195251322149&w=2

32 files changed:
sys/arch/alpha/alpha/clock.c
sys/arch/amd64/amd64/lapic.c
sys/arch/amd64/amd64/machdep.c
sys/arch/amd64/include/cpu.h
sys/arch/amd64/isa/clock.c
sys/arch/arm/cortex/agtimer.c
sys/arch/arm/cortex/amptimer.c
sys/arch/arm/include/cpu.h
sys/arch/arm64/dev/agtimer.c
sys/arch/arm64/include/cpu.h
sys/arch/armv7/omap/dmtimer.c
sys/arch/armv7/omap/gptimer.c
sys/arch/armv7/sunxi/sxitimer.c
sys/arch/hppa/dev/clock.c
sys/arch/hppa/include/cpu.h
sys/arch/i386/i386/lapic.c
sys/arch/i386/i386/machdep.c
sys/arch/i386/include/cpu.h
sys/arch/i386/isa/clock.c
sys/arch/luna88k/luna88k/clock.c
sys/arch/macppc/macppc/clock.c
sys/arch/mips64/include/cpu.h
sys/arch/mips64/mips64/clock.c
sys/arch/mips64/mips64/mips64_machdep.c
sys/arch/powerpc64/include/cpu.h
sys/arch/powerpc64/powerpc64/clock.c
sys/arch/riscv64/include/cpu.h
sys/arch/riscv64/riscv64/clock.c
sys/arch/sh/sh/clock.c
sys/arch/sparc64/sparc64/clock.c
sys/kern/kern_clock.c
sys/sys/systm.h

index c03cd35..dd3ad3f 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: clock.c,v 1.29 2023/08/21 15:19:09 cheloha Exp $      */
+/*     $OpenBSD: clock.c,v 1.30 2023/08/23 01:55:45 cheloha Exp $      */
 /*     $NetBSD: clock.c,v 1.29 2000/06/05 21:47:10 thorpej Exp $       */
 
 /*
@@ -192,7 +192,11 @@ cpu_initclocks(void)
        stathz = hz;
        profhz = stathz;
        clockintr_init(0);
+}
 
+void
+cpu_startclock(void)
+{
        clockintr_cpu_init(NULL);
 
        /*
index da17b08..4e7182e 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: lapic.c,v 1.68 2023/04/26 10:52:55 mlarkin Exp $      */
+/*     $OpenBSD: lapic.c,v 1.69 2023/08/23 01:55:46 cheloha Exp $      */
 /* $NetBSD: lapic.c,v 1.2 2003/05/08 01:04:35 fvdl Exp $ */
 
 /*-
@@ -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 453de13..8c5f398 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: machdep.c,v 1.286 2023/07/27 00:28:25 guenther Exp $  */
+/*     $OpenBSD: machdep.c,v 1.287 2023/08/23 01:55:45 cheloha Exp $   */
 /*     $NetBSD: machdep.c,v 1.3 2003/05/07 22:58:18 fvdl Exp $ */
 
 /*-
@@ -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
@@ -1880,6 +1881,12 @@ cpu_initclocks(void)
        (*initclock_func)();
 }
 
+void
+cpu_startclock(void)
+{
+       (*startclock_func)();
+}
+
 void
 need_resched(struct cpu_info *ci)
 {
index cf32288..9069c3d 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: cpu.h,v 1.158 2023/07/27 00:28:24 guenther Exp $      */
+/*     $OpenBSD: cpu.h,v 1.159 2023/08/23 01:55:46 cheloha Exp $       */
 /*     $NetBSD: cpu.h,v 1.1 2003/04/26 18:39:39 fvdl Exp $     */
 
 /*-
@@ -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 (*)(struct proc *));
 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 019259f..3dd79b1 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: clock.c,v 1.40 2023/07/25 18:16:19 cheloha Exp $      */
+/*     $OpenBSD: clock.c,v 1.41 2023/08/23 01:55:46 cheloha Exp $      */
 /*     $NetBSD: clock.c,v 1.1 2003/04/26 18:39:50 fvdl Exp $   */
 
 /*-
@@ -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 13b0af6..88e201a 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: agtimer.c,v 1.18 2023/07/25 18:16:19 cheloha Exp $ */
+/* $OpenBSD: agtimer.c,v 1.19 2023/08/23 01:55:46 cheloha Exp $ */
 /*
  * Copyright (c) 2011 Dale Rahn <drahn@openbsd.org>
  * Copyright (c) 2013 Patrick Wildt <patrick@blueri.se>
@@ -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 6fcf495..299f9fe 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: amptimer.c,v 1.17 2023/07/25 18:16:19 cheloha Exp $ */
+/* $OpenBSD: amptimer.c,v 1.18 2023/08/23 01:55:46 cheloha Exp $ */
 /*
  * Copyright (c) 2011 Dale Rahn <drahn@openbsd.org>
  *
@@ -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 986e179..1ced238 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: cpu.h,v 1.63 2023/07/25 18:16:19 cheloha Exp $        */
+/*     $OpenBSD: cpu.h,v 1.64 2023/08/23 01:55:46 cheloha Exp $        */
 /*     $NetBSD: cpu.h,v 1.34 2003/06/23 11:01:08 martin Exp $  */
 
 /*
@@ -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 32f0688..14fb14f 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: agtimer.c,v 1.25 2023/08/11 01:28:19 cheloha Exp $ */
+/* $OpenBSD: agtimer.c,v 1.26 2023/08/23 01:55:46 cheloha Exp $ */
 /*
  * Copyright (c) 2011 Dale Rahn <drahn@openbsd.org>
  * Copyright (c) 2013 Patrick Wildt <patrick@blueri.se>
@@ -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 ab9fdcb..ec514d8 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: cpu.h,v 1.38 2023/07/25 18:16:20 cheloha Exp $ */
+/* $OpenBSD: cpu.h,v 1.39 2023/08/23 01:55:46 cheloha Exp $ */
 /*
  * Copyright (c) 2016 Dale Rahn <drahn@dalerahn.com>
  *
@@ -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 2d09951..985428b 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: dmtimer.c,v 1.19 2023/07/25 18:16:19 cheloha Exp $    */
+/*     $OpenBSD: dmtimer.c,v 1.20 2023/08/23 01:55:46 cheloha Exp $    */
 /*
  * Copyright (c) 2007,2009 Dale Rahn <drahn@openbsd.org>
  * Copyright (c) 2013 Raphael Graf <r@undefined.ch>
@@ -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, struct device *self, void *args)
                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 6cac9de..72cf3e0 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: gptimer.c,v 1.20 2023/07/25 18:16:19 cheloha Exp $ */
+/* $OpenBSD: gptimer.c,v 1.21 2023/08/23 01:55:46 cheloha Exp $ */
 /*
  * Copyright (c) 2007,2009 Dale Rahn <drahn@openbsd.org>
  *
@@ -99,6 +99,7 @@ void gptimer_attach(struct device *parent, struct device *self, void *args);
 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, struct device *self, void *args)
                    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 9383282..81b36f9 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: sxitimer.c,v 1.21 2023/07/25 18:16:19 cheloha Exp $   */
+/*     $OpenBSD: sxitimer.c,v 1.22 2023/08/23 01:55:46 cheloha Exp $   */
 /*
  * Copyright (c) 2007,2009 Dale Rahn <drahn@openbsd.org>
  * Copyright (c) 2013 Raphael Graf <r@undefined.ch>
@@ -77,6 +77,7 @@ void  sxitimer_attach(struct device *, struct device *, void *);
 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, struct device *self, void *aux)
        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 8e5a10e..2bae218 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: clock.c,v 1.36 2023/07/25 18:16:20 cheloha Exp $      */
+/*     $OpenBSD: clock.c,v 1.37 2023/08/23 01:55:46 cheloha Exp $      */
 
 /*
  * Copyright (c) 1998-2003 Michael Shalayeff
@@ -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 91b7de9..6b21bcb 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: cpu.h,v 1.100 2023/07/25 18:16:20 cheloha Exp $       */
+/*     $OpenBSD: cpu.h,v 1.101 2023/08/23 01:55:46 cheloha Exp $       */
 
 /*
  * Copyright (c) 2000-2004 Michael Shalayeff
@@ -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 fae8f71..49d9dfc 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: lapic.c,v 1.55 2023/02/09 01:41:15 cheloha Exp $      */
+/*     $OpenBSD: lapic.c,v 1.56 2023/08/23 01:55:46 cheloha Exp $      */
 /* $NetBSD: lapic.c,v 1.1.2.8 2000/02/23 06:10:50 sommerfeld Exp $ */
 
 /*-
@@ -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 *ci)
            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 9ce0882..2599def 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: machdep.c,v 1.668 2023/08/16 09:51:39 jsg Exp $       */
+/*     $OpenBSD: machdep.c,v 1.669 2023/08/23 01:55:46 cheloha Exp $   */
 /*     $NetBSD: machdep.c,v 1.214 1996/11/10 03:16:17 thorpej Exp $    */
 
 /*-
@@ -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
@@ -3438,6 +3439,12 @@ cpu_initclocks(void)
        (*initclock_func)();            /* lapic or i8254 */
 }
 
+void
+cpu_startclock(void)
+{
+       (*startclock_func)();
+}
+
 void
 need_resched(struct cpu_info *ci)
 {
index 2496ba3..297344b 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: cpu.h,v 1.182 2023/07/25 18:16:20 cheloha Exp $       */
+/*     $OpenBSD: cpu.h,v 1.183 2023/08/23 01:55:46 cheloha Exp $       */
 /*     $NetBSD: cpu.h,v 1.35 1996/05/05 19:29:26 christos Exp $        */
 
 /*-
@@ -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 563feaa..630be76 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: clock.c,v 1.66 2023/08/22 17:13:22 cheloha Exp $      */
+/*     $OpenBSD: clock.c,v 1.67 2023/08/23 01:55:46 cheloha Exp $      */
 /*     $NetBSD: clock.c,v 1.39 1996/05/12 23:11:54 mycroft Exp $       */
 
 /*-
@@ -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);
 
        /*
index 479bf89..2dd6d91 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: clock.c,v 1.17 2023/07/25 18:16:20 cheloha Exp $ */
+/* $OpenBSD: clock.c,v 1.18 2023/08/23 01:55:47 cheloha Exp $ */
 /* $NetBSD: clock.c,v 1.2 2000/01/11 10:29:35 nisimura Exp $ */
 
 /*
@@ -139,7 +139,11 @@ cpu_initclocks()
        stathz = hz;
        profhz = stathz;
        clockintr_init(0);
+}
 
+void
+cpu_startclock(void)
+{
        clockintr_cpu_init(NULL);
 
        clockinitted = 1;
index 5edfb97..93084b0 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: clock.c,v 1.55 2023/07/25 18:16:20 cheloha Exp $      */
+/*     $OpenBSD: clock.c,v 1.56 2023/08/23 01:55:47 cheloha Exp $      */
 /*     $NetBSD: clock.c,v 1.1 1996/09/30 16:34:40 ws Exp $     */
 
 /*
@@ -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 4b9f194..d647dbb 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: cpu.h,v 1.143 2023/08/05 05:46:36 guenther Exp $      */
+/*     $OpenBSD: cpu.h,v 1.144 2023/08/23 01:55:47 cheloha Exp $       */
 
 /*-
  * Copyright (c) 1992, 1993
@@ -260,6 +260,7 @@ void        smp_rendezvous_cpus(unsigned long, void (*)(void *), void *arg);
 
 #define CPU_BUSY_CYCLE()       do {} while (0)
 
+extern void (*md_initclock)(void);
 extern void (*md_startclock)(struct cpu_info *);
 extern void (*md_triggerclock)(void);
 void   cp0_calibrate(struct cpu_info *);
index 6badea9..afcf68c 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: clock.c,v 1.50 2023/01/18 19:12:43 cheloha Exp $ */
+/*     $OpenBSD: clock.c,v 1.51 2023/08/23 01:55:47 cheloha Exp $ */
 
 /*
  * Copyright (c) 2001-2004 Opsycon AB  (www.opsycon.se / www.opsycon.com)
@@ -70,6 +70,7 @@ const struct intrclock cp0_intrclock = {
        .ic_trigger = cp0_trigger_int5_wrapper
 };
 
+void   cp0_initclock(void);
 uint32_t cp0_int5(uint32_t, struct trapframe *);
 void   cp0_startclock(struct cpu_info *);
 void   cp0_trigger_int5(void);
@@ -104,6 +105,7 @@ clockattach(struct device *parent, struct device *self, void *aux)
        /* try to avoid getting clock interrupts early */
        cp0_set_compare(cp0_get_count() - 1);
 
+       md_initclock = cp0_initclock;
        md_startclock = cp0_startclock;
        md_triggerclock = cp0_trigger_int5;
 }
@@ -232,6 +234,16 @@ cp0_trigger_int5_wrapper(void *unused)
        cp0_trigger_int5();
 }
 
+void
+cp0_initclock(void)
+{
+       KASSERT(CPU_IS_PRIMARY(curcpu()));
+
+       stathz = hz;
+       profhz = stathz * 10;
+       clockintr_init(CL_RNDSTAT);
+}
+
 /*
  * Start the clock interrupt dispatch cycle.
  */
@@ -240,11 +252,7 @@ cp0_startclock(struct cpu_info *ci)
 {
        int s;
 
-       if (CPU_IS_PRIMARY(ci)) {
-               stathz = hz;
-               profhz = stathz * 10;
-               clockintr_init(CL_RNDSTAT);
-       } else {
+       if (!CPU_IS_PRIMARY(ci)) {
                s = splhigh();
                nanouptime(&ci->ci_schedstate.spc_runtime);
                splx(s);
index aaa7a04..a8381d4 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mips64_machdep.c,v 1.42 2023/07/25 18:16:20 cheloha Exp $ */
+/*     $OpenBSD: mips64_machdep.c,v 1.43 2023/08/23 01:55:47 cheloha Exp $ */
 
 /*
  * Copyright (c) 2009, 2010, 2012 Miodrag Vallat.
@@ -219,6 +219,7 @@ tlb_asid_wrap(struct cpu_info *ci)
  *     Mips machine independent clock routines.
  */
 
+void (*md_initclock)(void);
 void (*md_startclock)(struct cpu_info *);
 void (*md_triggerclock)(void);
 
@@ -323,11 +324,18 @@ cpu_initclocks(void)
                tc_init(&cp0_timecounter);
        }
 
+       if (md_initclock != NULL)
+               (*md_initclock)();
+}
+
+void
+cpu_startclock(void)
+{
 #ifdef DIAGNOSTIC
        if (md_startclock == NULL)
                panic("no clock");
 #endif
-       (*md_startclock)(ci);
+       (*md_startclock)(curcpu());
 }
 
 void
index b025539..00f742b 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: cpu.h,v 1.34 2023/08/21 01:35:43 guenther Exp $       */
+/*     $OpenBSD: cpu.h,v 1.35 2023/08/23 01:55:47 cheloha Exp $        */
 
 /*
  * Copyright (c) 2020 Mark Kettenis <kettenis@openbsd.org>
@@ -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 e17cdac..39cab54 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: clock.c,v 1.11 2023/07/25 18:16:21 cheloha Exp $      */
+/*     $OpenBSD: clock.c,v 1.12 2023/08/23 01:55:47 cheloha Exp $      */
 
 /*
  * Copyright (c) 2020 Mark Kettenis <kettenis@openbsd.org>
@@ -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 7bd6c2c..aa1ae17 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: cpu.h,v 1.17 2023/08/05 05:45:52 guenther Exp $       */
+/*     $OpenBSD: cpu.h,v 1.18 2023/08/23 01:55:47 cheloha Exp $        */
 
 /*
  * Copyright (c) 2019 Mike Larkin <mlarkin@openbsd.org>
@@ -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 0648a74..cd8c8ec 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: clock.c,v 1.10 2023/07/25 18:16:21 cheloha Exp $      */
+/*     $OpenBSD: clock.c,v 1.11 2023/08/23 01:55:47 cheloha Exp $      */
 
 /*
  * Copyright (c) 2020 Mark Kettenis <kettenis@openbsd.org>
@@ -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 2e3a8b6..daeedf3 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: clock.c,v 1.15 2023/07/25 18:16:21 cheloha Exp $      */
+/*     $OpenBSD: clock.c,v 1.16 2023/08/23 01:55:47 cheloha Exp $      */
 /*     $NetBSD: clock.c,v 1.32 2006/09/05 11:09:36 uwe Exp $   */
 
 /*-
@@ -260,7 +260,11 @@ cpu_initclocks(void)
        stathz = hz;
        profhz = stathz;
        clockintr_init(0);
+}
 
+void
+cpu_startclock(void)
+{
        clockintr_cpu_init(NULL);
 
        /*
index 0a27a72..9255d57 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: clock.c,v 1.79 2023/08/07 17:11:13 miod Exp $ */
+/*     $OpenBSD: clock.c,v 1.80 2023/08/23 01:55:47 cheloha Exp $      */
 /*     $NetBSD: clock.c,v 1.41 2001/07/24 19:29:25 eeh Exp $ */
 
 /*
@@ -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();
 }
 
index 4c2175e..22b2d60 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: kern_clock.c,v 1.114 2023/08/22 13:46:20 jsg Exp $    */
+/*     $OpenBSD: kern_clock.c,v 1.115 2023/08/23 01:55:45 cheloha Exp $        */
 /*     $NetBSD: kern_clock.c,v 1.34 1996/06/09 04:51:03 briggs Exp $   */
 
 /*-
@@ -103,6 +103,9 @@ initclocks(void)
        profclock_period = 1000000000 / profhz;
 
        inittimecounter();
+
+       /* Start dispatching clock interrupts on the primary CPU. */
+       cpu_startclock();
 }
 
 /*
index 65e7245..9a095f7 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: systm.h,v 1.164 2023/08/05 20:07:56 cheloha Exp $     */
+/*     $OpenBSD: systm.h,v 1.165 2023/08/23 01:55:45 cheloha Exp $     */
 /*     $NetBSD: systm.h,v 1.50 1996/06/09 04:55:09 briggs Exp $        */
 
 /*-
@@ -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 *);