Only handle copyin/out/etc faults when not in an interrupt handler.

This makes unexpected faults (in an interrupt handler) more likely
to crash properly.  It could be done even better (more robustly and
more efficiently) using lazy fault handling.
This commit is contained in:
Bruce Evans 1996-12-18 19:12:01 +00:00
parent 115abf2097
commit 959c02787e
3 changed files with 27 additions and 24 deletions

View File

@ -35,7 +35,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* from: @(#)trap.c 7.4 (Berkeley) 5/13/91 * from: @(#)trap.c 7.4 (Berkeley) 5/13/91
* $Id: trap.c,v 1.82 1996/09/01 10:10:12 davidg Exp $ * $Id: trap.c,v 1.83 1996/09/10 08:32:01 bde Exp $
*/ */
/* /*
@ -350,10 +350,10 @@ trap(frame)
doreti_popl_ds_fault); doreti_popl_ds_fault);
MAYBE_DORETI_FAULT(doreti_popl_es, MAYBE_DORETI_FAULT(doreti_popl_es,
doreti_popl_es_fault); doreti_popl_es_fault);
} if (curpcb && curpcb->pcb_onfault) {
if (curpcb && curpcb->pcb_onfault) { frame.tf_eip = (int)curpcb->pcb_onfault;
frame.tf_eip = (int)curpcb->pcb_onfault; return;
return; }
} }
break; break;
@ -493,7 +493,8 @@ trap_pfault(frame, usermode)
if (p == NULL || if (p == NULL ||
(!usermode && va < VM_MAXUSER_ADDRESS && (!usermode && va < VM_MAXUSER_ADDRESS &&
(curpcb == NULL || curpcb->pcb_onfault == NULL))) { (intr_nesting_level != 0 || curpcb == NULL ||
curpcb->pcb_onfault == NULL))) {
trap_fatal(frame); trap_fatal(frame);
return (-1); return (-1);
} }
@ -550,7 +551,7 @@ trap_pfault(frame, usermode)
return (0); return (0);
nogo: nogo:
if (!usermode) { if (!usermode) {
if (curpcb && curpcb->pcb_onfault) { if (intr_nesting_level == 0 && curpcb && curpcb->pcb_onfault) {
frame->tf_eip = (int)curpcb->pcb_onfault; frame->tf_eip = (int)curpcb->pcb_onfault;
return (0); return (0);
} }
@ -645,7 +646,7 @@ trap_pfault(frame, usermode)
return (0); return (0);
nogo: nogo:
if (!usermode) { if (!usermode) {
if (curpcb && curpcb->pcb_onfault) { if (intr_nesting_level == 0 && curpcb && curpcb->pcb_onfault) {
frame->tf_eip = (int)curpcb->pcb_onfault; frame->tf_eip = (int)curpcb->pcb_onfault;
return (0); return (0);
} }

View File

@ -35,7 +35,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* from: @(#)trap.c 7.4 (Berkeley) 5/13/91 * from: @(#)trap.c 7.4 (Berkeley) 5/13/91
* $Id: trap.c,v 1.82 1996/09/01 10:10:12 davidg Exp $ * $Id: trap.c,v 1.83 1996/09/10 08:32:01 bde Exp $
*/ */
/* /*
@ -350,10 +350,10 @@ trap(frame)
doreti_popl_ds_fault); doreti_popl_ds_fault);
MAYBE_DORETI_FAULT(doreti_popl_es, MAYBE_DORETI_FAULT(doreti_popl_es,
doreti_popl_es_fault); doreti_popl_es_fault);
} if (curpcb && curpcb->pcb_onfault) {
if (curpcb && curpcb->pcb_onfault) { frame.tf_eip = (int)curpcb->pcb_onfault;
frame.tf_eip = (int)curpcb->pcb_onfault; return;
return; }
} }
break; break;
@ -493,7 +493,8 @@ trap_pfault(frame, usermode)
if (p == NULL || if (p == NULL ||
(!usermode && va < VM_MAXUSER_ADDRESS && (!usermode && va < VM_MAXUSER_ADDRESS &&
(curpcb == NULL || curpcb->pcb_onfault == NULL))) { (intr_nesting_level != 0 || curpcb == NULL ||
curpcb->pcb_onfault == NULL))) {
trap_fatal(frame); trap_fatal(frame);
return (-1); return (-1);
} }
@ -550,7 +551,7 @@ trap_pfault(frame, usermode)
return (0); return (0);
nogo: nogo:
if (!usermode) { if (!usermode) {
if (curpcb && curpcb->pcb_onfault) { if (intr_nesting_level == 0 && curpcb && curpcb->pcb_onfault) {
frame->tf_eip = (int)curpcb->pcb_onfault; frame->tf_eip = (int)curpcb->pcb_onfault;
return (0); return (0);
} }
@ -645,7 +646,7 @@ trap_pfault(frame, usermode)
return (0); return (0);
nogo: nogo:
if (!usermode) { if (!usermode) {
if (curpcb && curpcb->pcb_onfault) { if (intr_nesting_level == 0 && curpcb && curpcb->pcb_onfault) {
frame->tf_eip = (int)curpcb->pcb_onfault; frame->tf_eip = (int)curpcb->pcb_onfault;
return (0); return (0);
} }

View File

@ -35,7 +35,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* from: @(#)trap.c 7.4 (Berkeley) 5/13/91 * from: @(#)trap.c 7.4 (Berkeley) 5/13/91
* $Id: trap.c,v 1.82 1996/09/01 10:10:12 davidg Exp $ * $Id: trap.c,v 1.83 1996/09/10 08:32:01 bde Exp $
*/ */
/* /*
@ -350,10 +350,10 @@ trap(frame)
doreti_popl_ds_fault); doreti_popl_ds_fault);
MAYBE_DORETI_FAULT(doreti_popl_es, MAYBE_DORETI_FAULT(doreti_popl_es,
doreti_popl_es_fault); doreti_popl_es_fault);
} if (curpcb && curpcb->pcb_onfault) {
if (curpcb && curpcb->pcb_onfault) { frame.tf_eip = (int)curpcb->pcb_onfault;
frame.tf_eip = (int)curpcb->pcb_onfault; return;
return; }
} }
break; break;
@ -493,7 +493,8 @@ trap_pfault(frame, usermode)
if (p == NULL || if (p == NULL ||
(!usermode && va < VM_MAXUSER_ADDRESS && (!usermode && va < VM_MAXUSER_ADDRESS &&
(curpcb == NULL || curpcb->pcb_onfault == NULL))) { (intr_nesting_level != 0 || curpcb == NULL ||
curpcb->pcb_onfault == NULL))) {
trap_fatal(frame); trap_fatal(frame);
return (-1); return (-1);
} }
@ -550,7 +551,7 @@ trap_pfault(frame, usermode)
return (0); return (0);
nogo: nogo:
if (!usermode) { if (!usermode) {
if (curpcb && curpcb->pcb_onfault) { if (intr_nesting_level == 0 && curpcb && curpcb->pcb_onfault) {
frame->tf_eip = (int)curpcb->pcb_onfault; frame->tf_eip = (int)curpcb->pcb_onfault;
return (0); return (0);
} }
@ -645,7 +646,7 @@ trap_pfault(frame, usermode)
return (0); return (0);
nogo: nogo:
if (!usermode) { if (!usermode) {
if (curpcb && curpcb->pcb_onfault) { if (intr_nesting_level == 0 && curpcb && curpcb->pcb_onfault) {
frame->tf_eip = (int)curpcb->pcb_onfault; frame->tf_eip = (int)curpcb->pcb_onfault;
return (0); return (0);
} }