summaryrefslogtreecommitdiff
path: root/sys/arch
diff options
context:
space:
mode:
authorMiod Vallat <miod@cvs.openbsd.org>2003-09-04 18:14:47 +0000
committerMiod Vallat <miod@cvs.openbsd.org>2003-09-04 18:14:47 +0000
commit60dd990bce1a4f0ccb85ad7cb0957d7c47a202ef (patch)
treef669dd2c5ae1880d3f395d2d8a74b4b595b7c153 /sys/arch
parenteb9e366225cc54f12a9c27e0d6aabdc051a76f7a (diff)
What I blamed on a specific CMMU fault pecularity turned out to be, in fact,
a nice bug preventing signals to be delivered to process faulting in some conditions...
Diffstat (limited to 'sys/arch')
-rw-r--r--sys/arch/mvme88k/mvme88k/trap.c27
1 files changed, 4 insertions, 23 deletions
diff --git a/sys/arch/mvme88k/mvme88k/trap.c b/sys/arch/mvme88k/mvme88k/trap.c
index 69234940439..96cb8dfe265 100644
--- a/sys/arch/mvme88k/mvme88k/trap.c
+++ b/sys/arch/mvme88k/mvme88k/trap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: trap.c,v 1.47 2003/09/03 20:18:18 miod Exp $ */
+/* $OpenBSD: trap.c,v 1.48 2003/09/04 18:14:46 miod Exp $ */
/*
* Copyright (c) 1998 Steve Murphree, Jr.
* Copyright (c) 1996 Nivas Madhur
@@ -465,7 +465,6 @@ user_fault:
break;
default:
result = uvm_fault(map, va, 0, ftype);
- frame->ipfsr = frame->dpfsr = 0;
break;
}
@@ -496,27 +495,9 @@ user_fault:
*/
frame->sfip = frame->snip & ~FIP_E;
frame->snip = frame->sxip & ~NIP_E;
+ frame->ipfsr = 0;
}
} else {
- /*
- * XXX
- * Page faults for addresses in page zero _SEEM TO BE_
- * special.
- * For some reason, we will keep faulting with the same
- * cause when the interrupts get enabled, later in the
- * exception process, and eventually eat all the
- * interrupt stack in a recursive DAE.
- * Since accesses to this page will always result in a
- * SIGSEGV, we can safely clear the DAE condition here.
- *
- * (behaviour experienced on MVME187C)
- */
- if (va == 0 && type == (T_DATAFLT + T_USER) &&
- SYSTEMMODE(frame->epsr)) {
- frame->dpfsr = 0;
- frame->dmt0 = 0;
- }
-
sig = result == EACCES ? SIGBUS : SIGSEGV;
fault_type = result == EACCES ?
BUS_ADRERR : SEGV_MAPERR;
@@ -666,7 +647,7 @@ user_fault:
/*
* If trap from supervisor mode, just return
*/
- if (SYSTEMMODE(frame->epsr))
+ if (type < T_USER)
return;
if (sig) {
@@ -677,7 +658,7 @@ user_fault:
* deliver signal.
*/
frame->dmt0 = 0;
- frame->dpfsr = 0;
+ frame->ipfsr = frame->dpfsr = 0;
}
userret(p, frame, sticks);