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.
  *
