Module Name:    src
Committed By:   cliff
Date:           Fri May 28 22:14:53 UTC 2010

Modified Files:
        src/sys/arch/mips/rmi [matt-nb5-mips64]: rmixl_intr.c rmixl_spl.S

Log Message:
rmixl_spl.S:
- where possible, stop using CP0 STATUS to disable all interrupts,zero EIMR 
instead.  more efficient since less meddling with CP0.
assume STATUS[IE] is normally set.
- add rmixl_spl_init_cpu(), to initialize cp0 interrupt control for this cpu

rmixl_intr.c:
- rmixl_intr_init_cpu() calls rmixl_spl_init_cpu()
to set up CP0 interrupt controls for this cpu


To generate a diff of this commit:
cvs rdiff -u -r1.1.2.20 -r1.1.2.21 src/sys/arch/mips/rmi/rmixl_intr.c
cvs rdiff -u -r1.1.2.3 -r1.1.2.4 src/sys/arch/mips/rmi/rmixl_spl.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/mips/rmi/rmixl_intr.c
diff -u src/sys/arch/mips/rmi/rmixl_intr.c:1.1.2.20 src/sys/arch/mips/rmi/rmixl_intr.c:1.1.2.21
--- src/sys/arch/mips/rmi/rmixl_intr.c:1.1.2.20	Fri May 21 23:35:42 2010
+++ src/sys/arch/mips/rmi/rmixl_intr.c	Fri May 28 22:14:53 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: rmixl_intr.c,v 1.1.2.20 2010/05/21 23:35:42 cliff Exp $	*/
+/*	$NetBSD: rmixl_intr.c,v 1.1.2.21 2010/05/28 22:14:53 cliff Exp $	*/
 
 /*-
  * Copyright (c) 2007 Ruslan Ermilov and Vsevolod Lobko.
@@ -64,7 +64,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rmixl_intr.c,v 1.1.2.20 2010/05/21 23:35:42 cliff Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rmixl_intr.c,v 1.1.2.21 2010/05/28 22:14:53 cliff Exp $");
 
 #include "opt_ddb.h"
 #define	__INTR_PRIVATE
@@ -474,13 +474,11 @@
 rmixl_intr_init_cpu(struct cpu_info *ci)
 {
 	struct rmixl_cpu_softc *sc = (void *)ci->ci_softc;
+	extern void rmixl_spl_init_cpu(void);
+
 	KASSERT(sc != NULL);
 
-	/* ack any pending in the EIRR, zeroing CAUSE[8..15] */
-	uint64_t eirr;
-	asm volatile("dmfc0 %0, $9, 6;" : "=r"(eirr));
-	eirr &= ~0xff;
-	asm volatile("dmtc0 %0, $9, 6;" :: "r"(eirr));
+	rmixl_spl_init_cpu();
 
 	for (int vec=0; vec < NINTRVECS; vec++)
 		evcnt_attach_dynamic(&sc->sc_vec_evcnts[vec],

Index: src/sys/arch/mips/rmi/rmixl_spl.S
diff -u src/sys/arch/mips/rmi/rmixl_spl.S:1.1.2.3 src/sys/arch/mips/rmi/rmixl_spl.S:1.1.2.4
--- src/sys/arch/mips/rmi/rmixl_spl.S:1.1.2.3	Fri May 21 23:35:21 2010
+++ src/sys/arch/mips/rmi/rmixl_spl.S	Fri May 28 22:14:53 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: rmixl_spl.S,v 1.1.2.3 2010/05/21 23:35:21 cliff Exp $	*/
+/*	$NetBSD: rmixl_spl.S,v 1.1.2.4 2010/05/28 22:14:53 cliff Exp $	*/
 
 /*-
  * Copyright (c) 2009, 2010 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
 #include <mips/asm.h>
 #include <mips/cpuregs.h>
 
-RCSID("$NetBSD: rmixl_spl.S,v 1.1.2.3 2010/05/21 23:35:21 cliff Exp $");
+RCSID("$NetBSD: rmixl_spl.S,v 1.1.2.4 2010/05/28 22:14:53 cliff Exp $");
 
 #include "assym.h"
 
@@ -71,6 +71,29 @@
 	.dword	0			/* IPL_HIGH */
 
 	.text
+
+/*
+ * initialize cp0 interrupt control for this cpu
+ * - set STATUS[IE]
+ * - clear EIRR and EIMR
+ * on return, all interrupts are disabled by EIMR
+ *
+ * henceforth STATUS[IE] is expected to remain normally set
+ * but may be cleared and restored for temporary interrupt disablement
+ *
+ * call before the first call to spl0 on this cpu
+ */
+LEAF_NOPROFILE(rmixl_spl_init_cpu)
+	mfc0	t0, MIPS_COP_0_STATUS		# get STATUS
+	ori	t0, MIPS_SR_INT_IE		# set IE
+	mtc0	zero, MIPS_COP_0_STATUS		## disable all ints in STATUS
+	dmtc0	zero, RMIXL_COP_0_EIMR		##  "       "   "   "  EIMR
+	dmtc0	zero, RMIXL_COP_0_EIRR		## clear EIRR
+	mtc0	t0, MIPS_COP_0_STATUS		## set STATUS | IE
+	j	ra
+	 nop
+END(rmixl_spl_init_cpu)
+
 /*
  * RMIXL processor interrupt control
  *
@@ -86,15 +109,10 @@
 	INT_L	v0, CPU_INFO_CPL(a3)		# get current IPL from cpu_info
 	sltu	v1, a1, v0			# newipl < curipl
 	bnez	v1, 2f				# yes, don't change.
-	 mfc0	a2, MIPS_COP_0_STATUS		# load STATUS
-	and	a2, ~MIPS_INT_MASK		# clear STATUS[IM]
-	sll	v1, a0, 8			# EIMR[7:0] to STATUS[15:8]
-	and	v1, MIPS_INT_MASK		#  "        "   "
-	or	v1, a2				# new STATUS value
-	mtc0	zero, MIPS_COP_0_STATUS		## disable all ints in STATUS
+	 nop
+	dmtc0	zero, RMIXL_COP_0_EIMR		## disable all interrupts
 	INT_S	a1, CPU_INFO_CPL(a3)		## save IPL in cpu_info
 	dmtc0	a0, RMIXL_COP_0_EIMR		## set new EIMR
-	mtc0	v1, MIPS_COP_0_STATUS		## set new STATUS
 #ifdef PARANOIA
 	j	ra
 	 nop
@@ -118,22 +136,14 @@
 99:	beqz	v0, 99b				# loop forever if false
 	 nop
 #endif /* PARANOIA */
-	#move	a1, zero			# avoid lookup on splx(IPL_NONE)
-	#beq	a0, zero, 1f			# skip load
 	PTR_LA	v1, _C_LABEL(ipl_eimr_map)	# get address of table
 	sll	a2, a0, MAP_SCALESHIFT		# convert IPL to array offset
 	PTR_ADDU v1, a2				# add to table addr
 	REG_L	v1, (v1)			# load EIMR bits for this IPL
 1:
-	dmfc0	a2, MIPS_COP_0_STATUS		# load STATUS
-	and	a2, ~MIPS_INT_MASK		# clear STATUS[IM]
-	sll	v0, v1, 8			# EIMR[7:0] to STATUS[15:8]
-	and	v0, MIPS_INT_MASK		#  "        "   "
-	or	v0, a2				# new STATUS value
 	dmtc0	zero, RMIXL_COP_0_EIMR		## disable all interrupts
-	INT_S	a0, CPU_INFO_CPL(a3)		## save IPL in cpu_info (KSEG0)
+	INT_S	a0, CPU_INFO_CPL(a3)		## save IPL in cpu_info
 	dmtc0	v1, RMIXL_COP_0_EIMR		## set new EIMR
-	mtc0	v0, MIPS_COP_0_STATUS		## set new STATUS
 #ifdef PARANOIA
 	j	ra
 	 nop
@@ -155,23 +165,13 @@
 STATIC_LEAF(_splsw_spl0)
 	REG_L	v1, _C_LABEL(ipl_eimr_map) + 8*IPL_NONE
 	PTR_L	a3, L_CPU(MIPS_CURLWP)
-	mtc0	zero, MIPS_COP_0_CAUSE		# clear SOFT_INT bits
-	dmfc0	a2, MIPS_COP_0_STATUS		# load STATUS
-	and	a2, ~MIPS_INT_MASK		# clear STATUS[IM]
-	sll	v0, v1, 8			# EIMR[7:0] to STATUS[15:8]
-	and	v0, MIPS_INT_MASK		#  "        "   "
-	or	v0, MIPS_SR_INT_IE		# set STATUS[IE]
-	or	v0, a2				# new STATUS value
-	mtc0	zero, MIPS_COP_0_STATUS		## disable all interrupts
+	dmtc0	zero, RMIXL_COP_0_EIMR		## disable all interrupts
 #if IPL_NONE == 0
 	INT_S	zero, CPU_INFO_CPL(a3)		## set ipl to 0
 #else
 #error IPL_NONE != 0
 #endif
 	dmtc0	v1, RMIXL_COP_0_EIMR		## set new EIMR
-	mtc0	v0, MIPS_COP_0_STATUS		## set new STATUS
-	nop
-	nop
 	j	ra
 	 nop
 END(_splsw_spl0)
@@ -186,31 +186,26 @@
 END(rmixl_spln)
 
 STATIC_LEAF(_splsw_setsoftintr)
-	mfc0	v1, MIPS_COP_0_STATUS		# save status register
-	mtc0	zero, MIPS_COP_0_STATUS		## disable interrupts (2 cycles)
-	nop
-	nop
+	dmfc0	v1, RMIXL_COP_0_EIMR		# save EIMR register
+	dmtc0	zero, RMIXL_COP_0_EIMR		## disable all interrupts
 	mfc0	v0, MIPS_COP_0_CAUSE		## load cause register
-	nop
 	or	v0, v0, a0			## set soft intr. bits
 	mtc0	v0, MIPS_COP_0_CAUSE		## store back
-	mtc0	v1, MIPS_COP_0_STATUS		## enable interrupts
+	dmtc0	v1, RMIXL_COP_0_EIMR		## restore EIMR
 	j	ra
-	nop
+	 nop
 END(_splsw_setsoftintr)
 
 STATIC_LEAF(_splsw_clrsoftintr)
-	mfc0	v1, MIPS_COP_0_STATUS		# save status register
-	mtc0	zero, MIPS_COP_0_STATUS		## disable interrupts (2 cycles)
-	nop
-	nop
+	dmfc0	v1, RMIXL_COP_0_EIMR		# save EIMR register
+	dmtc0	zero, RMIXL_COP_0_EIMR		## disable all interrupts
 	mfc0	v0, MIPS_COP_0_CAUSE		## load cause register
 	nor	a0, zero, a0			## bitwise inverse of A0
 	and	v0, v0, a0			## clear soft intr. bits
 	mtc0	v0, MIPS_COP_0_CAUSE		## store back
-	mtc0	v1, MIPS_COP_0_STATUS		## enable interrupts
+	dmtc0	v1, RMIXL_COP_0_EIMR		## enable EIMR
 	j	ra
-	nop
+	 nop
 END(_splsw_clrsoftintr)
 
 STATIC_LEAF(_splsw_splraise)
@@ -229,15 +224,10 @@
 	INT_L	v0, CPU_INFO_CPL(a3)		# get current IPL from cpu_info
 	li	a1, IPL_HIGH			# 
 	beq	v0, a1, 1f			# don't do anything if IPL_HIGH
-	mfc0	v1, MIPS_COP_0_STATUS		# load STATUS
-	move	a2, zero			# clear for EIMR
-	and	a0, v1, MIPS_INT_MASK		# select all interrupts
-	xor	a0, v1				# clear STATUS[IM]
-	mtc0	zero, MIPS_COP_0_STATUS		## disable all interrupts
+	 nop
+	dmtc0	zero, RMIXL_COP_0_EIMR		## disable all interrupts
 	INT_S	a1, CPU_INFO_CPL(a3)		## save IPL in cpu_info
-	dmtc0	a2, RMIXL_COP_0_EIMR		## set new EIMR
-	mtc0	a0, MIPS_COP_0_STATUS		## set new STATUS
-	 nop					# XXXXX
+						## interrupts remain disabled!
 #ifdef PARANOIA
 	j	ra				# return
 	 nop
@@ -323,6 +313,7 @@
 	addiu	v0, 1				# ipl++
 	move	v1, ta2				# update highest pending
 	b	1b				# loop
+	 nop
 
 2:
 	/*

Reply via email to