aboutsummaryrefslogtreecommitdiff
path: root/sys/amd64
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 /sys/amd64
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
Diffstat (limited to 'sys/amd64')
-rw-r--r--sys/amd64/amd64/trap.c17
1 files changed, 9 insertions, 8 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);
}