diff options
-rw-r--r-- | sys/ia64/ia64/trap.c | 11 |
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: |