summaryrefslogtreecommitdiff
path: root/sys/arch/m88k
diff options
context:
space:
mode:
authorMiod Vallat <miod@cvs.openbsd.org>2007-11-22 23:30:12 +0000
committerMiod Vallat <miod@cvs.openbsd.org>2007-11-22 23:30:12 +0000
commit98803743fe4599010ed7599ea93efdb5b66de049 (patch)
tree29b59f05d4653073033fdb1d2ea1660cf1adee71 /sys/arch/m88k
parentcc50a872bba6c27bc4be728c57d373773b6ef253 (diff)
Do not reenable interrupts for netsted interrupts if interrupts were
previously disabled on 88110, similar to a recent 88100 fix.
Diffstat (limited to 'sys/arch/m88k')
-rw-r--r--sys/arch/m88k/m88k/eh_common.S14
1 files changed, 8 insertions, 6 deletions
diff --git a/sys/arch/m88k/m88k/eh_common.S b/sys/arch/m88k/m88k/eh_common.S
index 0a081b9d564..d4e87ecc160 100644
--- a/sys/arch/m88k/m88k/eh_common.S
+++ b/sys/arch/m88k/m88k/eh_common.S
@@ -1,4 +1,4 @@
-/* $OpenBSD: eh_common.S,v 1.37 2007/11/22 23:29:27 miod Exp $ */
+/* $OpenBSD: eh_common.S,v 1.38 2007/11/22 23:30:11 miod Exp $ */
/*
* Mach Operating System
* Copyright (c) 1993-1991 Carnegie Mellon University
@@ -2162,8 +2162,8 @@ ASLOCAL(m88110_fpu_enable)
* take care of any data access exceptions......
*/
or r30, r0, r31 /* get a copy of the e.f. pointer */
- ld r2, r31, REG_OFF(EF_EPSR)
- bb1 PSR_SUPERVISOR_MODE_BIT, r2, 1f /* if in kernel mode */
+ ld r6, r31, REG_OFF(EF_EPSR)
+ bb1 PSR_SUPERVISOR_MODE_BIT, r6, 1f /* if in kernel mode */
ldcr r31, CPU
ld r31, r31, CI_CURPCB
@@ -2182,7 +2182,7 @@ ASLOCAL(m88110_fpu_enable)
ld r2, r30, REG_OFF(EF_VECTOR)
bcnd.n eq0, r2, 8f
- ld r14, r30, REG_OFF(EF_RET) /* load return value XXX!!! */
+ ld r14, r30, REG_OFF(EF_RET)
cmp r3, r2, 1 /* is an interrupt? */
bb1.n eq, r3, 8f
cmp r3, r2, 11 /* or NMI? */
@@ -2191,12 +2191,14 @@ ASLOCAL(m88110_fpu_enable)
#ifdef DDB
cmp r3, r2, 130 /* DDB break exception */
bb1.n eq, r3, 8f
-
cmp r3, r2, 132 /* DDB entry exception */
bb1.n eq, r3, 8f
#endif
- /* turn interrupts back on */
+ /* turn interrupts back on unless they were not enabled when the
+ trap occured */
+ bb1 PSR_INTERRUPT_DISABLE_BIT, r6, 8f
+
ldcr r2, PSR
clr r2, r2, 1<PSR_INTERRUPT_DISABLE_BIT>
stcr r2, PSR