Module Name:    src
Committed By:   matt
Date:           Wed Dec 29 07:15:48 UTC 2010

Modified Files:
        src/sys/arch/sgimips/dev [matt-nb5-mips64]: crime.c imc.c int.c pic.c
        src/sys/arch/sgimips/include [matt-nb5-mips64]: intr.h sysconf.h
        src/sys/arch/sgimips/sgimips [matt-nb5-mips64]: clock.c cpu.c machdep.c

Log Message:
Adapt sgimips to the interrupt framework.


To generate a diff of this commit:
cvs rdiff -u -r1.33.12.1 -r1.33.12.2 src/sys/arch/sgimips/dev/crime.c
cvs rdiff -u -r1.29 -r1.29.12.1 src/sys/arch/sgimips/dev/imc.c
cvs rdiff -u -r1.19.12.1 -r1.19.12.2 src/sys/arch/sgimips/dev/int.c
cvs rdiff -u -r1.13 -r1.13.12.1 src/sys/arch/sgimips/dev/pic.c
cvs rdiff -u -r1.25.36.1 -r1.25.36.2 src/sys/arch/sgimips/include/intr.h
cvs rdiff -u -r1.7 -r1.7.66.1 src/sys/arch/sgimips/include/sysconf.h
cvs rdiff -u -r1.20 -r1.20.66.1 src/sys/arch/sgimips/sgimips/clock.c
cvs rdiff -u -r1.21.36.3 -r1.21.36.4 src/sys/arch/sgimips/sgimips/cpu.c
cvs rdiff -u -r1.121.8.5 -r1.121.8.6 src/sys/arch/sgimips/sgimips/machdep.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/sgimips/dev/crime.c
diff -u src/sys/arch/sgimips/dev/crime.c:1.33.12.1 src/sys/arch/sgimips/dev/crime.c:1.33.12.2
--- src/sys/arch/sgimips/dev/crime.c:1.33.12.1	Wed Jan 20 09:04:31 2010
+++ src/sys/arch/sgimips/dev/crime.c	Wed Dec 29 07:15:47 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: crime.c,v 1.33.12.1 2010/01/20 09:04:31 matt Exp $	*/
+/*	$NetBSD: crime.c,v 1.33.12.2 2010/12/29 07:15:47 matt Exp $	*/
 
 /*
  * Copyright (c) 2004 Christopher SEKIYA
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: crime.c,v 1.33.12.1 2010/01/20 09:04:31 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: crime.c,v 1.33.12.2 2010/12/29 07:15:47 matt Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -66,7 +66,7 @@
 void		crime_bus_reset(void);
 void		crime_watchdog_reset(void);
 void		crime_watchdog_disable(void);
-void		crime_intr(uint32_t, uint32_t, uint32_t, uint32_t);
+void		crime_intr(vaddr_t, uint32_t, uint32_t);
 void		*crime_intr_establish(int, int, int (*)(void *), void *);
 
 static bus_space_tag_t crm_iot;
@@ -209,7 +209,7 @@
 }
 
 void
-crime_intr(uint32_t status, uint32_t cause, uint32_t pc, uint32_t ipending)
+crime_intr(vaddr_t pc, uint32_t status, uint32_t ipending)
 {
 	uint64_t crime_intmask;
 	uint64_t crime_intstat;

Index: src/sys/arch/sgimips/dev/imc.c
diff -u src/sys/arch/sgimips/dev/imc.c:1.29 src/sys/arch/sgimips/dev/imc.c:1.29.12.1
--- src/sys/arch/sgimips/dev/imc.c:1.29	Sat Aug 23 17:25:54 2008
+++ src/sys/arch/sgimips/dev/imc.c	Wed Dec 29 07:15:47 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: imc.c,v 1.29 2008/08/23 17:25:54 tsutsui Exp $	*/
+/*	$NetBSD: imc.c,v 1.29.12.1 2010/12/29 07:15:47 matt Exp $	*/
 
 /*
  * Copyright (c) 2001 Rafal K. Boni
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: imc.c,v 1.29 2008/08/23 17:25:54 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: imc.c,v 1.29.12.1 2010/12/29 07:15:47 matt Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -61,7 +61,7 @@
 static void	imc_attach(struct device *, struct device *, void *);
 static int	imc_print(void *, const char *);
 static void	imc_bus_reset(void);
-static void	imc_bus_error(uint32_t, uint32_t, uint32_t, uint32_t);
+static void	imc_bus_error(vaddr_t, uint32_t, uint32_t);
 static void	imc_watchdog_reset(void);
 static void	imc_watchdog_disable(void);
 static void	imc_watchdog_enable(void);
@@ -263,7 +263,7 @@
 }
 
 static void
-imc_bus_error(uint32_t status, uint32_t cause, uint32_t pc, uint32_t ipending)
+imc_bus_error(vaddr_t pc, uint32_t status, uint32_t ipending)
 {
 
 	printf("bus error: cpu_stat %08x addr %08x, gio_stat %08x addr %08x\n",

Index: src/sys/arch/sgimips/dev/int.c
diff -u src/sys/arch/sgimips/dev/int.c:1.19.12.1 src/sys/arch/sgimips/dev/int.c:1.19.12.2
--- src/sys/arch/sgimips/dev/int.c:1.19.12.1	Thu Sep 10 01:51:31 2009
+++ src/sys/arch/sgimips/dev/int.c	Wed Dec 29 07:15:47 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: int.c,v 1.19.12.1 2009/09/10 01:51:31 matt Exp $	*/
+/*	$NetBSD: int.c,v 1.19.12.2 2010/12/29 07:15:47 matt Exp $	*/
 
 /*
  * Copyright (c) 2004 Christopher SEKIYA
@@ -32,8 +32,9 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: int.c,v 1.19.12.1 2009/09/10 01:51:31 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: int.c,v 1.19.12.2 2010/12/29 07:15:47 matt Exp $");
 
+#define __INTR_PRIVATE
 #include "opt_cputype.h"
 
 #include <sys/param.h>
@@ -65,14 +66,14 @@
 
 static int	int_match(struct device *, struct cfdata *, void *);
 static void	int_attach(struct device *, struct device *, void *);
-static void 	int_local0_intr(uint32_t, uint32_t, uint32_t, uint32_t);
-static void	int_local1_intr(uint32_t, uint32_t, uint32_t, uint32_t);
+static void 	int_local0_intr(vaddr_t, uint32_t, uint32_t);
+static void	int_local1_intr(vaddr_t, uint32_t, uint32_t);
 static int 	int_mappable_intr(void *);
 static void    *int_intr_establish(int, int, int (*)(void *), void *);
 static void	int_8254_cal(void);
 static u_int	int_8254_get_timecount(struct timecounter *);
-static void	int_8254_intr0(uint32_t, uint32_t, uint32_t, uint32_t);
-static void	int_8254_intr1(uint32_t, uint32_t, uint32_t, uint32_t);
+static void	int_8254_intr0(vaddr_t, uint32_t, uint32_t);
+static void	int_8254_intr1(vaddr_t, uint32_t, uint32_t);
 
 #ifdef MIPS3
 static u_long	int_cal_timer(void);
@@ -234,7 +235,7 @@
 }
 
 void
-int_local0_intr(uint32_t status, uint32_t cause, uint32_t pc, uint32_t ipending)
+int_local0_intr(vaddr_t pc, uint32_t status, uint32_t ipending)
 {
 	int i;
 	uint32_t l0stat;
@@ -260,7 +261,7 @@
 }
 
 void
-int_local1_intr(uint32_t status, uint32_t cause, uint32_t pc, uint32_t ipending)
+int_local1_intr(vaddr_t pc, uint32_t status, uint32_t ipending)
 {
 	int i;
 	uint32_t l1stat;
@@ -458,7 +459,7 @@
 }
 
 static void
-int_8254_intr0(uint32_t status, uint32_t cause, uint32_t pc, uint32_t ipending)
+int_8254_intr0(vaddr_t pc, uint32_t status, uint32_t ipending)
 {
 	struct clockframe cf;
 
@@ -472,7 +473,7 @@
 
 
 static void
-int_8254_intr1(uint32_t status, uint32_t cause, uint32_t pc, uint32_t ipending)
+int_8254_intr1(vaddr_t pc, uint32_t status, uint32_t ipending)
 {
 	int s;
 

Index: src/sys/arch/sgimips/dev/pic.c
diff -u src/sys/arch/sgimips/dev/pic.c:1.13 src/sys/arch/sgimips/dev/pic.c:1.13.12.1
--- src/sys/arch/sgimips/dev/pic.c:1.13	Sat Aug 23 17:25:54 2008
+++ src/sys/arch/sgimips/dev/pic.c	Wed Dec 29 07:15:47 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: pic.c,v 1.13 2008/08/23 17:25:54 tsutsui Exp $	 */
+/*	$NetBSD: pic.c,v 1.13.12.1 2010/12/29 07:15:47 matt Exp $	 */
 
 /*
  * Copyright (c) 2002 Steve Rumble
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pic.c,v 1.13 2008/08/23 17:25:54 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pic.c,v 1.13.12.1 2010/12/29 07:15:47 matt Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -59,7 +59,7 @@
 static void     pic_attach(struct device *, struct device *, void *);
 static int      pic_print(void *, const char *);
 static void	pic_bus_reset(void);
-static void	pic_bus_error(uint32_t, uint32_t, uint32_t, uint32_t);
+static void	pic_bus_error(vaddr_t, uint32_t, uint32_t);
 static void	pic_watchdog_enable(void);
 static void	pic_watchdog_disable(void);
 static void	pic_watchdog_tickle(void);
@@ -212,7 +212,7 @@
 }
 
 static void
-pic_bus_error(uint32_t status, uint32_t cause, uint32_t pc, uint32_t ipending)
+pic_bus_error(vaddr_t pc, uint32_t status, uint32_t ipending)
 {
 
 	printf("pic0: bus error\n");

Index: src/sys/arch/sgimips/include/intr.h
diff -u src/sys/arch/sgimips/include/intr.h:1.25.36.1 src/sys/arch/sgimips/include/intr.h:1.25.36.2
--- src/sys/arch/sgimips/include/intr.h:1.25.36.1	Sat Feb  6 02:57:44 2010
+++ src/sys/arch/sgimips/include/intr.h	Wed Dec 29 07:15:47 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: intr.h,v 1.25.36.1 2010/02/06 02:57:44 matt Exp $	*/
+/*	$NetBSD: intr.h,v 1.25.36.2 2010/12/29 07:15:47 matt Exp $	*/
 
 /*
  * Copyright (c) 2000 Soren S. Jorvang
@@ -35,37 +35,21 @@
 #ifndef	_SGIMIPS_INTR_H_
 #define	_SGIMIPS_INTR_H_
 
-#define	IPL_NONE	0	/* Disable only this interrupt. */
-#define	IPL_SOFTCLOCK	1	/* generic software interrupts */
-#define	IPL_SOFTBIO	1	/* serial software interrupts */
-#define	IPL_SOFTNET	1	/* network software interrupts */
-#define	IPL_SOFTSERIAL	1	/* clock software interrupts */
-#define	IPL_VM		2
-#define	IPL_SCHED	3
-#define	IPL_HIGH	4
-
-#define NIPL		5
-
-/* Interrupt sharing types. */
-#define IST_NONE	0	/* none */
-#define IST_PULSE	1	/* pulsed */
-#define IST_EDGE	2	/* edge-triggered */
-#define IST_LEVEL	3	/* level-triggered */
+#include <mips/intr.h>
 
 #ifdef _KERNEL
