diff --git a/sys/arm64/arm64/trap.c b/sys/arm64/arm64/trap.c --- a/sys/arm64/arm64/trap.c +++ b/sys/arm64/arm64/trap.c @@ -228,6 +228,8 @@ external_abort(struct thread *td, struct trapframe *frame, uint64_t esr, uint64_t far, int lower) { + struct pcb *pcb; + if (lower) { call_trapsignal(td, SIGBUS, BUS_OBJERR, (void *)far, ESR_ELx_EXCEPTION(frame->tf_esr)); @@ -235,6 +237,15 @@ return; } + /* If there is a fault handler use it */ + if (td->td_intr_nesting_level == 0) { + pcb = td->td_pcb; + if (pcb->pcb_onfault != 0) { + frame->tf_elr = pcb->pcb_onfault; + return; + } + } + /* * Try to handle synchronous external aborts caused by * bus_space_peek() and/or bus_space_poke() functions.