Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/sh5/sh5 Small simplification to the splx() code pat...
details: https://anonhg.NetBSD.org/src/rev/3a6e9cf48eab
branches: trunk
changeset: 535892:3a6e9cf48eab
user: scw <scw%NetBSD.org@localhost>
date: Sat Aug 31 08:42:00 2002 +0000
description:
Small simplification to the splx() code path when dealing with soft
interrupts, and fix a couple of nits in the generic soft interrupt code.
Soft interrupts now work.
diffstat:
sys/arch/sh5/sh5/exception.S | 42 +++++++-----------------------------------
sys/arch/sh5/sh5/locore_subr.S | 10 +++++++---
sys/arch/sh5/sh5/softintr.c | 9 +++++----
3 files changed, 19 insertions(+), 42 deletions(-)
diffs (146 lines):
diff -r 7927384aff49 -r 3a6e9cf48eab sys/arch/sh5/sh5/exception.S
--- a/sys/arch/sh5/sh5/exception.S Sat Aug 31 07:56:14 2002 +0000
+++ b/sys/arch/sh5/sh5/exception.S Sat Aug 31 08:42:00 2002 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: exception.S,v 1.5 2002/08/28 21:05:25 scw Exp $ */
+/* $NetBSD: exception.S,v 1.6 2002/08/31 08:42:00 scw Exp $ */
/*
* Copyright 2002 Wasabi Systems, Inc.
@@ -1180,29 +1180,6 @@
-
-/******************************************************************************
- *
- * void check_softint_loweripl(int newipl)
- *
- * [Note: Do not call directly from C code]
- *
- * Check for pending soft interrupt BEFORE lowering the interrupt priority
- * to "newipl" in r2. Called from splx().
- */
-Lcheck_softint_loweripl:
- ptabs/l r18, tr0 /* Return address to tr0 */
- pta/l Lcheck_softint_lower, tr1
- LEA(_C_LABEL(ssir), r0) /* Get bitmap of pending soft ints */
- ld.l r0, 0, r1
- beq/l r1, r63, tr0 /* Return if no soft ints pending */
- pta/u 1f, tr0
- blink tr1, r63
-1: ptabs/l r18, tr0 /* Return address to tr0 */
- putcon r2, sr
- blink tr0, r63
-
-
/******************************************************************************
*
* void Lcheck_softint(void) [Note: Do not call directly from C code]
@@ -1223,23 +1200,17 @@
getcon sr, r2
Lcheck_softint_lower:
+ pta/u 1f, tr1 /* Preload the exit path */
+ ori r2, SH5_CONREG_SR_IMASK_ALL, r3
+ putcon r3, sr /* Disable interrupts */
shlri r2, SH5_CONREG_SR_IMASK_SHIFT, r3
andi r3, SH5_CONREG_SR_IMASK_MASK, r3 /* current spl to r3 */
+ ld.l r0, 0, r1 /* Re-fetch ssir */
movi 1, r4
shlld r4, r3, r4 /* r4 = 1 << curspl */
addi r4, -1, r4
andc r1, r4, r1 /* r1 &= ~((1 << curspl) - 1) */
- beq/l r1, r63, tr0 /* Return if ipl is too high */
-
- /*
- * Disable interrupts and re-check in case we were pre-emted.
- */
- pta/u 1f, tr1
- ori r2, SH5_CONREG_SR_IMASK_ALL, r3
- putcon r3, sr
- ld.l r0, 0, r1 /* Re-fetch softint-pending bitmap */
- andc r1, r4, r1 /* r1 &= ~((1 << curspl) - 1) */
- beq/u r1, r63, tr1 /* Exit if we were pre-emted */
+ beq/l r1, r63, tr1 /* Return if ipl is too high */
/*
* Raise spl to the level of the highest priority pending soft int.
@@ -1264,6 +1235,7 @@
and r2, r0, r2
and r3, r0, r3
blink tr0, r63
+
1: putcon r2, sr
blink tr0, r63
diff -r 7927384aff49 -r 3a6e9cf48eab sys/arch/sh5/sh5/locore_subr.S
--- a/sys/arch/sh5/sh5/locore_subr.S Sat Aug 31 07:56:14 2002 +0000
+++ b/sys/arch/sh5/sh5/locore_subr.S Sat Aug 31 08:42:00 2002 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: locore_subr.S,v 1.4 2002/08/30 10:45:31 scw Exp $ */
+/* $NetBSD: locore_subr.S,v 1.5 2002/08/31 08:42:00 scw Exp $ */
/*
* Copyright 2002 Wasabi Systems, Inc.
@@ -243,14 +243,18 @@
* the lowered spl permits them.
*/
ENTRY_NOPROFILE(splx)
+ ptabs/l r18, tr0
+ pta/u Lcheck_softint_lower, tr1
getcon sr, r4
- LEAF(Lcheck_softint_loweripl, r0)
- ptabs/l r0, tr0
+ LEA(_C_LABEL(ssir), r0) /* Get bitmap of pending soft ints */
movi SH5_CONREG_SR_IMASK_ALL, r3
shlli r2, SH5_CONREG_SR_IMASK_SHIFT, r2
andc r4, r3, r4
and r2, r3, r2
or r4, r2, r2
+ ld.l r0, 0, r1
+ bne/u r1, r63, tr1 /* Go deal with them if any pending */
+ putcon r2, sr /* Restore interrupt level */
blink tr0, r63
diff -r 7927384aff49 -r 3a6e9cf48eab sys/arch/sh5/sh5/softintr.c
--- a/sys/arch/sh5/sh5/softintr.c Sat Aug 31 07:56:14 2002 +0000
+++ b/sys/arch/sh5/sh5/softintr.c Sat Aug 31 08:42:00 2002 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: softintr.c,v 1.1 2002/07/05 13:32:06 scw Exp $ */
+/* $NetBSD: softintr.c,v 1.2 2002/08/31 08:42:00 scw Exp $ */
/*
* Copyright 2002 Wasabi Systems, Inc.
@@ -128,7 +128,7 @@
simple_lock_init(&si->si_slock);
si->si_evcnt = &_sh5_intr_events[i];
- si->si_ipl = soft_intr_prio[i];
+ si->si_ipl = soft_intr_prio[i] - 1;
}
ssir = 0;
@@ -221,6 +221,7 @@
n = netisr;
netisr = 0;
splx(s);
+
#include <net/netisr_dispatch.h>
#undef DONETISR
@@ -247,11 +248,11 @@
KDASSERT(softspl > oldspl);
- for (i = _IPL_NSOFT - 1, softspl -= 1; i >= 0; i--)
+ for (i = _IPL_NSOFT - 1; i >= 0; i--)
if (softspl == soft_intr_prio[i])
break;
- KDASSERT(i != _IPL_NSOFT);
+ KDASSERT(i >= 0);
for ( ; i >= 0 && soft_intr_prio[i] > oldspl; i--) {
si = &soft_intrs[i];
Home |
Main Index |
Thread Index |
Old Index