Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/mips/mips On mipsNN use the trap instruction to pan...
details: https://anonhg.NetBSD.org/src/rev/7556c4e5a330
branches: trunk
changeset: 808892:7556c4e5a330
user: matt <matt%NetBSD.org@localhost>
date: Sat Jun 06 20:55:45 2015 +0000
description:
On mipsNN use the trap instruction to panic or pop into ddb instead of
looping forever in the PARANOIA chunks.
diffstat:
sys/arch/mips/mips/locore.S | 38 ++++++++++++++++++++++++++++++--------
1 files changed, 30 insertions(+), 8 deletions(-)
diffs (123 lines):
diff -r 570b62c364bc -r 7556c4e5a330 sys/arch/mips/mips/locore.S
--- a/sys/arch/mips/mips/locore.S Sat Jun 06 20:53:38 2015 +0000
+++ b/sys/arch/mips/mips/locore.S Sat Jun 06 20:55:45 2015 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: locore.S,v 1.194 2015/06/03 17:55:26 matt Exp $ */
+/* $NetBSD: locore.S,v 1.195 2015/06/06 20:55:45 matt Exp $ */
/*
* Copyright (c) 1992, 1993
@@ -212,20 +212,28 @@
* called at IPL_SCHED
*/
NESTED(cpu_switchto, CALLFRAME_SIZ, ra)
-#ifdef PARANOIA
+#if defined(PARANOIA)
/*
* Make sure we are at IPL_SCHED
*/
PTR_L v0, L_CPU(MIPS_CURLWP)
INT_L v1, CPU_INFO_CPL(v0)
+#if __mips >= 32
+ tnei v1, IPL_SCHED
+#else
li v0, IPL_SCHED
10: bne v0, v1, 10b
nop
+#endif
mfc0 t0, MIPS_COP_0_STATUS
and t0, MIPS_SR_INT_IE
+#if __mips >= 32
+ teqi t0, 0
+#else
11: beqz t0, 11b
nop
+#endif
#endif /* PARANOIA */
/*
* Save old context, unless the LWP is exiting.
@@ -253,13 +261,13 @@
#endif
REG_EPILOGUE
1:
-#ifdef PARANOIA
+#if defined(PARANOID_SPL)
/*
* Verify interrupt configuration matches IPL_SCHED
*/
jal _C_LABEL(splcheck)
nop
-#endif /* PARANOIA */
+#endif /* PARANOID_SPL */
move s6, a0 # s6 = old lwp
move MIPS_CURLWP, a1 # t8 = new lwp
@@ -294,7 +302,10 @@
move v0, s6 # Save return value (old lwp)
REG_PROLOGUE
REG_L t0, PCB_CONTEXT+SF_REG_SR(s5)
-#ifdef PARANOID_LOOP
+#if defined(PARANOIA) && __mips >= 32
+ and t1, t0, MIPS_SR_INT_IE
+ teqi t1, 0
+#elif defined(PARANOID_LOOP)
and t1, t0, MIPS_SR_INT_IE
2: beqz t1, 2b # status reg should not differ
nop
@@ -318,7 +329,7 @@
REG_L s8, PCB_CONTEXT+SF_REG_S8(a0)
REG_EPILOGUE
mtc0 t0, MIPS_COP_0_STATUS
-#ifdef PARANOIA
+#if defined(PARANOID_SPL)
COP0_SYNC
/*
* Verify interrupt configuration still matches IPL_SCHED
@@ -327,7 +338,7 @@
nop
#else
JR_HB_RA
-#endif /* PARANOIA */
+#endif /* PARANOID_SPL */
END(cpu_switchto)
#ifdef __HAVE_FAST_SOFTINTS
@@ -341,8 +352,12 @@
#ifdef PARANOIA
mfc0 t1, MIPS_COP_0_STATUS
and v0, t1, MIPS_SR_INT_IE
+#if __mips >= 32
+ teqi v0, 0
+#else
1: beqz v0, 1b
nop
+#endif
#endif /* PARANOIA */
PTR_L t0, L_CPU(MIPS_CURLWP)
NOP_L # load delay
@@ -378,7 +393,10 @@
* to.
*/
mfc0 t1, MIPS_COP_0_STATUS
-#ifdef PARANOID_LOOP
+#if defined(PARANOIA) && __mips >= 32
+ and v0, t1, MIPS_SR_INT_IE # assert interrupts are on
+ teqi v0, 0
+#elif defined(PARANOID_LOOP)
and v0, t1, MIPS_SR_INT_IE # assert interrupts are on
1: beqz v0, 1b
nop
@@ -472,8 +490,12 @@
#ifdef PARANOIA
mfc0 v0, MIPS_COP_0_STATUS
and t0, v0, MIPS_SR_INT_IE
+#if __mips >= 32
+ teqi t0, 0
+#else
1: beqz t0, 1b
nop
+#endif
#endif /* PARANOIA */
REG_PROLOGUE
REG_S s0, PCB_CONTEXT+SF_REG_S0(a0)
Home |
Main Index |
Thread Index |
Old Index