Module Name: src
Committed By: macallan
Date: Fri Nov 18 13:50:36 UTC 2016
Modified Files:
src/sys/arch/mips/mips: spl.S
Log Message:
don't blindly zero STATUS in order to disable interrupts, instead take care
to preserve bits like KX in case we catch an interrupt between mtc0 and the
write actually taking effect
now n32 kernels on my O2 are (mostly) stable again
ok skrll@
To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/mips/mips/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/mips/spl.S
diff -u src/sys/arch/mips/mips/spl.S:1.14 src/sys/arch/mips/mips/spl.S:1.15
--- src/sys/arch/mips/mips/spl.S:1.14 Fri Nov 11 16:49:30 2016
+++ src/sys/arch/mips/mips/spl.S Fri Nov 18 13:50:36 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: spl.S,v 1.14 2016/11/11 16:49:30 maya Exp $ */
+/* $NetBSD: spl.S,v 1.15 2016/11/18 13:50:36 macallan Exp $ */
/*-
* Copyright (c) 2009, 2010 The NetBSD Foundation, Inc.
@@ -38,7 +38,7 @@
#include <mips/asm.h>
#include <mips/cpuregs.h>
-RCSID("$NetBSD: spl.S,v 1.14 2016/11/11 16:49:30 maya Exp $")
+RCSID("$NetBSD: spl.S,v 1.15 2016/11/18 13:50:36 macallan Exp $")
#include "assym.h"
@@ -80,8 +80,9 @@ _splraise:
or v1, MIPS_INT_MASK # enable all interrupts
xor a0, v1 # disable ipl's masked bits
DYNAMIC_STATUS_MASK(a0,v0) # machine dependent masking
-#if !defined(__mips_o32) && defined(MULTIPROCESSOR)
- li v1, MIPS3_SR_KX # keep 64-bit addressing on
+#if !defined(__mips_o32)
+ or v1, MIPS_SR_INT_IE #
+ xor v1, MIPS_SR_INT_IE # clear interrupt enable bit
mtc0 v1, MIPS_COP_0_STATUS ## disable interrupts
#else
mtc0 zero, MIPS_COP_0_STATUS ## disable interrupts
@@ -136,7 +137,13 @@ STATIC_XLEAF(_splsw_splx_noprof) # does
xor a1, MIPS_INT_MASK # invert SR bits
or v1, a1 # set any bits for this IPL
DYNAMIC_STATUS_MASK(v1,t0) # machine dependent masking
+#if !defined(__mips_o32)
+ or v0, v1, MIPS_SR_INT_IE #
+ xor v0, MIPS_SR_INT_IE # clear interrupt enable bit
+ mtc0 v0, MIPS_COP_0_STATUS ## disable interrupts
+#else
mtc0 zero, MIPS_COP_0_STATUS ## disable interrupts
+#endif
COP0_SYNC
INT_S a0, CPU_INFO_CPL(a3) ## save IPL in cpu_info (KSEG0)
mtc0 v1, MIPS_COP_0_STATUS ## store back
@@ -170,7 +177,13 @@ STATIC_LEAF(_splsw_spl0)
MFC0_HAZARD # load delay
or v0, a0, v1
DYNAMIC_STATUS_MASK(v0,t0) # machine dependent masking
+#if !defined(__mips_o32)
+ or v1, v0, MIPS_SR_INT_IE #
+ xor v1, MIPS_SR_INT_IE # clear interrupt enable bit
+ mtc0 v1, MIPS_COP_0_STATUS ## disable interrupts
+#else
mtc0 zero, MIPS_COP_0_STATUS ## disable interrupts
+#endif
COP0_SYNC
#if IPL_NONE == 0
INT_S zero, CPU_INFO_CPL(a3) ## set ipl to 0
@@ -183,7 +196,13 @@ END(_splsw_spl0)
STATIC_LEAF(_splsw_setsoftintr)
mfc0 v1, MIPS_COP_0_STATUS # save status register
- mtc0 zero, MIPS_COP_0_STATUS # disable interrupts (2 cycles)
+#if !defined(__mips_o32)
+ or v0, v1, MIPS_SR_INT_IE #
+ xor v0, MIPS_SR_INT_IE # clear interrupt enable bit
+ mtc0 v0, MIPS_COP_0_STATUS ## disable interrupts
+#else
+ mtc0 zero, MIPS_COP_0_STATUS ## disable interrupts
+#endif
COP0_SYNC
mfc0 v0, MIPS_COP_0_CAUSE # fetch cause register
MFC0_HAZARD # load delay
@@ -196,7 +215,13 @@ 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)
+#if !defined(__mips_o32)
+ or v0, v1, MIPS_SR_INT_IE #
+ xor v0, MIPS_SR_INT_IE # clear interrupt enable bit
+ mtc0 v0, MIPS_COP_0_STATUS ## disable interrupts
+#else
+ mtc0 zero, MIPS_COP_0_STATUS ## disable interrupts
+#endif
COP0_SYNC
mfc0 v0, MIPS_COP_0_CAUSE # fetch cause register
nor a0, zero, a0 # bitwise inverse of A0