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:
parent
115abf2097
commit
959c02787e
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user