-#ifndef _LOCORE
+#ifdef __INTR_PRIVATE
 
 #include <sys/queue.h>
 #include <sys/types.h>
-#include <sys/device.h>
+#include <sys/evcnt.h>
 #include <mips/cpuregs.h>
 #include <mips/locore.h>
 
 #define NINTR	32
 
 struct sgimips_intrhand {
-	LIST_ENTRY(sgimips_intrhand)
-		ih_q;
+	LIST_ENTRY(sgimips_intrhand) ih_q;
 	int	(*ih_fun) (void *);
 	void	 *ih_arg;
 	struct	sgimips_intr *ih_intrhead;
@@ -74,43 +58,18 @@
 };
 
 struct sgimips_intr {
-	LIST_HEAD(,sgimips_intrhand)
-		intr_q;
+	LIST_HEAD(,sgimips_intrhand) intr_q;
 	struct	evcnt ih_evcnt;
 	unsigned long intr_ipl;
 };
 
 extern struct sgimips_intrhand intrtab[];
 
-extern const int *ipl2spl_table;
+#endif /* __INTR_PRIVATE */
 
-#define spl0()		(void)_spllower(0)
-#define splx(s)		(void)_splset(s)
-#define splvm()		_splraise(ipl2spl_table[IPL_VM])
-#define splsched()	_splraise(ipl2spl_table[IPL_SCHED])
-#define splhigh()	_splraise(MIPS_INT_MASK)
-
-#define splsoftclock()	_splraise(MIPS_SOFT_INT_MASK_1)
-#define splsoftbio()	splsoftclock()
-#define splsoftnet()	splsoftclock()
-#define splsoftserial()	splsoftclock()
-
-extern void *		cpu_intr_establish(int, int, int (*)(void *), void *);
-
-typedef int ipl_t;
-typedef struct {
-	int _spl;
-} ipl_cookie_t;
-
-ipl_cookie_t makeiplcookie(ipl_t);
-
-static inline int
-splraiseipl(ipl_cookie_t icookie)
-{
-
-	return _splraise(icookie._spl);
-}
-#endif /* _LOCORE */
+#ifndef _LOCORE
+void *cpu_intr_establish(int, int, int (*)(void *), void *);
+#endif
 #endif /* !_KERNEL */
 
 #endif	/* !_SGIMIPS_INTR_H_ */

