This patch switches alpha to clockintr(9).
We have no direct control over the interrupt clock, so the patch is
relatively straightforward.
claudio@ tested this on his DS-20. It compiled and booted. It may
have survived a `make build`, too. claudio's machine is weird though.
Apparently RPCC is not synchronized between CPUs on his machine but it
normally is?
This could use a test on an alpha machine where RPCC is synchronized
between all CPUs.
Notes:
- alpha still has a separate schedclock() running at 16hz. It is the
only platform aside from non-MULTIPROCESSOR sparc64 that still runs
it outside of statclock().
Index: sys/arch/alpha/alpha/clock.c
===================================================================
RCS file: /cvs/src/sys/arch/alpha/alpha/clock.c,v
retrieving revision 1.25
diff -u -p -r1.25 clock.c
--- sys/arch/alpha/alpha/clock.c 23 Feb 2021 04:44:30 -0000 1.25
+++ sys/arch/alpha/alpha/clock.c 6 Nov 2022 18:32:40 -0000
@@ -42,8 +42,10 @@
#include <sys/param.h>
#include <sys/kernel.h>
#include <sys/systm.h>
+#include <sys/clockintr.h>
#include <sys/device.h>
#include <sys/evcount.h>
+#include <sys/sched.h>
#include <sys/timetc.h>
#include <dev/clock_subr.h>
@@ -54,8 +56,6 @@
#include <alpha/alpha/clockvar.h>
-extern int schedhz;
-
struct device *clockdev;
const struct clockfns *clockfns;
@@ -144,8 +144,7 @@ clockattach(dev, fns)
*/
/*
- * Start the real-time and statistics clocks. Leave stathz 0 since there
- * are no other timers available.
+ * Start the real-time and statistics clocks.
*/
void
cpu_initclocks(void)
@@ -159,21 +158,7 @@ cpu_initclocks(void)
panic("cpu_initclocks: no clock attached");
tick = 1000000 / hz; /* number of microseconds between interrupts */
-
- /*
- * Establish the clock interrupt; it's a special case.
- *
- * We establish the clock interrupt this late because if
- * we do it at clock attach time, we may have never been at
- * spl0() since taking over the system. Some versions of
- * PALcode save a clock interrupt, which would get delivered
- * when we spl0() in autoconf.c. If established the clock
- * interrupt handler earlier, that interrupt would go to
- * hardclock, which would then fall over because the pointer
- * to the virtual timers wasn't set at that time.
- */
- platform.clockintr = hardclock;
- schedhz = 16;
+ tick_nsec = 1000000000 / hz;
evcount_attach(&clk_count, "clock", &clk_irq);
@@ -205,22 +190,36 @@ cpu_initclocks(void)
rpcc_timecounter.tc_frequency = cycles_per_sec;
tc_init(&rpcc_timecounter);
+ schedhz = 16;
+ stathz = hz;
+ profhz = stathz;
+ clockintr_init(0);
+
+ clockintr_cpu_init(NULL);
+
+ /*
+ * Establish the clock interrupt; it's a special case.
+ *
+ * We establish the clock interrupt this late because if
+ * we do it at clock attach time, we may have never been at
+ * spl0() since taking over the system. Some versions of
+ * PALcode save a clock interrupt, which would get delivered
+ * when we spl0() in autoconf.c. If established the clock
+ * interrupt handler earlier, that interrupt would go to
+ * hardclock, which would then fall over because the pointer
+ * to the virtual timers wasn't set at that time.
+ */
+ platform.clockintr = clockintr_dispatch;
+
rtc_todr.todr_gettime = rtc_gettime;
rtc_todr.todr_settime = rtc_settime;
todr_handle = &rtc_todr;
}
-/*
- * We assume newhz is either stathz or profhz, and that neither will
- * change after being set up above. Could recalculate intervals here
- * but that would be a drag.
- */
void
-setstatclockrate(newhz)
- int newhz;
+setstatclockrate(int newhz)
{
-
- /* nothing we can do */
+ clockintr_setstatclockrate(newhz);
}
u_int
Index: sys/arch/alpha/alpha/cpu.c
===================================================================
RCS file: /cvs/src/sys/arch/alpha/alpha/cpu.c,v
retrieving revision 1.45
diff -u -p -r1.45 cpu.c
--- sys/arch/alpha/alpha/cpu.c 13 Mar 2022 08:04:13 -0000 1.45
+++ sys/arch/alpha/alpha/cpu.c 6 Nov 2022 18:32:40 -0000
@@ -60,6 +60,7 @@
#include <sys/param.h>
+#include <sys/clockintr.h>
#include <sys/systm.h>
#include <sys/device.h>
#include <sys/proc.h>
@@ -602,6 +603,8 @@ cpu_hatch(struct cpu_info *ci)
ci->ci_curproc = ci->ci_fpcurproc = NULL;
ci->ci_randseed = (arc4random() & 0x7fffffff) + 1;
KERNEL_UNLOCK();
+
+ clockintr_cpu_init(NULL);
(void) alpha_pal_swpipl(ALPHA_PSL_IPL_0);
SCHED_LOCK(s);
Index: sys/arch/alpha/alpha/interrupt.c
===================================================================
RCS file: /cvs/src/sys/arch/alpha/alpha/interrupt.c,v
retrieving revision 1.40
diff -u -p -r1.40 interrupt.c
--- sys/arch/alpha/alpha/interrupt.c 21 Jan 2017 05:42:03 -0000 1.40
+++ sys/arch/alpha/alpha/interrupt.c 6 Nov 2022 18:32:40 -0000
@@ -200,7 +200,6 @@ interrupt(unsigned long a0, unsigned lon
struct trapframe *framep)
{
struct cpu_info *ci = curcpu();
- extern int schedhz;
switch (a0) {
case ALPHA_INTR_XPROC: /* interprocessor interrupt */
@@ -227,22 +226,8 @@ interrupt(unsigned long a0, unsigned lon
atomic_add_int(&uvmexp.intrs, 1);
if (CPU_IS_PRIMARY(ci))
clk_count.ec_count++;
- if (platform.clockintr) {
- /*
- * Call hardclock(). This will also call
- * statclock(). On the primary CPU, it
- * will also deal with time-of-day stuff.
- */
- (*platform.clockintr)((struct clockframe *)framep);
-
- /*
- * If it's time to call the scheduler clock,
- * do so.
- */
- if ((++ci->ci_schedstate.spc_schedticks & 0x3f) == 0 &&
- schedhz != 0)
- schedclock(ci->ci_curproc);
- }
+ if (platform.clockintr)
+ (*platform.clockintr)(framep);
break;
case ALPHA_INTR_ERROR: /* Machine Check or Correctable Error */
Index: sys/arch/alpha/include/_types.h
===================================================================
RCS file: /cvs/src/sys/arch/alpha/include/_types.h,v
retrieving revision 1.24
diff -u -p -r1.24 _types.h
--- sys/arch/alpha/include/_types.h 5 Mar 2018 01:15:24 -0000 1.24
+++ sys/arch/alpha/include/_types.h 6 Nov 2022 18:32:40 -0000
@@ -35,6 +35,8 @@
#ifndef _MACHINE__TYPES_H_
#define _MACHINE__TYPES_H_
+#define __HAVE_CLOCKINTR
+
#if defined(_KERNEL)
typedef struct label_t {
long val[10];
Index: sys/arch/alpha/include/cpu.h
===================================================================
RCS file: /cvs/src/sys/arch/alpha/include/cpu.h,v
retrieving revision 1.67
diff -u -p -r1.67 cpu.h
--- sys/arch/alpha/include/cpu.h 25 Oct 2022 15:15:38 -0000 1.67
+++ sys/arch/alpha/include/cpu.h 6 Nov 2022 18:32:40 -0000
@@ -99,6 +99,7 @@ typedef union alpha_t_float {
#include <machine/bus.h>
#include <machine/intr.h>
#include <sys/cdefs.h>
+#include <sys/clockintr.h>
#include <sys/device.h>
#include <sys/sched.h>
#include <sys/srp.h>
@@ -212,6 +213,7 @@ struct cpu_info {
#ifdef GPROF
struct gmonparam *ci_gmon;
#endif
+ struct clockintr_queue ci_queue;
char ci_panicbuf[512];
};
Index: sys/arch/alpha/include/cpuconf.h
===================================================================
RCS file: /cvs/src/sys/arch/alpha/include/cpuconf.h,v
retrieving revision 1.6
diff -u -p -r1.6 cpuconf.h
--- sys/arch/alpha/include/cpuconf.h 23 Mar 2011 16:54:34 -0000 1.6
+++ sys/arch/alpha/include/cpuconf.h 6 Nov 2022 18:32:40 -0000
@@ -67,7 +67,7 @@ struct platform {
*/
void (*cons_init)(void);
void (*device_register)(struct device *, void *);
- void (*clockintr)(struct clockframe *);
+ int (*clockintr)(void *);
void (*mcheck_handler)(unsigned long, struct trapframe *,
unsigned long, unsigned long);
void (*powerdown)(void);