Module Name:    src
Committed By:   thorpej
Date:           Mon Jan 15 00:35:24 UTC 2024

Modified Files:
        src/sys/arch/news68k/conf: files.news68k
        src/sys/arch/news68k/dev: timer_hb.c
        src/sys/arch/news68k/include: cpu.h intr.h types.h vectors.h
        src/sys/arch/news68k/news68k: genassym.cf isr.h locore.s
Removed Files:
        src/sys/arch/news68k/news68k: isr.c

Log Message:
Switch news68k over to the common interrupt dispatch code.


To generate a diff of this commit:
cvs rdiff -u -r1.38 -r1.39 src/sys/arch/news68k/conf/files.news68k
cvs rdiff -u -r1.19 -r1.20 src/sys/arch/news68k/dev/timer_hb.c
cvs rdiff -u -r1.49 -r1.50 src/sys/arch/news68k/include/cpu.h
cvs rdiff -u -r1.28 -r1.29 src/sys/arch/news68k/include/intr.h
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/news68k/include/types.h
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/news68k/include/vectors.h
cvs rdiff -u -r1.34 -r1.35 src/sys/arch/news68k/news68k/genassym.cf
cvs rdiff -u -r1.25 -r0 src/sys/arch/news68k/news68k/isr.c
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/news68k/news68k/isr.h
cvs rdiff -u -r1.79 -r1.80 src/sys/arch/news68k/news68k/locore.s

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/news68k/conf/files.news68k
diff -u src/sys/arch/news68k/conf/files.news68k:1.38 src/sys/arch/news68k/conf/files.news68k:1.39
--- src/sys/arch/news68k/conf/files.news68k:1.38	Sat Jan 13 23:59:47 2024
+++ src/sys/arch/news68k/conf/files.news68k	Mon Jan 15 00:35:23 2024
@@ -1,4 +1,4 @@
-#	$NetBSD: files.news68k,v 1.38 2024/01/13 23:59:47 thorpej Exp $
+#	$NetBSD: files.news68k,v 1.39 2024/01/15 00:35:23 thorpej Exp $
 
 #	NEWS68K-specific configuration info
 
@@ -15,7 +15,6 @@ file	arch/news68k/news68k/bus_space.c
 #file	arch/news68k/news68k/cons_machdep.c
 file	arch/news68k/news68k/clock.c
 file	arch/news68k/news68k/disksubr.c		disk
-file	arch/news68k/news68k/isr.c
 file	arch/news68k/news68k/machdep.c
 file	arch/news68k/news68k/mainbus.c
 file	arch/news68k/news68k/pmap_bootstrap.c	compile-with "${NOPROF_C}"
@@ -24,6 +23,8 @@ file	arch/news68k/news68k/trap.c
 file	arch/m68k/m68k/cacheops.c
 file	arch/m68k/m68k/db_memrw.c		ddb | kgdb
 file	arch/m68k/m68k/kgdb_machdep.c		kgdb
+file	arch/m68k/m68k/m68k_intr.c
+file	arch/m68k/m68k/m68k_intr_stubs.s
 file	arch/m68k/m68k/m68k_trap.c
 file	arch/m68k/m68k/mmu_subr.s
 file	arch/m68k/m68k/pmap_motorola.c

Index: src/sys/arch/news68k/dev/timer_hb.c
diff -u src/sys/arch/news68k/dev/timer_hb.c:1.19 src/sys/arch/news68k/dev/timer_hb.c:1.20
--- src/sys/arch/news68k/dev/timer_hb.c:1.19	Tue Nov 22 14:31:02 2011
+++ src/sys/arch/news68k/dev/timer_hb.c	Mon Jan 15 00:35:23 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: timer_hb.c,v 1.19 2011/11/22 14:31:02 tsutsui Exp $	*/
+/*	$NetBSD: timer_hb.c,v 1.20 2024/01/15 00:35:23 thorpej Exp $	*/
 
 /*-
  * Copyright (c) 1996 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: timer_hb.c,v 1.19 2011/11/22 14:31:02 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: timer_hb.c,v 1.20 2024/01/15 00:35:23 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -42,6 +42,7 @@ __KERNEL_RCSID(0, "$NetBSD: timer_hb.c,v
 
 #include <machine/cpu.h>
 #include <machine/bus.h>
+#include <machine/vectors.h>
 
 #include <dev/clock_subr.h>
 
@@ -62,7 +63,7 @@ __KERNEL_RCSID(0, "$NetBSD: timer_hb.c,v
 static int timer_hb_match(device_t, cfdata_t, void *);
 static void timer_hb_attach(device_t, device_t, void *);
 static void timer_hb_initclocks(int, int);
-void clock_intr(struct clockframe *);
+void clock_intr(struct clockframe);
 
 static inline void leds_intr(void);
 
@@ -113,7 +114,7 @@ timer_hb_attach(device_t parent, device_
 	timer_config(timer_hb_initclocks);
 
 #if 0 /* XXX this will be done in timer_hb_initclocks() */