Index: src/sys/arch/sgimips/include/sysconf.h
diff -u src/sys/arch/sgimips/include/sysconf.h:1.7 src/sys/arch/sgimips/include/sysconf.h:1.7.66.1
--- src/sys/arch/sgimips/include/sysconf.h:1.7	Fri Dec 29 05:26:30 2006
+++ src/sys/arch/sgimips/include/sysconf.h	Wed Dec 29 07:15:47 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: sysconf.h,v 1.7 2006/12/29 05:26:30 rumble Exp $	*/
+/*	$NetBSD: sysconf.h,v 1.7.66.1 2010/12/29 07:15:47 matt Exp $	*/
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
@@ -75,12 +75,12 @@
 	void	(*watchdog_reset)(void);
 	void	(*watchdog_disable)(void);
 	void	(*watchdog_enable)(void);
-	void	(*intr0)(u_int32_t, u_int32_t, u_int32_t, u_int32_t);
-	void	(*intr1)(u_int32_t, u_int32_t, u_int32_t, u_int32_t);
-	void	(*intr2)(u_int32_t, u_int32_t, u_int32_t, u_int32_t);
-	void	(*intr3)(u_int32_t, u_int32_t, u_int32_t, u_int32_t);
-	void	(*intr4)(u_int32_t, u_int32_t, u_int32_t, u_int32_t);
-	void	(*intr5)(u_int32_t, u_int32_t, u_int32_t, u_int32_t);
+	void	(*intr0)(vaddr_t, uint32_t, uint32_t);
+	void	(*intr1)(vaddr_t, uint32_t, uint32_t);
+	void	(*intr2)(vaddr_t, uint32_t, uint32_t);
+	void	(*intr3)(vaddr_t, uint32_t, uint32_t);
+	void	(*intr4)(vaddr_t, uint32_t, uint32_t);
+	void	(*intr5)(vaddr_t, uint32_t, uint32_t);
 };
 
 extern struct platform platform;

