diff options
author | Miod Vallat <miod@cvs.openbsd.org> | 2003-09-04 18:14:47 +0000 |
---|---|---|
committer | Miod Vallat <miod@cvs.openbsd.org> | 2003-09-04 18:14:47 +0000 |
commit | 60dd990bce1a4f0ccb85ad7cb0957d7c47a202ef (patch) | |
tree | f669dd2c5ae1880d3f395d2d8a74b4b595b7c153 /sys/arch | |
parent | eb9e366225cc54f12a9c27e0d6aabdc051a76f7a (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.c | 27 |
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); |