Module Name: src Committed By: thorpej Date: Wed Feb 28 13:05:40 UTC 2024
Modified Files: src/sys/arch/m68k/include: cpu.h src/sys/arch/mac68k/dev: adb_direct.c src/sys/arch/mac68k/include: cpu.h intr.h src/sys/arch/mac68k/mac68k: intr.c locore.s via.c Log Message: Fix up the mac68k interrupt handlers to work with the new style common clockframe layout and remove the CLOCK_FORMAT0 work-around. As a nice side-effect, this also eliminates the super-sketchy stack unwinding used by rtclock_intr to get at the interrupt stack frame. To generate a diff of this commit: cvs rdiff -u -r1.24 -r1.25 src/sys/arch/m68k/include/cpu.h cvs rdiff -u -r1.70 -r1.71 src/sys/arch/mac68k/dev/adb_direct.c cvs rdiff -u -r1.106 -r1.107 src/sys/arch/mac68k/include/cpu.h cvs rdiff -u -r1.32 -r1.33 src/sys/arch/mac68k/include/intr.h cvs rdiff -u -r1.35 -r1.36 src/sys/arch/mac68k/mac68k/intr.c cvs rdiff -u -r1.183 -r1.184 src/sys/arch/mac68k/mac68k/locore.s cvs rdiff -u -r1.76 -r1.77 src/sys/arch/mac68k/mac68k/via.c 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/m68k/include/cpu.h diff -u src/sys/arch/m68k/include/cpu.h:1.24 src/sys/arch/m68k/include/cpu.h:1.25 --- src/sys/arch/m68k/include/cpu.h:1.24 Tue Feb 27 16:07:02 2024 +++ src/sys/arch/m68k/include/cpu.h Wed Feb 28 13:05:39 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.h,v 1.24 2024/02/27 16:07:02 nat Exp $ */ +/* $NetBSD: cpu.h,v 1.25 2024/02/28 13:05:39 thorpej Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -149,10 +149,8 @@ void cpu_proc_fork(struct proc *, struct * what the interrupt stub puts on the stack before calling C code. */ struct clockframe { -#ifndef CLOCK_FORMAT0 /* regs saved on the stack by the interrupt stub */ u_int cf_regs[4]; /* d0,d1,a0,a1 */ -#endif /* hardware frame */ u_short cf_sr; /* sr at time of interrupt */ u_long cf_pc; /* pc at time of interrupt */ Index: src/sys/arch/mac68k/dev/adb_direct.c diff -u src/sys/arch/mac68k/dev/adb_direct.c:1.70 src/sys/arch/mac68k/dev/adb_direct.c:1.71 --- src/sys/arch/mac68k/dev/adb_direct.c:1.70 Fri Feb 9 18:20:00 2024 +++ src/sys/arch/mac68k/dev/adb_direct.c Wed Feb 28 13:05:39 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: adb_direct.c,v 1.70 2024/02/09 18:20:00 andvar Exp $ */ +/* $NetBSD: adb_direct.c,v 1.71 2024/02/28 13:05:39 thorpej Exp $ */ /* From: adb_direct.c 2.02 4/18/97 jpw */ @@ -62,7 +62,7 @@ #ifdef __NetBSD__ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: adb_direct.c,v 1.70 2024/02/09 18:20:00 andvar Exp $"); +__KERNEL_RCSID(0, "$NetBSD: adb_direct.c,v 1.71 2024/02/28 13:05:39 thorpej Exp $"); #include "opt_adb.h" @@ -78,6 +78,8 @@ __KERNEL_RCSID(0, "$NetBSD: adb_direct.c #include <machine/adbsys.h> /* required for adbvar.h */ #include <machine/iopreg.h> /* required for IOP support */ +#include <m68k/vectors.h> + #include <mac68k/mac68k/macrom.h> #include <mac68k/dev/adbvar.h> #define printf_intr printf @@ -353,6 +355,17 @@ print_single(u_char *str) } #endif +static inline void +adb_process_serial_intrs(void) +{ + /* grab any serial interrupts (autovector IPL 4) */ + struct clockframe dummy_frame = { + .cf_sr = PSL_S, + .cf_vo = VECI_TO_VECO(VECI_INTRAV4), + }; + (void)intr_dispatch(dummy_frame); +} + void adb_cuda_tickle(void) { @@ -720,7 +733,7 @@ adb_intr_II(void *arg) delay(ADB_DELAY); /* yuck (don't remove) */ - (void)intr_dispatch(0x70); /* grab any serial interrupts */ + adb_process_serial_intrs(); if (ADB_INTR_IS_ON) intr_on = 1; /* save for later */ @@ -768,7 +781,7 @@ switch_start: adbActionState = ADB_ACTION_IN; } delay(ADB_DELAY); - (void)intr_dispatch(0x70); /* grab any serial interrupts */ + adb_process_serial_intrs(); goto switch_start; break; case ADB_ACTION_IDLE: @@ -1262,7 +1275,7 @@ switch_start: ADB_SET_STATE_ACKON(); /* start ACK to ADB chip */ delay(ADB_DELAY); /* delay */ ADB_SET_STATE_ACKOFF(); /* end ACK to ADB chip */ - (void)intr_dispatch(0x70); /* grab any serial interrupts */ + adb_process_serial_intrs(); break; case ADB_ACTION_IN: @@ -1276,7 +1289,7 @@ switch_start: ADB_SET_STATE_ACKON(); /* start ACK to ADB chip */ delay(ADB_DELAY); /* delay */ ADB_SET_STATE_ACKOFF(); /* end ACK to ADB chip */ - (void)intr_dispatch(0x70); /* grab any serial interrupts */ + adb_process_serial_intrs(); if (1 == ending) { /* end of message? */ ADB_SET_STATE_INACTIVE(); /* signal end of frame */ @@ -1323,7 +1336,7 @@ switch_start: adbActionState = ADB_ACTION_OUT; /* set next state */ delay(ADB_DELAY); /* delay */ - (void)intr_dispatch(0x70); /* grab any serial interrupts */ + adb_process_serial_intrs(); if (ADB_INTR_IS_ON) { /* ADB intr low during * write */ @@ -1364,13 +1377,13 @@ switch_start: adbWriteDelay = 1; /* must retry when done with * read */ delay(ADB_DELAY); /* delay */ - (void)intr_dispatch(0x70); /* grab any serial interrupts */ + adb_process_serial_intrs(); goto switch_start; /* process next state right * now */ break; } delay(ADB_DELAY); /* required delay */ - (void)intr_dispatch(0x70); /* grab any serial interrupts */ + adb_process_serial_intrs(); if (adbOutputBuffer[0] == adbSentChars) { /* check for done */ if (0 == adb_cmd_result(adbOutputBuffer)) { /* do we expect data Index: src/sys/arch/mac68k/include/cpu.h diff -u src/sys/arch/mac68k/include/cpu.h:1.106 src/sys/arch/mac68k/include/cpu.h:1.107 --- src/sys/arch/mac68k/include/cpu.h:1.106 Tue Feb 27 16:07:02 2024 +++ src/sys/arch/mac68k/include/cpu.h Wed Feb 28 13:05:40 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.h,v 1.106 2024/02/27 16:07:02 nat Exp $ */ +/* $NetBSD: cpu.h,v 1.107 2024/02/28 13:05:40 thorpej Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -60,10 +60,6 @@ #ifndef _CPU_MACHINE_ #define _CPU_MACHINE_ -#ifndef CLOCK_FORMAT0 -#define CLOCK_FORMAT0 -#endif - #if defined(_KERNEL_OPT) #include "opt_lockdebug.h" #endif Index: src/sys/arch/mac68k/include/intr.h diff -u src/sys/arch/mac68k/include/intr.h:1.32 src/sys/arch/mac68k/include/intr.h:1.33 --- src/sys/arch/mac68k/include/intr.h:1.32 Tue Jul 11 17:55:04 2023 +++ src/sys/arch/mac68k/include/intr.h Wed Feb 28 13:05:40 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: intr.h,v 1.32 2023/07/11 17:55:04 riastradh Exp $ */ +/* $NetBSD: intr.h,v 1.33 2024/02/28 13:05:40 thorpej Exp $ */ /* * Copyright (C) 1997 Scott Reynolds @@ -90,10 +90,11 @@ splraiseipl(ipl_cookie_t icookie) #include <sys/spl.h> /* intr.c */ +struct clockframe; void intr_init(void); void intr_establish(int (*)(void *), void *, int); void intr_disestablish(int); -void intr_dispatch(int); +void intr_dispatch(struct clockframe); /* locore.s */ int spl0(void); Index: src/sys/arch/mac68k/mac68k/intr.c diff -u src/sys/arch/mac68k/mac68k/intr.c:1.35 src/sys/arch/mac68k/mac68k/intr.c:1.36 --- src/sys/arch/mac68k/mac68k/intr.c:1.35 Fri Jan 19 20:55:42 2024 +++ src/sys/arch/mac68k/mac68k/intr.c Wed Feb 28 13:05:40 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: intr.c,v 1.35 2024/01/19 20:55:42 thorpej Exp $ */ +/* $NetBSD: intr.c,v 1.36 2024/02/28 13:05:40 thorpej Exp $ */ /*- * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.35 2024/01/19 20:55:42 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.36 2024/02/28 13:05:40 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -42,6 +42,8 @@ __KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.3 #include <sys/cpu.h> #include <sys/intr.h> +#include <m68k/vectors.h> + #include <machine/psc.h> #include <machine/viareg.h> @@ -61,14 +63,14 @@ static int ((*intr_func[NISR])(void *)) intr_noint }; static void *intr_arg[NISR] = { - (void *)0, - (void *)1, - (void *)2, - (void *)3, - (void *)4, - (void *)5, - (void *)6, - (void *)7 + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL }; #ifdef DEBUG @@ -196,7 +198,7 @@ intr_disestablish(int ipl) panic("intr_disestablish: bad ipl %d", ipl); intr_func[ipl] = intr_noint; - intr_arg[ipl] = (void *)ipl; + intr_arg[ipl] = NULL; } /* @@ -205,35 +207,19 @@ intr_disestablish(int ipl) * * XXX Note: see the warning in intr_establish() */ -#if __GNUC_PREREQ__(8, 0) -/* - * XXX rtclock_intr() requires this for unwinding stack frame. - */ -#pragma GCC push_options -#pragma GCC optimize "-fno-omit-frame-pointer" -#endif void -intr_dispatch(int evec) /* format | vector offset */ +intr_dispatch(struct clockframe frame) { - int ipl, vec; + const int ipl = VECO_TO_VECI(frame.cf_vo) - VECI_INTRAV0; intr_depth++; - vec = (evec & 0xfff) >> 2; -#ifdef DIAGNOSTIC - if ((vec < ISRLOC) || (vec >= (ISRLOC + NISR))) - panic("intr_dispatch: bad vec 0x%x", vec); -#endif - ipl = vec - ISRLOC; intrcnt[ipl]++; curcpu()->ci_data.cpu_nintr++; - (void)(*intr_func[ipl])(intr_arg[ipl]); + (void)(*intr_func[ipl])(intr_arg[ipl] ? intr_arg[ipl] : &frame); intr_depth--; } -#if __GNUC_PREREQ__(8, 0) -#pragma GCC pop_options -#endif /* * Default interrupt handler: do nothing. @@ -243,8 +229,11 @@ intr_noint(void *arg) { #ifdef DEBUG intr_depth++; - if (intr_debug) - printf("intr_noint: ipl %d\n", (int)arg); + if (intr_debug) { + const struct clockframe *frame = arg; + const int ipl = VECO_TO_VECI(frame->cf_vo) - VECI_INTRAV0; + printf("intr_noint: ipl %d\n", ipl); + } intr_depth--; #endif return 0; Index: src/sys/arch/mac68k/mac68k/locore.s diff -u src/sys/arch/mac68k/mac68k/locore.s:1.183 src/sys/arch/mac68k/mac68k/locore.s:1.184 --- src/sys/arch/mac68k/mac68k/locore.s:1.183 Wed Jan 17 12:33:50 2024 +++ src/sys/arch/mac68k/mac68k/locore.s Wed Feb 28 13:05:40 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.s,v 1.183 2024/01/17 12:33:50 thorpej Exp $ */ +/* $NetBSD: locore.s,v 1.184 2024/02/28 13:05:40 thorpej Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -751,10 +751,7 @@ ENTRY_NOPROFILE(spurintr) ENTRY_NOPROFILE(intrhand) INTERRUPT_SAVEREG - movw %sp@(22),%sp@- | push exception vector info - clrw %sp@- jbsr _C_LABEL(intr_dispatch) | call dispatch routine - addql #4,%sp INTERRUPT_RESTOREREG jra _ASM_LABEL(rei) | all done @@ -776,19 +773,17 @@ ENTRY_NOPROFILE(lev7intr) * saving the status register directly to the stack, but this would lose * badly on the 040. Aligning the stack takes 10 more cycles than this * code does, so it's a good compromise. + * + * A pointer to the clockframe is passed as an argument in the usual + * fashion. */ ENTRY_NOPROFILE(rtclock_intr) + movl %sp@(4),%a1 | stash pointer to clockframe movl %d2,%sp@- | save %d2 movw %sr,%d2 | save SPL - movw _C_LABEL(ipl2psl_table)+IPL_CLOCK*2,%sr | raise SPL to splclock() - movl %a6@,%a1 | unwind to frame in intr_dispatch - | XXX FIXME - lea %a1@(28),%a1 | push pointer to interrupt frame - movl %a1,%sp@- | 28 = 16 for regs in intrhand, - | + 4 for args to intr_dispatch - | + 4 for return address to intrhand - | + 4 for value of %A6 + movw _C_LABEL(ipl2psl_table)+IPL_CLOCK*2,%sr + movl %a1,%sp@- | push pointer to clockframe jbsr _C_LABEL(hardclock) | call generic clock int routine addql #4,%sp | pop param jbsr _C_LABEL(mrg_VBLQueue) | give programs in the VBLqueue a chance Index: src/sys/arch/mac68k/mac68k/via.c diff -u src/sys/arch/mac68k/mac68k/via.c:1.76 src/sys/arch/mac68k/mac68k/via.c:1.77 --- src/sys/arch/mac68k/mac68k/via.c:1.76 Tue Jul 21 06:10:26 2020 +++ src/sys/arch/mac68k/mac68k/via.c Wed Feb 28 13:05:40 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: via.c,v 1.76 2020/07/21 06:10:26 rin Exp $ */ +/* $NetBSD: via.c,v 1.77 2024/02/28 13:05:40 thorpej Exp $ */ /*- * Copyright (C) 1993 Allen K. Briggs, Chris P. Caputo, @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: via.c,v 1.76 2020/07/21 06:10:26 rin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: via.c,v 1.77 2024/02/28 13:05:40 thorpej Exp $"); #include "opt_mac68k.h" @@ -239,15 +239,8 @@ via_set_modem(int onoff) via_reg(VIA1, vBufA) &= ~DA1O_vSync; } -#if __GNUC_PREREQ__(8, 0) -/* - * XXX rtclock_intr() requires this for unwinding stack frame. - */ -#pragma GCC push_options -#pragma GCC optimize "-fno-omit-frame-pointer" -#endif void -via1_intr(void *intr_arg) +via1_intr(void *intr_arg /* struct clockframe * */) { u_int8_t intbits, bitnum; u_int mask; @@ -269,16 +262,19 @@ via1_intr(void *intr_arg) bitnum = 0; do { if (intbits & mask) { - via1itab[bitnum](via1iarg[bitnum]); + /* + * We want to pass the clockframe on to + * rtclock_intr(). + */ + void *arg = via1itab[bitnum] == rtclock_intr + ? intr_arg : via1iarg[bitnum]; + via1itab[bitnum](arg); /* via_reg(VIA1, vIFR) = mask; */ } mask <<= 1; ++bitnum; } while (intbits >= mask); } -#if __GNUC_PREREQ__(8, 0) -#pragma GCC pop_options -#endif void via2_intr(void *intr_arg)