summaryrefslogtreecommitdiff
path: root/sys/arch/i386
diff options
context:
space:
mode:
authorScott Soule Cheloha <cheloha@cvs.openbsd.org>2023-08-23 01:55:48 +0000
committerScott Soule Cheloha <cheloha@cvs.openbsd.org>2023-08-23 01:55:48 +0000
commit03acd21a4e00752d82ce1f3198960b52c475396e (patch)
tree12084f3273f661178be60a73087dc3b53041b423 /sys/arch/i386
parent83fa6d388c3eec5da9f344ef9571ca741627fe5c (diff)
all platforms: separate cpu_initclocks() from cpu_startclock()
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
Diffstat (limited to 'sys/arch/i386')
-rw-r--r--sys/arch/i386/i386/lapic.c5
-rw-r--r--sys/arch/i386/i386/machdep.c9
-rw-r--r--sys/arch/i386/include/cpu.h7
-rw-r--r--sys/arch/i386/isa/clock.c6
4 files changed, 20 insertions, 7 deletions
diff --git a/sys/arch/i386/i386/lapic.c b/sys/arch/i386/i386/lapic.c
index fae8f71cbfc..49d9dfcfe89 100644
--- a/sys/arch/i386/i386/lapic.c
+++ b/sys/arch/i386/i386/lapic.c
@@ -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;
}
/*
diff --git a/sys/arch/i386/i386/machdep.c b/sys/arch/i386/i386/machdep.c
index 9ce08823da5..2599def386c 100644
--- a/sys/arch/i386/i386/machdep.c
+++ b/sys/arch/i386/i386/machdep.c
@@ -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
@@ -3439,6 +3440,12 @@ cpu_initclocks(void)
}
void
+cpu_startclock(void)
+{
+ (*startclock_func)();
+}
+
+void
need_resched(struct cpu_info *ci)
{
ci->ci_want_resched = 1;
diff --git a/sys/arch/i386/include/cpu.h b/sys/arch/i386/include/cpu.h
index 2496ba30140..297344bace9 100644
--- a/sys/arch/i386/include/cpu.h
+++ b/sys/arch/i386/include/cpu.h
@@ -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);
diff --git a/sys/arch/i386/isa/clock.c b/sys/arch/i386/isa/clock.c
index 563feaabf99..630be7642a2 100644
--- a/sys/arch/i386/isa/clock.c
+++ b/sys/arch/i386/isa/clock.c
@@ -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);
/*