aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Evans <bde@FreeBSD.org>1996-12-18 19:12:01 +0000
committerBruce Evans <bde@FreeBSD.org>1996-12-18 19:12:01 +0000
commit959c02787e3ad9cf174312c0843a0ec9425db5dd (patch)
treef73890868dde2e3b877b97c6e6f77e1ba5e3938f
parent115abf209723cbad2db98a070641a67e45a59479 (diff)
downloadsrc-959c02787e3ad9cf174312c0843a0ec9425db5dd.tar.gz
src-959c02787e3ad9cf174312c0843a0ec9425db5dd.zip
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.
Notes
Notes: svn path=/head/; revision=20651
-rw-r--r--sys/amd64/amd64/trap.c17
-rw-r--r--sys/i386/i386/trap.c17
-rw-r--r--sys/kern/subr_trap.c17
3 files changed, 27 insertions, 24 deletions
diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c
index c86e7fd21855..e976df519457 100644
--- a/sys/amd64/amd64/trap.c
+++ b/sys/amd64/amd64/trap.c
@@ -35,7 +35,7 @@
* SUCH DAMAGE.
*
* 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);
MAYBE_DORETI_FAULT(doreti_popl_es,
doreti_popl_es_fault);
- }
- if (curpcb && curpcb->pcb_onfault) {
- frame.tf_eip = (int)curpcb->pcb_onfault;
- return;
+ if (curpcb && curpcb->pcb_onfault) {
+ frame.tf_eip = (int)curpcb->pcb_onfault;
+ return;
+ }
}
break;
@@ -493,7 +493,8 @@ trap_pfault(frame, usermode)
if (p == NULL ||
(!usermode && va < VM_MAXUSER_ADDRESS &&
- (curpcb == NULL || curpcb->pcb_onfault == NULL))) {
+ (intr_nesting_level != 0 || curpcb == NULL ||
+ curpcb->pcb_onfault == NULL))) {
trap_fatal(frame);
return (-1);
}
@@ -550,7 +551,7 @@ trap_pfault(frame, usermode)
return (0);
nogo:
if (!usermode) {
- if (curpcb && curpcb->pcb_onfault) {
+ if (intr_nesting_level == 0 && curpcb && curpcb->pcb_onfault) {
frame->tf_eip = (int)curpcb->pcb_onfault;
return (0);
}
@@ -645,7 +646,7 @@ trap_pfault(frame, usermode)
return (0);
nogo:
if (!usermode) {
- if (curpcb && curpcb->pcb_onfault) {
+ if (intr_nesting_level == 0 && curpcb && curpcb->pcb_onfault) {
frame->tf_eip = (int)curpcb->pcb_onfault;
return (0);
}
diff --git a/sys/i386/i386/trap.c b/sys/i386/i386/trap.c
index c86e7fd21855..e976df519457 100644
--- a/sys/i386/i386/trap.c
+++ b/sys/i386/i386/trap.c
@@ -35,7 +35,7 @@
* SUCH DAMAGE.
*
* 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);
MAYBE_DORETI_FAULT(doreti_popl_es,
doreti_popl_es_fault);
- }
- if (curpcb && curpcb->pcb_onfault) {
- frame.tf_eip = (int)curpcb->pcb_onfault;
- return;
+ if (curpcb && curpcb->pcb_onfault) {
+ frame.tf_eip = (int)curpcb->pcb_onfault;
+ return;
+ }
}
break;
@@ -493,7 +493,8 @@ trap_pfault(frame, usermode)
if (p == NULL ||
(!usermode && va < VM_MAXUSER_ADDRESS &&
- (curpcb == NULL || curpcb->pcb_onfault == NULL))) {
+ (intr_nesting_level != 0 || curpcb == NULL ||
+ curpcb->pcb_onfault == NULL))) {
trap_fatal(frame);
return (-1);
}
@@ -550,7 +551,7 @@ trap_pfault(frame, usermode)
return (0);
nogo:
if (!usermode) {
- if (curpcb && curpcb->pcb_onfault) {
+ if (intr_nesting_level == 0 && curpcb && curpcb->pcb_onfault) {
frame->tf_eip = (int)curpcb->pcb_onfault;
return (0);
}
@@ -645,7 +646,7 @@ trap_pfault(frame, usermode)
return (0);
nogo:
if (!usermode) {
- if (curpcb && curpcb->pcb_onfault) {
+ if (intr_nesting_level == 0 && curpcb && curpcb->pcb_onfault) {
frame->tf_eip = (int)curpcb->pcb_onfault;
return (0);
}
diff --git a/sys/kern/subr_trap.c b/sys/kern/subr_trap.c
index c86e7fd21855..e976df519457 100644
--- a/sys/kern/subr_trap.c
+++ b/sys/kern/subr_trap.c
@@ -35,7 +35,7 @@
* SUCH DAMAGE.
*
* 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);
MAYBE_DORETI_FAULT(doreti_popl_es,
doreti_popl_es_fault);
- }
- if (curpcb && curpcb->pcb_onfault) {
- frame.tf_eip = (int)curpcb->pcb_onfault;
- return;
+ if (curpcb && curpcb->pcb_onfault) {
+ frame.tf_eip = (int)curpcb->pcb_onfault;
+ return;
+ }
}
break;
@@ -493,7 +493,8 @@ trap_pfault(frame, usermode)
if (p == NULL ||
(!usermode && va < VM_MAXUSER_ADDRESS &&
- (curpcb == NULL || curpcb->pcb_onfault == NULL))) {
+ (intr_nesting_level != 0 || curpcb == NULL ||
+ curpcb->pcb_onfault == NULL))) {
trap_fatal(frame);
return (-1);
}
@@ -550,7 +551,7 @@ trap_pfault(frame, usermode)
return (0);
nogo:
if (!usermode) {
- if (curpcb && curpcb->pcb_onfault) {
+ if (intr_nesting_level == 0 && curpcb && curpcb->pcb_onfault) {
frame->tf_eip = (int)curpcb->pcb_onfault;
return (0);
}
@@ -645,7 +646,7 @@ trap_pfault(frame, usermode)
return (0);
nogo:
if (!usermode) {
- if (curpcb && curpcb->pcb_onfault) {
+ if (intr_nesting_level == 0 && curpcb && curpcb->pcb_onfault) {
frame->tf_eip = (int)curpcb->pcb_onfault;
return (0);
}