Index: sys/arch/mac68k/dev/adb_direct.c =================================================================== RCS file: /cvsroot/src/sys/arch/mac68k/dev/adb_direct.c,v retrieving revision 1.66 diff -u -r1.66 adb_direct.c --- sys/arch/mac68k/dev/adb_direct.c 25 Oct 2013 21:19:56 -0000 1.66 +++ sys/arch/mac68k/dev/adb_direct.c 17 Aug 2014 13:33:18 -0000 @@ -385,7 +385,7 @@ * called when when an adb interrupt happens * * Cuda version of adb_intr - * TO DO: do we want to add some calls to intr_dispatch() here to + * TO DO: do we want to add some calls to intr_dispatch_serial() here to * grab serial interrupts? */ void @@ -721,7 +721,7 @@ delay(ADB_DELAY); /* yuck (don't remove) */ - (void)intr_dispatch(0x70); /* grab any serial interrupts */ + intr_dispatch_serial(); /* grab any serial interrupts */ if (ADB_INTR_IS_ON) intr_on = 1; /* save for later */ @@ -769,7 +769,7 @@ adbActionState = ADB_ACTION_IN; } delay(ADB_DELAY); - (void)intr_dispatch(0x70); /* grab any serial interrupts */ + intr_dispatch_serial(); /* grab any serial interrupts */ goto switch_start; break; case ADB_ACTION_IDLE: @@ -1263,7 +1263,7 @@ 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 */ + intr_dispatch_serial(); /* grab any serial interrupts */ break; case ADB_ACTION_IN: @@ -1277,7 +1277,7 @@ 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 */ + intr_dispatch_serial(); /* grab any serial interrupts */ if (1 == ending) { /* end of message? */ ADB_SET_STATE_INACTIVE(); /* signal end of frame */ @@ -1324,7 +1324,7 @@ adbActionState = ADB_ACTION_OUT; /* set next state */ delay(ADB_DELAY); /* delay */ - (void)intr_dispatch(0x70); /* grab any serial interrupts */ + intr_dispatch_serial(); /* grab any serial interrupts */ if (ADB_INTR_IS_ON) { /* ADB intr low during * write */ @@ -1365,13 +1365,13 @@ adbWriteDelay = 1; /* must retry when done with * read */ delay(ADB_DELAY); /* delay */ - (void)intr_dispatch(0x70); /* grab any serial interrupts */ + intr_dispatch_serial(); /* grab any serial interrupts */ goto switch_start; /* process next state right * now */ break; } delay(ADB_DELAY); /* required delay */ - (void)intr_dispatch(0x70); /* grab any serial interrupts */ + intr_dispatch_serial(); /* grab any serial interrupts */ if (adbOutputBuffer[0] == adbSentChars) { /* check for done */ if (0 == adb_cmd_result(adbOutputBuffer)) { /* do we expect data Index: sys/arch/mac68k/dev/pm_direct.c =================================================================== RCS file: /cvsroot/src/sys/arch/mac68k/dev/pm_direct.c,v retrieving revision 1.29 diff -u -r1.29 pm_direct.c --- sys/arch/mac68k/dev/pm_direct.c 25 Oct 2013 20:49:38 -0000 1.29 +++ sys/arch/mac68k/dev/pm_direct.c 17 Aug 2014 13:33:18 -0000 @@ -297,7 +297,7 @@ { while (PM_IS_ON) { #ifdef PM_GRAB_SI - (void)intr_dispatch(0x70); /* grab any serial interrupts */ + intr_dispatch_serial(); /* grab any serial interrupts */ #endif if ((--xdelay) < 0) return 1; /* timeout */ @@ -314,7 +314,7 @@ { while (PM_IS_OFF) { #ifdef PM_GRAB_SI - (void)intr_dispatch(0x70); /* grab any serial interrupts */ + intr_dispatch_serial(); /* grab any serial interrupts */ #endif if ((--xdelay) < 0) return 0; /* timeout */ @@ -1051,7 +1051,7 @@ break; } #ifdef PM_GRAB_SI - (void)intr_dispatch(0x70); /* grab any serial interrupts */ + intr_dispatch_serial(); /* grab any serial interrupts */ #endif if ((--xdelay) < 0) { splx(s); Index: sys/arch/mac68k/include/autoconf.h =================================================================== RCS file: /cvsroot/src/sys/arch/mac68k/include/autoconf.h,v retrieving revision 1.12 diff -u -r1.12 autoconf.h --- sys/arch/mac68k/include/autoconf.h 4 Mar 2007 06:00:08 -0000 1.12 +++ sys/arch/mac68k/include/autoconf.h 17 Aug 2014 13:33:18 -0000 @@ -63,6 +63,7 @@ void disablertclock(void); void mac68k_calibrate_delay(void); void startrtclock(void); +void rtclock_intr(void *); /* macrom.c */ void mrg_init(void); Index: sys/arch/mac68k/mac68k/clock.c =================================================================== RCS file: /cvsroot/src/sys/arch/mac68k/mac68k/clock.c,v retrieving revision 1.49 diff -u -r1.49 clock.c --- sys/arch/mac68k/mac68k/clock.c 8 Feb 2011 20:20:18 -0000 1.49 +++ sys/arch/mac68k/mac68k/clock.c 17 Aug 2014 13:33:21 -0000 @@ -103,7 +103,6 @@ int clock_debug = 0; #endif -void rtclock_intr(void); static int mac68k_gettime(todr_chip_handle_t, struct timeval *); static int mac68k_settime(todr_chip_handle_t, struct timeval *); static u_int via1_t2_get_timecount(struct timecounter *); @@ -195,6 +194,17 @@ via_reg(VIA1, vIER) = V1IF_T1; } +void rtclock_intr(void *arg); +{ + struct clockframe *frame = (struct clockframe *)arg; + int s; + + s = splclock(); + hardclock(frame); + mrg_VBLQueue(); + splx(s); +} + static u_int via1_t2_get_timecount(struct timecounter *tc) { Index: sys/arch/mac68k/mac68k/intr.c =================================================================== RCS file: /cvsroot/src/sys/arch/mac68k/mac68k/intr.c,v retrieving revision 1.29 diff -u -r1.29 intr.c --- sys/arch/mac68k/mac68k/intr.c 20 Dec 2010 00:25:36 -0000 1.29 +++ sys/arch/mac68k/mac68k/intr.c 17 Aug 2014 13:33:22 -0000 @@ -206,12 +206,13 @@ * XXX Note: see the warning in intr_establish() */ void -intr_dispatch(int evec) /* format | vector offset */ +intr_dispatch(struct clockframe *frame) { int ipl, vec; + void *arg; idepth++; - vec = (evec & 0xfff) >> 2; + vec = (frame->vo & 0xfff) >> 2; #ifdef DIAGNOSTIC if ((vec < ISRLOC) || (vec >= (ISRLOC + NISR))) panic("intr_dispatch: bad vec 0x%x", vec); @@ -221,11 +222,34 @@ intrcnt[ipl]++; curcpu()->ci_data.cpu_nintr++; - (void)(*intr_func[ipl])(intr_arg[ipl]); + /* + * intr_func only has one argument but hardclock needs the + * clock frame. + */ + switch (ipl) { + case 4: + arg = (void *)frame; + break; + default: + arg = intr_arg[ipl]; + break; + } + + (void)(*intr_func[ipl])(arg); idepth--; } /* + * poll serial interrupt from adb_direct or pm_direct + */ +void +intr_dispatch_serial(void) +{ + struct clockframe F; + intr_dispatch(&F); +} + +/* * Default interrupt handler: do nothing. */ static int Index: sys/arch/mac68k/mac68k/locore.s =================================================================== RCS file: /cvsroot/src/sys/arch/mac68k/mac68k/locore.s,v retrieving revision 1.170 diff -u -r1.170 locore.s --- sys/arch/mac68k/mac68k/locore.s 15 Mar 2014 12:11:23 -0000 1.170 +++ sys/arch/mac68k/mac68k/locore.s 17 Aug 2014 13:33:22 -0000 @@ -763,8 +763,8 @@ ENTRY_NOPROFILE(intrhand) INTERRUPT_SAVEREG - movw %sp@(22),%sp@- | push exception vector info - clrw %sp@- + lea %sp@(16),%a0 | push exception frame + movel %a0,%sp@- jbsr _C_LABEL(intr_dispatch) | call dispatch routine addql #4,%sp INTERRUPT_RESTOREREG @@ -783,34 +783,6 @@ addql #8,%sp | pop SSP and align word jra _ASM_LABEL(rei) -/* - * We could tweak rtclock_intr and gain 12 cycles on the 020 and 030 by - * 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. - */ -ENTRY_NOPROFILE(rtclock_intr) - 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 - 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 - 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 - addql #1,_C_LABEL(intrcnt)+32 | record a clock interrupt - INTERRUPT_SAVEREG - CPUINFO_INCREMENT(CI_NINTR) - INTERRUPT_RESTOREREG - movw %d2,%sr | restore SPL - movl %sp@+,%d2 | restore %d2 - rts | go back from whence we came - /* * Emulation of VAX REI instruction. *