summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiod Vallat <miod@cvs.openbsd.org>2003-09-28 22:13:46 +0000
committerMiod Vallat <miod@cvs.openbsd.org>2003-09-28 22:13:46 +0000
commit71b6b72592a47df0b36c753bb3aaa6ecf29d2cd6 (patch)
tree8552d5b8a1adb8020f908236768d4abd9bb5d027
parent616f27119d4f8697ab9751845a304fbd9f840c2d (diff)
Clean the MVME188 external interrupts routine, and do not let it loop forever
on clock interrupts, because interrupts were re-enabled too early. Also, remove the old hack restricting the system to only use 32MB of memory. This makes MVME188 boot multi-user again (only tested on 2P256 so far).
-rw-r--r--sys/arch/mvme88k/mvme88k/machdep.c43
1 files changed, 20 insertions, 23 deletions
diff --git a/sys/arch/mvme88k/mvme88k/machdep.c b/sys/arch/mvme88k/mvme88k/machdep.c
index d9ac14718d4..b2ecb0047c3 100644
--- a/sys/arch/mvme88k/mvme88k/machdep.c
+++ b/sys/arch/mvme88k/mvme88k/machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: machdep.c,v 1.113 2003/09/20 13:57:37 miod Exp $ */
+/* $OpenBSD: machdep.c,v 1.114 2003/09/28 22:13:45 miod Exp $ */
/*
* Copyright (c) 1998, 1999, 2000, 2001 Steve Murphree, Jr.
* Copyright (c) 1996 Nivas Madhur
@@ -374,10 +374,6 @@ size_memory()
break;
*look = save;
}
- if ((look > (unsigned int *)0x01FFF000) && (brdtyp == BRD_188)) {
- /* temp hack to fake 32Meg on MVME188 */
- look = (unsigned int *)0x01FFF000;
- }
return (trunc_page((unsigned)look));
}
@@ -1592,10 +1588,10 @@ unsigned obio_vec[32] = {
void
m188_ext_int(u_int v, struct m88100_saved_state *eframe)
{
- register int cpu = cpu_number();
- register unsigned int cur_mask;
- register unsigned int level, old_spl;
- register struct intrhand *intr;
+ int cpu = cpu_number();
+ unsigned int cur_mask;
+ unsigned int level, old_spl;
+ struct intrhand *intr;
int ret, intbit;
unsigned vec;
@@ -1609,7 +1605,7 @@ m188_ext_int(u_int v, struct m88100_saved_state *eframe)
* DUART interrupts.
*/
flush_pipeline();
- return;
+ goto out;
}
uvmexp.intrs++;
@@ -1640,13 +1636,23 @@ m188_ext_int(u_int v, struct m88100_saved_state *eframe)
for(;;) ;
}
+#ifdef DEBUG
if (level > 7 || (char)level < 0) {
panic("int level (%x) is not between 0 and 7", level);
}
+#endif
setipl(level);
- enable_interrupt();
+ /*
+ * Do not enable interrupts yet if we know, from cur_mask,
+ * that we have not cleared enough conditions yet.
+ * For now, only the timer interrupt requires its condition
+ * to be cleared before interrupts are enabled.
+ */
+ if ((cur_mask & DTI_BIT) == 0) {
+ enable_interrupt();
+ }
/* generate IACK and get the vector */
@@ -1659,11 +1665,6 @@ m188_ext_int(u_int v, struct m88100_saved_state *eframe)
/* find the first bit set in the current mask */
intbit = ff1(cur_mask);
if (OBIO_INTERRUPT_MASK & (1 << intbit)) {
- if (guarded_access(ivec[level], 4, (u_char *)&vec) ==
- EFAULT) {
- panic("unable to get vector for this vmebus "
- "interrupt (level %x)", level);
- }
vec = obio_vec[intbit];
if (vec == 0) {
panic("unknown onboard interrupt: mask = 0x%b",
@@ -1683,7 +1684,8 @@ m188_ext_int(u_int v, struct m88100_saved_state *eframe)
}
vec &= VME_VECTOR_MASK;
if (vec & VME_BERR_MASK) {
- panic("vme vec timeout");
+ printf("vme vec timeout");
+ break;
}
if (vec == 0) {
panic("unknown vme interrupt: mask = 0x%b",
@@ -1694,11 +1696,6 @@ m188_ext_int(u_int v, struct m88100_saved_state *eframe)
"mask = 0x%b",
level, intbit, 1 << intbit, IST_STRING);
}
- if (vec > 0xFF) {
- panic("interrupt vector 0x%x greater than 255!"
- "level = %d iack = 0x%x",
- vec, level, ivec[level]);
- }
if ((intr = intr_handlers[vec]) == NULL) {
/* increment intr counter */
@@ -1738,6 +1735,7 @@ m188_ext_int(u_int v, struct m88100_saved_state *eframe)
* returning to assembler
*/
disable_interrupt();
+out:
if (eframe->dmt0 & DMT_VALID)
m88100_trap(T_DATAFLT, eframe);
@@ -1746,7 +1744,6 @@ m188_ext_int(u_int v, struct m88100_saved_state *eframe)
* was taken.
*/
setipl(eframe->mask);
- flush_pipeline();
}
#endif /* MVME188 */