Index: src/sys/arch/sgimips/sgimips/clock.c
diff -u src/sys/arch/sgimips/sgimips/clock.c:1.20 src/sys/arch/sgimips/sgimips/clock.c:1.20.66.1
--- src/sys/arch/sgimips/sgimips/clock.c:1.20	Fri Dec 29 07:00:11 2006
+++ src/sys/arch/sgimips/sgimips/clock.c	Wed Dec 29 07:15:48 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: clock.c,v 1.20 2006/12/29 07:00:11 rumble Exp $	*/
+/*	$NetBSD: clock.c,v 1.20.66.1 2010/12/29 07:15:48 matt Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -79,12 +79,13 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: clock.c,v 1.20 2006/12/29 07:00:11 rumble Exp $");
+__KERNEL_RCSID(0, "$NetBSD: clock.c,v 1.20.66.1 2010/12/29 07:15:48 matt Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
 #include <sys/kernel.h>
 #include <sys/systm.h>
+#include <sys/cpu.h>
 #include <machine/sysconf.h>
 
 #include <mips/locore.h>
@@ -95,10 +96,10 @@
 #include <machine/machtype.h>
 #include <sgimips/sgimips/clockvar.h>
 
-u_int32_t next_clk_intr;
-u_int32_t missed_clk_intrs;
+uint32_t next_clk_intr;
+uint32_t missed_clk_intrs;
 
-void mips3_clock_intr(u_int32_t, u_int32_t, u_int32_t, u_int32_t);
+void mips3_clock_intr(vaddr_t, uint32_t, uint32_t);
 
 /*
  * Machine-dependent clock routines.
@@ -129,7 +130,7 @@
 	case MACH_SGI_IP12:
 		/* int(4) will take care of our clocks */
 		/* enable hardware interrupts including hardclock(9) */
