summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/ia64/ia64/trap.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/sys/ia64/ia64/trap.c b/sys/ia64/ia64/trap.c
index 96df125..e8622aa 100644
--- a/sys/ia64/ia64/trap.c
+++ b/sys/ia64/ia64/trap.c
@@ -648,8 +648,17 @@ trap(int vector, struct trapframe *framep)
if (sig == 0)
goto out;
ucode = framep->tf_special.ifa; /* VA */
- } else
+ } else {
+ /* Check for copyin/copyout fault. */
+ if (td != NULL && td->td_pcb->pcb_onfault != 0) {
+ framep->tf_special.iip =
+ td->td_pcb->pcb_onfault;
+ framep->tf_special.psr &= ~IA64_PSR_RI;
+ td->td_pcb->pcb_onfault = 0;
+ goto out;
+ }
trap_panic(vector, framep);
+ }
break;
case IA64_VEC_FLOATING_POINT_FAULT:
OpenPOWER on IntegriCloud