Handle non-dtrace-triggered kernel breakpoint traps in mips.
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 <nicomazz97@gmail.com> Reviewed by: markj Obtained from: CheriBSD Differential Revision: https://reviews.freebsd.org/D24478
This commit is contained in:
parent
0c0119856b
commit
5c4309b474
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user