-		_splnone();
+		spl0();
 		break;
 #endif /* MIPS1 */
 #if defined(MIPS3)
@@ -148,13 +149,13 @@
 
 #if defined(MIPS3)
 void
-mips3_clock_intr(u_int32_t status, u_int32_t cause, u_int32_t pc,
-		 u_int32_t ipending)
+mips3_clock_intr(vaddr_t pc, uint32_t status, uint32_t pending)
 {
 	struct clockframe cf;
 
 	cf.pc = pc;
 	cf.sr = status;
+	cf.intr = (curcpu()->ci_idepth > 1);
 	mips3_clockintr(&cf);
 }
 

Index: src/sys/arch/sgimips/sgimips/cpu.c
diff -u src/sys/arch/sgimips/sgimips/cpu.c:1.21.36.3 src/sys/arch/sgimips/sgimips/cpu.c:1.21.36.4
--- src/sys/arch/sgimips/sgimips/cpu.c:1.21.36.3	Fri Feb  5 07:39:54 2010
+++ src/sys/arch/sgimips/sgimips/cpu.c	Wed Dec 29 07:15:48 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.c,v 1.21.36.3 2010/02/05 07:39:54 matt Exp $	*/
+/*	$NetBSD: cpu.c,v 1.21.36.4 2010/12/29 07:15:48 matt Exp $	*/
 
 /*
  * Copyright (c) 2000 Soren S. Jorvang
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.21.36.3 2010/02/05 07:39:54 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.21.36.4 2010/12/29 07:15:48 matt Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -55,11 +55,9 @@
 
 static int	cpu_match(struct device *, struct cfdata *, void *);
 static void	cpu_attach(struct device *, struct device *, void *);
-void		cpu_intr(u_int32_t, u_int32_t, vaddr_t, u_int32_t);
+void		cpu_intr(int, vaddr_t, uint32_t);
 void *cpu_intr_establish(int, int, int (*func)(void *), void *);
-void		mips1_fpu_intr(u_int32_t, u_int32_t, u_int32_t, u_int32_t);
-
-void	MachFPInterrupt(u_int32_t, u_int32_t, u_int32_t, struct trapframe *);
+void		mips1_fpu_intr(vaddr_t, u_int32_t, u_int32_t);
 
 static struct evcnt mips_int0_evcnt =
 	EVCNT_INITIALIZER(EVCNT_TYPE_INTR, NULL, "mips", "int 0");
@@ -79,9 +77,6 @@
 static struct evcnt mips_int5_evcnt =
 	EVCNT_INITIALIZER(EVCNT_TYPE_INTR, NULL, "mips", "int 5");
 
-static struct evcnt mips_spurint_evcnt =
-	EVCNT_INITIALIZER(EVCNT_TYPE_INTR, NULL, "mips", "spurious interrupts");
-
 CFATTACH_DECL_NEW(cpu, 0,
     cpu_match, cpu_attach, NULL, NULL);
 
@@ -108,65 +103,48 @@
  * sorts of Bad Things(tm) to happen, including kernel stack overflows.
  */
 void