-	isrlink_custom(ha->ha_ipl, (void *)_isr_clock);
+	vec_set_entry(VECI_INTRAV0 + ha->ha_ipl, _isr_clock);
 #endif
 }
 
@@ -130,7 +131,7 @@ timer_hb_initclocks(int prof, int stat)
 	s = splhigh();
 
 	/* Install isr (in locore.s) that calls clock_intr(). */
-	isrlink_custom(TIMER_LEVEL, (void *)_isr_clock);
+	vec_set_entry(VECI_INTRAV0 + TIMER_LEVEL, _isr_clock);
 
 	/* enable the clock */
 	*ctrl_timer = 1;
@@ -144,7 +145,7 @@ timer_hb_initclocks(int prof, int stat)
  * from sun3/sun3x/clock.c -tsutsui
  */
 void
-clock_intr(struct clockframe *cf)
+clock_intr(struct clockframe cf)
 {
 #ifdef	LED_IDLE_CHECK
 	extern char _Idle[];	/* locore.s */
@@ -162,7 +163,7 @@ clock_intr(struct clockframe *cf)
 		leds_intr();
 
 	/* Call common clock interrupt handler. */
-	hardclock(cf);
+	hardclock(&cf);
 	curcpu()->ci_data.cpu_nintr++;
 }
 

Index: src/sys/arch/news68k/include/cpu.h
diff -u src/sys/arch/news68k/include/cpu.h:1.49 src/sys/arch/news68k/include/cpu.h:1.50
--- src/sys/arch/news68k/include/cpu.h:1.49	Sat Jan 13 23:59:47 2024
+++ src/sys/arch/news68k/include/cpu.h	Mon Jan 15 00:35:23 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.h,v 1.49 2024/01/13 23:59:47 thorpej Exp $	*/
+/*	$NetBSD: cpu.h,v 1.50 2024/01/15 00:35:23 thorpej Exp $	*/
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -80,19 +80,20 @@
 /*
  * Arguments to hardclock and gatherstats encapsulate the previous
  * machine state in an opaque clockframe.  On the news68k, we use
- * what the hardware pushes on an interrupt (frame format 0).
+ * what the locore.s glue puts on the stack before calling C-code.
  */
 struct clockframe {
-	u_short	sr;		/* sr at time of interrupt */
-	u_long	pc;		/* pc at time of interrupt */
-	u_short	vo;		/* vector offset (4-word frame) */
-};
+	u_int	cf_regs[4];	/* d0,d1,a0,a1 */
+	u_short	cf_sr;		/* sr at time of interrupt */
+	u_long	cf_pc;		/* pc at time of interrupt */
+	u_short	cf_vo;		/* vector offset (4-word frame) */
+} __attribute__((packed));
 
-#define CLKF_USERMODE(framep)	(((framep)->sr & PSL_S) == 0)
-#define CLKF_PC(framep)		((framep)->pc)
+#define CLKF_USERMODE(framep)	(((framep)->cf_sr & PSL_S) == 0)
+#define CLKF_PC(framep)		((framep)->cf_pc)
 #if 0
 /* We would like to do it this way... */
-#define CLKF_INTR(framep)	(((framep)->sr & PSL_M) == 0)
+#define CLKF_INTR(framep)	(((framep)->cf_sr & PSL_M) == 0)
 #else
 /* but until we start using PSL_M, we have to do this instead */
 #include <machine/intr.h>

Index: src/sys/arch/news68k/include/intr.h
diff -u src/sys/arch/news68k/include/intr.h:1.28 src/sys/arch/news68k/include/intr.h:1.29
--- src/sys/arch/news68k/include/intr.h:1.28	Tue Jul 11 11:09:13 2023
+++ src/sys/arch/news68k/include/intr.h	Mon Jan 15 00:35:23 2024
@@ -1,11 +1,11 @@
-/*	$NetBSD: intr.h,v 1.28 2023/07/11 11:09:13 riastradh Exp $	*/
+/*	$NetBSD: intr.h,v 1.29 2024/01/15 00:35:23 thorpej Exp $	*/
 
 /*-
- * Copyright (c) 1998 The NetBSD Foundation, Inc.
+ * Copyright (c) 2024 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
- * by Minoura Makoto and Jason R. Thorpe.
+ * by Jason R. Thorpe.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -30,81 +30,17 @@
  */
 
 #ifndef _NEWS68K_INTR_H_
