diff options
author | Bruce Evans <bde@FreeBSD.org> | 1996-12-18 19:12:01 +0000 |
---|---|---|
committer | Bruce Evans <bde@FreeBSD.org> | 1996-12-18 19:12:01 +0000 |
commit | 959c02787e3ad9cf174312c0843a0ec9425db5dd (patch) | |
tree | f73890868dde2e3b877b97c6e6f77e1ba5e3938f /sys/amd64 | |
parent | 115abf209723cbad2db98a070641a67e45a59479 (diff) | |
download | src-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.c | 17 |
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); } |