-cpu_intr(u_int32_t status, u_int32_t cause, vaddr_t pc, u_int32_t ipending)
+cpu_intr(int ppl, vaddr_t pc, uint32_t status)
 {
-	struct cpu_info *ci;
+	uint32_t pending;
+	int ipl;
 
-	ci = curcpu();
-	ci->ci_idepth++;
 	uvmexp.intrs++;
 
 	(void)(*platform.watchdog_reset)();
 
-	if (ipending & MIPS_HARD_INT_MASK) {
-        	if (ipending & MIPS_INT_MASK_5) {
-               		(void)(*platform.intr5)(status, cause, pc, ipending);
+	while (ppl < (ipl = splintr(&pending))) {
+		splx(ipl);		/* enable interrupts */
+
+        	if (pending & MIPS_INT_MASK_5) {
+               		(void)(*platform.intr5)(pc, status, pending);
 			mips_int5_evcnt.ev_count++;
-			cause &= ~MIPS_INT_MASK_5;
         	}
 
-		if (ipending & MIPS_INT_MASK_4) {
-			(void)(*platform.intr4)(status, cause, pc, ipending);
+		if (pending & MIPS_INT_MASK_4) {
+               		(void)(*platform.intr4)(pc, status, pending);
 			mips_int4_evcnt.ev_count++;
-			cause &= ~MIPS_INT_MASK_4;
 		}
 
-		if (ipending & MIPS_INT_MASK_3) {
-			(void)(*platform.intr3)(status, cause, pc, ipending);
+		if (pending & MIPS_INT_MASK_3) {
+               		(void)(*platform.intr3)(pc, status, pending);
 			mips_int3_evcnt.ev_count++;
-			cause &= ~MIPS_INT_MASK_3;
 		}
 
-	        if (ipending & MIPS_INT_MASK_2) {
-			(void)(*platform.intr2)(status, cause, pc, ipending);
+	        if (pending & MIPS_INT_MASK_2) {
+               		(void)(*platform.intr2)(pc, status, pending);
 			mips_int2_evcnt.ev_count++;
-			cause &= ~MIPS_INT_MASK_2;
 		}
 
-		if (ipending & MIPS_INT_MASK_1) {
-			(void)(*platform.intr1)(status, cause, pc, ipending);
+		if (pending & MIPS_INT_MASK_1) {
+               		(void)(*platform.intr1)(pc, status, pending);
 			mips_int1_evcnt.ev_count++;
-			cause &= ~MIPS_INT_MASK_1;
 		}
 
-		if (ipending & MIPS_INT_MASK_0) {  
-			(void)(*platform.intr0)(status, cause, pc, ipending);
+		if (pending & MIPS_INT_MASK_0) {  
+               		(void)(*platform.intr0)(pc, status, pending);
 			mips_int0_evcnt.ev_count++;
-			cause &= ~MIPS_INT_MASK_0;
 		}
-
-		if (cause & status & MIPS_HARD_INT_MASK)
-			mips_spurint_evcnt.ev_count++;
 	}
-	ci->ci_idepth--;
-
-#ifdef __HAVE_FAST_SOFTINTS
-	/* software interrupt */
-	ipending &= MIPS_SOFT_INT_MASK;
-	if (ipending == 0)
-		return;
-	softint_process(ipending);
-#endif
 }
 
 void *
@@ -176,16 +154,16 @@
 	return (void *) -1;
 }
 
+#ifdef MIPS1
 void
-mips1_fpu_intr(u_int32_t status, u_int32_t cause, u_int32_t pc,
-    u_int32_t ipending)
+mips1_fpu_intr(vaddr_t pc, uint32_t status, uint32_t pending)
 {
-
 	if (!USERMODE(status))
-		panic("kernel used FPU: PC 0x%08x, CR 0x%08x, SR 0x%08x",
-		    pc, cause, status);
+		panic("kernel used FPU: PC 0x%08x, SR 0x%08x",
+		    pc, status);
 
 #if !defined(NOFPU) && !defined(FPEMUL)
-	MachFPInterrupt(status, cause, pc, curlwp->l_md.md_utf);
+	mips_fpu_intr(pc, curlwp->l_md.md_utf);
 #endif
 }
+#endif

Index: src/sys/arch/sgimips/sgimips/machdep.c
diff -u src/sys/arch/sgimips/sgimips/machdep.c:1.121.8.5 src/sys/arch/sgimips/sgimips/machdep.c:1.121.8.6
--- src/sys/arch/sgimips/sgimips/machdep.c:1.121.8.5	Sun Mar 21 17:38:35 2010
+++ src/sys/arch/sgimips/sgimips/machdep.c	Wed Dec 29 07:15:48 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.121.8.5 2010/03/21 17:38:35 cliff Exp $	*/
+/*	$NetBSD: machdep.c,v 1.121.8.6 2010/12/29 07:15:48 matt Exp $	*/
 
 /*
  * Copyright (c) 2000 Soren S. Jorvang
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.121.8.5 2010/03/21 17:38:35 cliff Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.121.8.6 2010/12/29 07:15:48 matt Exp $");
 
 #include "opt_ddb.h"
 #include "opt_kgdb.h"
@@ -42,6 +42,8 @@
 #include "opt_cputype.h"
 #include "opt_mips_cache.h"
 
+#define __INTR_PRIVATE
+
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/kernel.h>
@@ -128,36 +130,39 @@
 
 int ncpus;
 
-/* CPU interrupt masks */
-const int *ipl2spl_table;
-
-#define	IPL2SPL_TABLE_COMMON \
-	[IPL_SOFTCLOCK] = MIPS_SOFT_INT_MASK_1, \
-	[IPL_HIGH] = MIPS_INT_MASK,
+#define IPL2SPL_TABLE_COMMON					\
+	[IPL_NONE] =		0,				\
+	[IPL_SOFTCLOCK] =	MIPS_SOFT_INT_MASK_0,		\
+	[IPL_SOFTNET] =		MIPS_SOFT_INT_MASK,		\
+	[IPL_DDB] =		MIPS_INT_MASK,			\
+	[IPL_HIGH] =		MIPS_INT_MASK
 
+/* CPU interrupt sr maps */
 #if defined(MIPS1)
-static const int sgi_ip12_ipl2spl_table[] = {
-	IPL2SPL_TABLE_COMMON
+static const struct ipl_sr_map sgi_ip12_ipl_sr_map = {
+    .sr_bits = {
+	IPL2SPL_TABLE_COMMON,
 	[IPL_VM] = MIPS_INT_MASK_2|MIPS_INT_MASK_1|MIPS_INT_MASK_0|
-	    MIPS_SOFT_INT_MASK_0,
+	    MIPS_SOFT_INT_MASK,
 	[IPL_SCHED] = MIPS_INT_MASK_4|MIPS_INT_MASK_3|MIPS_INT_MASK_2|
-	    MIPS_INT_MASK_1|MIPS_INT_MASK_0|MIPS_SOFT_INT_MASK_0,
+	    MIPS_INT_MASK_1|MIPS_INT_MASK_0|MIPS_SOFT_INT_MASK,
+    },
 };
 #endif /* defined(MIPS1) */
 #if defined(MIPS3)
-static const int sgi_ip2x_ipl2spl_table[] = {
-	IPL2SPL_TABLE_COMMON
-	[IPL_VM] = MIPS_INT_MASK_1|MIPS_INT_MASK_0|
-	    MIPS_SOFT_INT_MASK_1|MIPS_SOFT_INT_MASK_0,
-	[IPL_SCHED] = MIPS_INT_MASK_5|MIPS_INT_MASK_3|MIPS_INT_MASK_2|
-	    MIPS_INT_MASK_1|MIPS_INT_MASK_0|
-	    MIPS_SOFT_INT_MASK_1|MIPS_SOFT_INT_MASK_0,
+static const struct ipl_sr_map sgi_ip2x_ipl_sr_map = {
+    .sr_bits = {
+	IPL2SPL_TABLE_COMMON,
+	[IPL_VM] = MIPS_INT_MASK_1|MIPS_INT_MASK_0|MIPS_SOFT_INT_MASK,
+	[IPL_SCHED] = MIPS_INT_MASK,
+    },
 };
-static const int sgi_ip3x_ipl2spl_table[] = {
-	IPL2SPL_TABLE_COMMON
-	[IPL_VM] = MIPS_INT_MASK_0|MIPS_SOFT_INT_MASK_1|MIPS_SOFT_INT_MASK_0,
-	[IPL_SCHED] = MIPS_INT_MASK_5|MIPS_INT_MASK_0|
-	    MIPS_SOFT_INT_MASK_1|MIPS_SOFT_INT_MASK_0,
+static const struct ipl_sr_map sgi_ip3x_ipl_sr_map = {
+    .sr_bits = {
+	IPL2SPL_TABLE_COMMON,
+	[IPL_VM] = MIPS_INT_MASK_0|MIPS_SOFT_INT_MASK,
+	[IPL_SCHED] = MIPS_INT_MASK_5|MIPS_INT_MASK_0|MIPS_SOFT_INT_MASK,
+    },
 };
 #endif /* defined(MIPS3) */
 
@@ -170,11 +175,11 @@
 #endif
 
 #if defined(MIPS1)
-extern void mips1_fpu_intr(u_int32_t, u_int32_t, u_int32_t, u_int32_t);
+extern void mips1_fpu_intr(vaddr_t, uint32_t, uint32_t);
 #endif
 
 #if defined(MIPS3)
-extern void mips3_clock_intr(u_int32_t, u_int32_t, u_int32_t, u_int32_t);
+extern void mips3_clock_intr(vaddr_t, uint32_t, uint32_t);
 #endif
 
 void	mach_init(int, char **, uintptr_t, void *);
@@ -193,7 +198,7 @@
 static void	unimpl_bus_reset(void);
 static void	unimpl_cons_init(void);
 static void	*unimpl_intr_establish(int, int, int (*)(void *), void *);
-static void	unimpl_intr(u_int32_t, u_int32_t, u_int32_t, u_int32_t);
+static void	unimpl_intr(vaddr_t, uint32_t, uint32_t);
 static unsigned	long nulllong(void);
 static void	nullvoid(void);
 
@@ -222,7 +227,7 @@
  * safepri is a safe priority for sleep to set for a spin-wait during
  * autoconfiguration or after a panic.  Used as an argument to splx().
  */
-int	safepri = MIPS1_PSL_LOWIPL;
+int	safepri = IPL_HIGH;
 
 extern u_int32_t ssir;
 extern struct user *proc0paddr;
@@ -522,7 +527,7 @@
 				mach_subtype = MACH_SGI_IP12_HPLC;
                 }
 
-		ipl2spl_table = sgi_ip12_ipl2spl_table;
+		ipl_sr_map = sgi_ip12_ipl_sr_map;
 		platform.intr0 = mips1_fpu_intr;
 		break;
 #endif /* MIPS1 */
@@ -531,19 +536,19 @@
 	case MACH_SGI_IP20:
 		i = *(volatile u_int32_t *)MIPS_PHYS_TO_KSEG1(0x1fbd0000);
 		mach_boardrev = (i & 0x7000) >> 12;
-		ipl2spl_table = sgi_ip2x_ipl2spl_table;
+		ipl_sr_map = sgi_ip2x_ipl_sr_map;
 		platform.intr5 = mips3_clock_intr;
 		break;
 	case MACH_SGI_IP22:
-		ipl2spl_table = sgi_ip2x_ipl2spl_table;
+		ipl_sr_map = sgi_ip2x_ipl_sr_map;
 		platform.intr5 = mips3_clock_intr;
 		break;
 	case MACH_SGI_IP30:
-		ipl2spl_table = sgi_ip3x_ipl2spl_table;
+		ipl_sr_map = sgi_ip3x_ipl_sr_map;
 		platform.intr5 = mips3_clock_intr;
 		break;
 	case MACH_SGI_IP32:
-		ipl2spl_table = sgi_ip3x_ipl2spl_table;
+		ipl_sr_map = sgi_ip3x_ipl_sr_map;
 		platform.intr5 = mips3_clock_intr;
 		break;
 #endif /* MIPS3 */
@@ -876,17 +881,17 @@
 unimpl_intr_establish(int level, int ipl, int (*handler) (void *), void *arg)
 {
 	panic("target init didn't set intr_establish");
-	return (void *)NULL;
+	return NULL;
 }
 
 static void
-unimpl_intr(u_int32_t status, u_int32_t cause, u_int32_t pc, u_int32_t ipending)
+unimpl_intr(vaddr_t pc, uint32_t status, uint32_t pending)
 {
-	printf("spurious interrupt, ipending %x\n", ipending);
+	printf("spurious interrupt pending %#x\n", pending);
 }
 
 static unsigned long
-nulllong()
+nulllong(void)
 {
 	printf("nulllong\n");
 	return (0);
@@ -987,10 +992,3 @@
 		break;
 	}
 }
-
-ipl_cookie_t
-makeiplcookie(ipl_t ipl)
-{
-
-	return (ipl_cookie_t){._spl = ipl2spl_table[ipl]};
-}

Reply via email to