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: /*