-#define	_NEWS68K_INTR_H_
+#define _NEWS68K_INTR_H_
 
-#include <sys/types.h>
+#include <m68k/psl.h>
 
-#include <sys/evcnt.h>
-#include <sys/queue.h>
-#include <sys/stdbool.h>
+#define	MACHINE_PSL_IPL_SOFTCLOCK	PSL_IPL2
+#define	MACHINE_PSL_IPL_SOFTBIO		PSL_IPL2
+#define	MACHINE_PSL_IPL_SOFTNET		PSL_IPL2
+#define	MACHINE_PSL_IPL_SOFTSERIAL	PSL_IPL2
+#define	MACHINE_PSL_IPL_VM		PSL_IPL5
+#define	MACHINE_PSL_IPL_SCHED		PSL_IPL7
 
-#include <machine/psl.h>
+#include <m68k/intr.h>
 
-#include <m68k/asm_single.h>
-
-#define	IPL_NONE	0
-#define	IPL_SOFTCLOCK	1
-#define	IPL_SOFTBIO	2
-#define	IPL_SOFTNET	3
-#define	IPL_SOFTSERIAL	4
-#define	IPL_VM		5
-#define	IPL_SCHED	6
-#define	IPL_HIGH	7
-#define	NIPL		8
-
-extern int idepth;
-
-static __inline bool
-cpu_intr_p(void)
-{
-
-	return idepth != 0;
-}
-
-extern const uint16_t ipl2psl_table[NIPL];
-
-typedef int ipl_t;
-typedef struct {
-	uint16_t _psl;
-} ipl_cookie_t;
-
-#ifdef _KERNEL
-
-static __inline ipl_cookie_t
-makeiplcookie(ipl_t ipl)
-{
-
-	return (ipl_cookie_t){._psl = ipl2psl_table[ipl]};
-}
-
-static __inline int
-splraiseipl(ipl_cookie_t icookie)
-{
-
-	return _splraise(icookie._psl);
-}
-
-static __inline void
-splx(int sr)
-{
-
-	__asm volatile("movw %0,%%sr" : : "di" (sr));
-}
-
-/*
- * news68k can handle software interrupts by its own hardware
- * so has no need to check for any simulated interrupts, etc.
- */
-#define	spl0()		_spl0()
-
-#define	splsoftbio()	splraise2()
-#define	splsoftclock()	splraise2()
-#define	splsoftnet()	splraise2()
-#define	splsoftserial()	splraise2()
-#define	splvm()		splraise5()
-#define	splhigh()	spl7()
-#define	splsched()	spl7()
-
-#endif
-
-#endif /* _NEWS68K_INTR_H_ */
+#endif	/* _NEWS68K_INTR_H_ */

Index: src/sys/arch/news68k/include/types.h
diff -u src/sys/arch/news68k/include/types.h:1.13 src/sys/arch/news68k/include/types.h:1.14
--- src/sys/arch/news68k/include/types.h:1.13	Thu Apr  1 04:43:00 2021
+++ src/sys/arch/news68k/include/types.h	Mon Jan 15 00:35:23 2024
@@ -1,6 +1,7 @@
-/*	$NetBSD: types.h,v 1.13 2021/04/01 04:43:00 simonb Exp $	*/
+/*	$NetBSD: types.h,v 1.14 2024/01/15 00:35:23 thorpej Exp $	*/
 
 #include <m68k/types.h>
 
 #define	__HAVE_LEGACY_INTRCNT
 #define	__HAVE_MM_MD_KERNACC
+#define	__HAVE_M68K_INTR_VECTORED

