Module Name: src Committed By: cliff Date: Fri May 21 23:35:21 UTC 2010
Modified Files: src/sys/arch/mips/rmi [matt-nb5-mips64]: rmixl_spl.S Log Message: - turn off PARANOIA - except for softintr irqs, ipl_eimr_map is no longer const; all other irq bits are set/cleared at interrupt establish/disestablish - add _splsw_splddb - in _splsw_splintr, correct the return IPL_NONE case, and clarify some comments To generate a diff of this commit: cvs rdiff -u -r1.1.2.2 -r1.1.2.3 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_spl.S diff -u src/sys/arch/mips/rmi/rmixl_spl.S:1.1.2.2 src/sys/arch/mips/rmi/rmixl_spl.S:1.1.2.3 --- src/sys/arch/mips/rmi/rmixl_spl.S:1.1.2.2 Wed Apr 14 01:23:15 2010 +++ src/sys/arch/mips/rmi/rmixl_spl.S Fri May 21 23:35:21 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: rmixl_spl.S,v 1.1.2.2 2010/04/14 01:23:15 cliff Exp $ */ +/* $NetBSD: rmixl_spl.S,v 1.1.2.3 2010/05/21 23:35:21 cliff Exp $ */ /*- * Copyright (c) 2009, 2010 The NetBSD Foundation, Inc. @@ -37,14 +37,13 @@ #include <mips/asm.h> #include <mips/cpuregs.h> -RCSID("$NetBSD: rmixl_spl.S,v 1.1.2.2 2010/04/14 01:23:15 cliff Exp $"); +RCSID("$NetBSD: rmixl_spl.S,v 1.1.2.3 2010/05/21 23:35:21 cliff Exp $"); #include "assym.h" -#define PARANOIA /* XXX TMP FIXME */ #define MAP_SCALESHIFT 3 -#define RMIXL_SOFT_INT_MASK_0 (MIPS_SOFT_INT_MASK_1 >> 8) +#define RMIXL_SOFT_INT_MASK_1 (MIPS_SOFT_INT_MASK_1 >> 8) #define RMIXL_SOFT_INT_MASK (MIPS_SOFT_INT_MASK >> 8) #define RMIXL_INT_MASK_1 (MIPS_INT_MASK_1 >> 8) #define RMIXL_INT_MASK_5 (MIPS_INT_MASK_5 >> 8) @@ -55,20 +54,21 @@ /* * Array of mask of bits to set in the EIMR when we go to a * given hardware interrupt priority level. + * The softint bits in [IPL_NONE] and [IPL_SOFTCLOCK] should stay constant + * Hard intr bits are managed by rmixl_vec_establish and rmixl_vec_disestablish. */ - .rdata + .data .globl _C_LABEL(ipl_eimr_map) .type _C_LABEL(ipl_eimr_map),@object .p2align MAP_SCALESHIFT _C_LABEL(ipl_eimr_map): - .dword ~0 /* IPL_NONE */ - .dword ~RMIXL_SOFT_INT_MASK_0 /* IPL_SOFT{CLOCK,BIO} */ - .dword ~RMIXL_SOFT_INT_MASK /* IPL_SOFT{NET,SERIAL} */ - .dword RMIXL_INT_MASK_5 /* IPL_VM */ + .dword RMIXL_SOFT_INT_MASK /* IPL_NONE */ + .dword RMIXL_SOFT_INT_MASK_1 /* IPL_SOFT{CLOCK,BIO} */ + .dword 0 /* IPL_SOFT{NET,SERIAL} */ + .dword 0 /* IPL_VM */ .dword 0 /* IPL_SCHED */ -#if IPL_SCHED != IPL_HIGH + .dword 0 /* IPL_DDB */ .dword 0 /* IPL_HIGH */ -#endif .text /* @@ -252,6 +252,13 @@ nop END(_splsw_splhigh) +STATIC_LEAF(_splsw_splddb) + REG_L a0, _C_LABEL(ipl_eimr_map) + 8*IPL_DDB + li a1, IPL_DDB + b _splraise + nop +END(_splsw_splddb) + STATIC_LEAF(_splsw_splsched) REG_L a0, _C_LABEL(ipl_eimr_map) + 8*IPL_SCHED li a1, IPL_SCHED @@ -297,29 +304,25 @@ STATIC_LEAF(_splsw_splintr) dmfc0 ta1, RMIXL_COP_0_EIRR # get active interrupts # restrict to hard int bits: - and v1, ta1, RMIXL_SOFT_INT_MASK # v1 &= ~RMIXL_SOFT_INT_MASK - xor v1, ta1 # " " + and v1, ta1, RMIXL_SOFT_INT_MASK # v1 = ta1 & ~RMIXL_SOFT_INT_MASK + xor v1, ta1 # " " - li v0, IPL_NONE # return IPL_NONE ... - beq v1, zero, 2f # ... if nothing pending - nop - - li v0, IPL_VM # start at IPL_VM + li v0, IPL_NONE PTR_LA ta3, _C_LABEL(ipl_eimr_map) + 8*IPL_VM REG_L ta2, -8(ta3) # load 'enabled' bits for IPL_SOFTSERIAL - # ta2 has 'enabled' ints and v1, ta2 # apply to pending bits + beq v1, zero, 4f # if nothing pending... + nop # ... return IPL_NONE + li v0, IPL_VM # ipl=IPL_VM 1: - REG_L ta2, (ta3) # load 'enabled' bits for ipl in v0 + REG_L ta2, (ta3) # load 'enabled' bits for ipl and ta2, v1 # any match to pending intrs? beq ta2, zero, 2f # no, return ipl - - PTR_ADDU ta3, 1 << MAP_SCALESHIFT # point to next entry - addiu v0, 1 # increase ipl by 1 - move v1, ta2 # reduce down pending intrs - b 1b # and check them - nop + PTR_ADDI ta3, 1 << MAP_SCALESHIFT # point to next entry + addiu v0, 1 # ipl++ + move v1, ta2 # update highest pending + b 1b # loop 2: /* @@ -329,8 +332,7 @@ * the RMI evbmips_iointr function will sort through * individial EIRR requests */ - beq v1, zero, 4f # skip ahead if nothing pending - li t2, RMIXL_INT_MASK_5 # load RMIXL_INT_MASK_5 + li t2, RMIXL_INT_MASK_5 # load RMIXL_INT_MASK_5 and t1, v1, t2 # save count/compare intr request value nor t0, zero, t2 # invert the mask and v1, t0 # v1 &= ~RMIXL_INT_MASK_5