Index: sys/arm/arm/trap-v6.c =================================================================== --- sys/arm/arm/trap-v6.c +++ sys/arm/arm/trap-v6.c @@ -308,8 +308,20 @@ CTR6(KTR_TRAP, "%s: fsr %#x (idx %u) far %#x prefetch %u usermode %d", __func__, fsr, idx, far, prefetch, usermode); +#ifdef KDTRACE_HOOKS + /* + * Firstly, ensure that we ignore any DTrace-induced faults. + */ + if (!usermode) { + /* Invoke the DTrace hander, if set. */ + if (__predict_true(dtrace_trap_func != NULL)) + if ((*dtrace_trap_func)(tf, fsr) == 1) + goto out; + } +#endif + /* - * Firstly, handle aborts that are not directly related to mapping. + * Handle aborts that are not directly related to mapping. */ if (__predict_false(idx == FAULT_EA_IMPREC)) { abort_imprecise(tf, fsr, prefetch, usermode); @@ -540,13 +552,6 @@ const char *rw_mode; usermode = TRAPF_USERMODE(tf); -#ifdef KDTRACE_HOOKS - if (!usermode) { - if (dtrace_trap_func != NULL && (*dtrace_trap_func)(tf, far)) - return (0); - } -#endif - mode = usermode ? "user" : "kernel"; rw_mode = fsr & FSR_WNR ? "write" : "read"; disable_interrupts(PSR_I|PSR_F); Index: sys/cddl/dev/dtrace/arm/dtrace_subr.c =================================================================== --- sys/cddl/dev/dtrace/arm/dtrace_subr.c +++ sys/cddl/dev/dtrace/arm/dtrace_subr.c @@ -201,6 +201,12 @@ switch (type) { /* Page fault. */ case FAULT_ALIGN: + /* FALLTHROUGH */ + /* Translation Fault (L1) */ + case FAULT_TRAN_L1: + /* FALLTHROUGH */ + /* Translation Fault (L2) */ + case FAULT_TRAN_L2: /* Flag a bad address. */ cpu_core[curcpu].cpuc_dtrace_flags |= CPU_DTRACE_BADADDR; cpu_core[curcpu].cpuc_dtrace_illval = 0;