Index: src/sys/arch/news68k/include/vectors.h
diff -u src/sys/arch/news68k/include/vectors.h:1.1 src/sys/arch/news68k/include/vectors.h:1.2
--- src/sys/arch/news68k/include/vectors.h:1.1	Sat Jan 13 23:59:47 2024
+++ src/sys/arch/news68k/include/vectors.h	Mon Jan 15 00:35:23 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: vectors.h,v 1.1 2024/01/13 23:59:47 thorpej Exp $	*/
+/*	$NetBSD: vectors.h,v 1.2 2024/01/15 00:35:23 thorpej Exp $	*/
 
 /*-
  * Copyright (c) 2024 The NetBSD Foundation, Inc.
@@ -38,12 +38,12 @@
 
 #define	MACHINE_AV0_HANDLER	spurintr
 #define	MACHINE_AV1_HANDLER	lev1intr
-#define	MACHINE_AV2_HANDLER	intrhand_autovec
+#define	MACHINE_AV2_HANDLER	intrstub_autovec
 #define	MACHINE_AV3_HANDLER	lev3intr
 #define	MACHINE_AV4_HANDLER	lev4intr
-#define	MACHINE_AV5_HANDLER	intrhand_autovec
-#define	MACHINE_AV6_HANDLER	intrhand_autovec
-#define	MACHINE_AV7_HANDLER	intrhand_autovec
+#define	MACHINE_AV5_HANDLER	intrstub_autovec
+#define	MACHINE_AV6_HANDLER	intrstub_autovec
+#define	MACHINE_AV7_HANDLER	intrstub_autovec
 
 #endif /* _KERNEL */
 

Index: src/sys/arch/news68k/news68k/genassym.cf
diff -u src/sys/arch/news68k/news68k/genassym.cf:1.34 src/sys/arch/news68k/news68k/genassym.cf:1.35
--- src/sys/arch/news68k/news68k/genassym.cf:1.34	Tue Jan  9 04:16:26 2024
+++ src/sys/arch/news68k/news68k/genassym.cf	Mon Jan 15 00:35:24 2024
@@ -1,4 +1,4 @@
-#	$NetBSD: genassym.cf,v 1.34 2024/01/09 04:16:26 thorpej Exp $
+#	$NetBSD: genassym.cf,v 1.35 2024/01/15 00:35:24 thorpej Exp $
 
 #
 # Copyright (c) 1982, 1990, 1993
@@ -74,6 +74,8 @@ endif
 
 define	M68K_MMU_MOTOROLA	1
 
+define	__HAVE_M68K_INTR_VECTORED 1
+
 # values for fputype
 define	FPU_NONE		FPU_NONE
 define	FPU_68881		FPU_68881

Index: src/sys/arch/news68k/news68k/isr.h
diff -u src/sys/arch/news68k/news68k/isr.h:1.9 src/sys/arch/news68k/news68k/isr.h:1.10
--- src/sys/arch/news68k/news68k/isr.h:1.9	Sun Jan 14 23:01:43 2024
+++ src/sys/arch/news68k/news68k/isr.h	Mon Jan 15 00:35:24 2024
@@ -1,7 +1,7 @@
-/*	$NetBSD: isr.h,v 1.9 2024/01/14 23:01:43 thorpej Exp $	*/
+/*	$NetBSD: isr.h,v 1.10 2024/01/15 00:35:24 thorpej Exp $	*/
 
 /*-
- * Copyright (c) 1996 The NetBSD Foundation, Inc.
+ * Copyright (c) 2004 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -29,35 +29,40 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include <sys/queue.h>
+#ifndef _NEWS68k_ISR_H_
+#define	_NEWS68k_ISR_H_
+
+#include <sys/intr.h>
 
 /*
- * Autovectored interrupt handler cookie.
+ * Aliases for the legacy news68k ISR routines.
  */
-struct isr_autovec {
-	LIST_ENTRY(isr_autovec) isr_link;
-	int  (*isr_func)(void *);
-	void *isr_arg;
-	int  isr_ipl;
-	int  isr_priority;
-};
 
-typedef LIST_HEAD(, isr_autovec) isr_autovec_list_t;
+static inline void
+isrinit(void)
+{
+	m68k_intr_init(NULL);
+}
+
+static inline void
+isrlink_autovec(int (*func)(void *), void *arg, int ipl, int isrpri)
+{
+	/* XXX leaks interrupt handle. */
+	m68k_intr_establish(func, arg, NULL, 0, ipl, isrpri, 0);
+}
+
+static inline void
+isrlink_vectored(int (*func)(void *), void *arg, int ipl, int vec)
+{
+	/* XXX leaks interrupt handle. */
+	m68k_intr_establish(func, arg, NULL, vec, ipl, 0, 0);
+}
+
+static inline void
+isrunlink_vectored(int vec)
+{
+	/* XXX isrlink_*() functions should return handle. */
+	panic("isrunlink_vectored");
+}
 
