Index: sys/cddl/dev/dtrace/riscv/dtrace_subr.c =================================================================== --- sys/cddl/dev/dtrace/riscv/dtrace_subr.c +++ sys/cddl/dev/dtrace/riscv/dtrace_subr.c @@ -255,6 +255,8 @@ int invop; invop = dtrace_invop(frame->tf_sepc, frame, frame->tf_sepc); + if (invop == 0) + return (-1); if (match_opcode(invop, (MATCH_SD | RS2_RA | RS1_SP), (MASK_SD | RS2_MASK | RS1_MASK))) { @@ -292,6 +294,10 @@ return (0); } +#ifdef INVARIANTS + panic("Instruction %x don't match any opcode.", invop); +#endif + return (-1); } Index: sys/riscv/riscv/trap.c =================================================================== --- sys/riscv/riscv/trap.c +++ sys/riscv/riscv/trap.c @@ -275,10 +275,9 @@ break; case EXCP_BREAKPOINT: #ifdef KDTRACE_HOOKS - if (dtrace_invop_jump_addr != 0) { - dtrace_invop_jump_addr(frame); - break; - } + if (dtrace_invop_jump_addr != 0 && + dtrace_invop_jump_addr(frame) == 0) + break; #endif #ifdef KDB kdb_trap(exception, 0, frame);