From 5c4309b4749d3984eb64e8d2f16408e5cee9ff4b Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Tue, 21 Apr 2020 17:38:07 +0000 Subject: [PATCH] Handle non-dtrace-triggered kernel breakpoint traps in mips. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If DTRACE is enabled at compile time, all kernel breakpoint traps are first given to dtrace to see if they are triggered by a FBT probe. Previously if dtrace didn't recognize the trap, it was silently ignored breaking the handling of other kernel breakpoint traps such as the debug.kdb.enter sysctl. This only returns early from the trap handler if dtrace recognizes the trap and handles it. Submitted by: Nicolò Mazzucato Reviewed by: markj Obtained from: CheriBSD Differential Revision: https://reviews.freebsd.org/D24478 --- sys/cddl/dev/dtrace/mips/dtrace_subr.c | 3 +++ sys/mips/mips/trap.c | 5 ++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/sys/cddl/dev/dtrace/mips/dtrace_subr.c b/sys/cddl/dev/dtrace/mips/dtrace_subr.c index 56ae129370f..c5ebe778b82 100644 --- a/sys/cddl/dev/dtrace/mips/dtrace_subr.c +++ b/sys/cddl/dev/dtrace/mips/dtrace_subr.c @@ -251,6 +251,9 @@ dtrace_invop_start(struct trapframe *frame) int invop; invop = dtrace_invop(frame->pc, frame, frame->pc); + if (invop == 0) + return (-1); + offs = (invop & LDSD_DATA_MASK); sp = (register_t *)((uint8_t *)frame->sp + offs); diff --git a/sys/mips/mips/trap.c b/sys/mips/mips/trap.c index ebbc46211cc..c565beade2f 100644 --- a/sys/mips/mips/trap.c +++ b/sys/mips/mips/trap.c @@ -807,10 +807,9 @@ trap(struct trapframe *trapframe) #if defined(KDTRACE_HOOKS) || defined(DDB) case T_BREAK: #ifdef KDTRACE_HOOKS - if (!usermode && dtrace_invop_jump_addr != 0) { - dtrace_invop_jump_addr(trapframe); + if (!usermode && dtrace_invop_jump_addr != NULL && + dtrace_invop_jump_addr(trapframe) == 0) return (trapframe->pc); - } #endif #ifdef DDB kdb_trap(type, 0, trapframe);