-/*
- * Vectored interrupt handler cookie.  The handler may request to
- * receive the exception frame as an argument by specifying NULL
- * when establishing the interrupt.
- */
-struct isr_vectored {
-	int  (*isr_func)(void *);
-	void *isr_arg;
-	int  isr_ipl;
-};
-
-void isrinit(void);
-void isrlink_autovec(int (*)(void *), void *, int, int);
-void isrlink_vectored(int (*)(void *), void *, int, int);
-void isrunlink_vectored(int);
-void isrdispatch_autovec(int);
-void isrdispatch_vectored(int, int, void *);
+#endif /* _NEWS68k_ISR_H_ */

Index: src/sys/arch/news68k/news68k/locore.s
diff -u src/sys/arch/news68k/news68k/locore.s:1.79 src/sys/arch/news68k/news68k/locore.s:1.80
--- src/sys/arch/news68k/news68k/locore.s:1.79	Sat Jan 13 23:59:47 2024
+++ src/sys/arch/news68k/news68k/locore.s	Mon Jan 15 00:35:24 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: locore.s,v 1.79 2024/01/13 23:59:47 thorpej Exp $	*/
+/*	$NetBSD: locore.s,v 1.80 2024/01/15 00:35:24 thorpej Exp $	*/
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -649,19 +649,6 @@ Lbrkpt3:
 
 /*
  * Interrupt handlers.
- *
- * For auto-vectored interrupts, the CPU provides the
- * vector 0x18+level.  Note we count spurious interrupts,
- * but don't do anything else with them.
- *
- * _intrhand_autovec is the entry point for auto-vectored
- * interrupts.
- *
- * For vectored interrupts, we pull the pc, evec, and exception frame
- * and pass them to the vectored interrupt dispatcher.  The vectored
- * interrupt dispatcher will deal with strays.
- *
- * _intrhand_vectored is the entry point for vectored interrupts.
  */
 
 ENTRY_NOPROFILE(spurintr)	/* Level 0 */
@@ -671,17 +658,6 @@ ENTRY_NOPROFILE(spurintr)	/* Level 0 */
 	INTERRUPT_RESTOREREG
 	rte
 
-ENTRY_NOPROFILE(intrhand_autovec)	/* Levels 1 through 6 */
-	addql	#1,_C_LABEL(idepth)
-	INTERRUPT_SAVEREG
-	movw	%sp@(22),%sp@-		| push exception vector
-	clrw	%sp@-
-	jbsr	_C_LABEL(isrdispatch_autovec) | call dispatcher
-	addql	#4,%sp
-	INTERRUPT_RESTOREREG
-	subql	#1,_C_LABEL(idepth)
-	rte
-
 ENTRY_NOPROFILE(lev1intr)		/* Level 1: AST interrupt */
 	addql	#1,_C_LABEL(idepth)
 	INTERRUPT_SAVEREG
@@ -717,23 +693,10 @@ ENTRY_NOPROFILE(lev4intr)		/* Level 4: s
 	subql	#1,_C_LABEL(idepth)
 	rte
 
-#if 0
-ENTRY_NOPROFILE(lev5intr)		/* Level 5: kb, ms (zs is vectored) */
-	addql	#1,_C_LABEL(idepth)
-	INTERRUPT_SAVEREG
-	jbsr	_C_LABEL(intrhand_lev5)
-	INTERRUPT_RESTOREREG
-	subql	#1,_C_LABEL(idepth)
-	rte
-#endif
-
 ENTRY_NOPROFILE(_isr_clock)		/* Level 6: clock (see clock_hb.c) */
 	addql	#1,_C_LABEL(idepth)
 	INTERRUPT_SAVEREG
-	lea	%sp@(16),%a1
-	movl	%a1,%sp@-
 	jbsr	_C_LABEL(clock_intr)
-	addql	#4,%sp
 	INTERRUPT_RESTOREREG
 	subql	#1,_C_LABEL(idepth)
 	rte
@@ -753,20 +716,6 @@ ENTRY_NOPROFILE(lev7intr)		/* Level 7: N
 	rte
 #endif
 
-ENTRY_NOPROFILE(intrhand_vectored)
-	addql	#1,_C_LABEL(idepth)
-	INTERRUPT_SAVEREG
-	lea	%sp@(16),%a1		| get pointer to frame
-	movl	%a1,%sp@-
-	movw	%sp@(26),%d0
-	movl	%d0,%sp@-		| push exception vector info
-	movl	%sp@(26),%sp@-		| and PC
-	jbsr	_C_LABEL(isrdispatch_vectored) | call dispatcher
-	lea	%sp@(12),%sp		| pop value args
-	INTERRUPT_RESTOREREG
-	subql	#1,_C_LABEL(idepth)
-	rte
-
 /*
  * Emulation of VAX REI instruction.
  *

Reply via email to