summaryrefslogtreecommitdiff
path: root/sys/arch
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arch')
-rw-r--r--sys/arch/mvme88k/mvme88k/eh.S74
1 files changed, 28 insertions, 46 deletions
diff --git a/sys/arch/mvme88k/mvme88k/eh.S b/sys/arch/mvme88k/mvme88k/eh.S
index 3b30c0d089a..0dfd217cce5 100644
--- a/sys/arch/mvme88k/mvme88k/eh.S
+++ b/sys/arch/mvme88k/mvme88k/eh.S
@@ -1,4 +1,4 @@
-/* $OpenBSD: eh.S,v 1.55 2004/06/23 00:31:19 miod Exp $ */
+/* $OpenBSD: eh.S,v 1.56 2004/06/23 08:12:33 miod Exp $ */
/*
* Mach Operating System
* Copyright (c) 1993-1991 Carnegie Mellon University
@@ -225,6 +225,7 @@
#define EF_SR3 (EF_R0 + 5)
#define EF_FLAGS EF_MODE
+#ifdef DEBUG
data
align 4
ASLOCAL(sbadcpupanic)
@@ -232,14 +233,15 @@ ASLOCAL(sbadcpupanic)
text
align 8
-
ASLOCAL(Lbadcpupanic)
subu r31, r31, 32
or.u r2, r0, hi16(_ASM_LABEL(sbadcpupanic))
bsr.n _C_LABEL(panic)
or r2, r2, lo16(_ASM_LABEL(sbadcpupanic))
addu r31, r31, 32
+#endif
+ text
align 8
#ifdef M88110
@@ -752,12 +754,14 @@ GLOBAL(reset_handler)
or r30, r31, r0
subu r31, r31, 0x10 /* make some breathing space */
- st r30, r31, 0x0c /* store frame pointer on the st */
+ st r30, r31, 0x0c /* store frame pointer on the stack */
+#ifdef DDB
st r30, r31, 0x08 /* store again for the debugger to recognize */
or.u r20, r0, hi16(0x87654321)
or r20, r20, lo16(0x87654321)
st r20, r31, 0x04
st r20, r31, 0x00
+#endif
CALL(_C_LABEL(error_fatal), r30, r30)
@@ -997,7 +1001,7 @@ ASLOCAL(m88100_setup_phase_one)
*/
subu r31, r31, SIZEOF_EF /* r31 now our E.F. */
st FLAGS,r31, REG_OFF(EF_FLAGS) /* save flags */
- st r1, r31, GENREG_OFF(1) /* save prev. r1 (now r1 free)*/
+ st r1, r31, GENREG_OFF(1) /* save prev. r1 (now free)*/
ldcr r1, SR3 /* save previous SR3 */
st r1, r31, REG_OFF(EF_SR3)
@@ -1136,10 +1140,14 @@ ASLOCAL(m88100_have_pcb)
bb1 eq, TMP2, 2f
cmp TMP2, TMP, 0x2 /* CPU2 ? */
bb1 eq, TMP2, 3f
+#ifdef DEBUG
cmp TMP2, TMP, 0x3 /* CPU3 ? */
bb1 eq, TMP2, 4f
/* Arrrrg! bad cpu# */
br _ASM_LABEL(Lbadcpupanic)
+#else
+ br 4f
+#endif
/* XXX WHAT ABOUT MODULES WITH SPLIT U/S CMMUS ??? */
1:
/* must be CPU0 */
@@ -1643,7 +1651,7 @@ ASLOCAL(m88100_fpu_enable)
st r30, r31, 0 /* store frame pointer on the stack */
#ifdef DDB
st r30, r31, 4 /* store it for the debugger to recognize */
-#endif /* DDB */
+#endif
ld r2, r30, REG_OFF(EF_VECTOR)
bcnd.n eq0, r2, 8f /* error exception */
@@ -1772,39 +1780,18 @@ ASLOCAL(m88100_return_code)
1:
CALL(_C_LABEL(m88100_trap), T_DATAFLT, r30)
+#ifdef M88110
br _ASM_LABEL(check_ast)
+#else
+ /* FALLTHROUGH */
+#endif
#endif /* M88100 */
#ifdef M88110
ASLOCAL(m88110_return_code)
#define FPTR r14
ld FPTR, r31, 0 /* grab exception frame pointer */
-
-#if 0
- /*
- * If it's the interrupt exception, enable interrupt.
- */
-
- /*
- * Is it ever possible to have interrupt exception while EPSR has
- * it disabled? I don't think so.. XXX nivas
- *
- * On mc88110, you can. The NMI interrupt. aka ABORT. XXX smurph
- */
- ld r2, FPTR, REG_OFF(EF_VECTOR)
- cmp r2, r2, 1 /* Is it an interrupt? */
- bb1.n ne, r2, 1f /* If not, skip */
-
- /* ...unless they were already disabled */
- ld r2, FPTR, REG_OFF(EF_EPSR)
- bb1.n PSR_INTERRUPT_DISABLE_BIT, r2, 1f
-
- ldcr r2, PSR
- clr r2, r2, 1<PSR_INTERRUPT_DISABLE_BIT> /* enable interrupts */
- stcr r2, PSR
- FLUSH_PIPELINE
-1:
-#endif
+ /* FALLTHROUGH */
#endif /* M88110 */
/*
@@ -1921,7 +1908,6 @@ ASLOCAL(no_ast)
cmp r1, r30, CPU_88110
bb1 ne, r1, 1f
#endif
- /* mc88110 needs the EXIP */
ld r30, r31, REG_OFF(EF_ENIP)
ld r1, r31, REG_OFF(EF_EXIP)
stcr r30, ENIP
@@ -1932,27 +1918,19 @@ ASLOCAL(no_ast)
#endif
#endif
#ifdef M88100
- st r0, r31, REG_OFF(EF_IPFSR)
- st r0, r31, REG_OFF(EF_DPFSR)
-
/*
- * Note: no need to restore the SXIP.
- * When the "rte" causes execution to continue
- * first with the instruction pointed to by the NIP
- * and then the FIP.
- *
- * See MC88100 Risc Processor User's Manual, 2nd Edition,
- * section 6.4.3.1.2-4
+ * RTE will cause execution to continue first with the
+ * instruction pointed to by the NIP and then the FIP;
+ * it is not necessary to restore XIP.
*/
+ stcr r0, SSBR
ld r30, r31, REG_OFF(EF_SNIP)
ld r1, r31, REG_OFF(EF_SFIP)
- stcr r0, SSBR
stcr r30, SNIP
stcr r1, SFIP
2:
#endif
ld r30, r31, REG_OFF(EF_EPSR)
- ld r1, r31, REG_OFF(EF_MODE)
stcr r30, EPSR
/* Now restore r1, r30, and r31 */
@@ -2275,12 +2253,14 @@ GLOBAL(m88110_reset_handler)
or r30, r31, r0
subu r31, r31, 0x10 /* make some breathing space */
- st r30, r31, 0x0c /* store frame pointer on the st */
+ st r30, r31, 0x0c /* store frame pointer on the stack */
+#ifdef DDB
st r30, r31, 0x08 /* store again for the debugger to recognize */
or.u r20, r0, hi16(0x87654321)
or r20, r20, lo16(0x87654321)
st r20, r31, 0x04
st r20, r31, 0x00
+#endif
CALL(_C_LABEL(error_fatal), r30, r30)
@@ -2670,13 +2650,15 @@ ASLOCAL(m88110_fpu_enable)
st r30, r31, 0 /* store frame pointer on the stack */
#ifdef DDB
st r30, r31, 4 /* store it again for the debugger */
-#endif /* DDB */
+#endif
ld r2, r30, REG_OFF(EF_VECTOR)
bcnd.n eq0, r2, 8f
ld r14, r30, REG_OFF(EF_RET) /* load return value XXX!!! */
cmp r3, r2, 1 /* is an interrupt? */
bb1.n eq, r3, 8f
+ cmp r3, r2, 11 /* or NMI? */
+ bb1.n eq, r3, 8f
#ifdef DDB
cmp r3, r2, 130 /* DDB break exception */