diff options
author | Ruslan Bukin <br@FreeBSD.org> | 2020-05-26 16:44:05 +0000 |
---|---|---|
committer | Ruslan Bukin <br@FreeBSD.org> | 2020-05-26 16:44:05 +0000 |
commit | d75038a0af0726561d1d6bd1729d4e00c803fa22 (patch) | |
tree | f84019aa165bac65978674f396a700385b570c01 /sys | |
parent | 43843cc28166a02f077a045057938a1728ec8f09 (diff) | |
download | src-d75038a0af0726561d1d6bd1729d4e00c803fa22.tar.gz src-d75038a0af0726561d1d6bd1729d4e00c803fa22.zip |
Fix entering KDB with dtrace-enabled kernel.
Reviewed by: markj, jhb
Differential Revision: https://reviews.freebsd.org/D24018
Notes
Notes:
svn path=/head/; revision=361533
Diffstat (limited to 'sys')
-rw-r--r-- | sys/cddl/dev/dtrace/riscv/dtrace_subr.c | 6 | ||||
-rw-r--r-- | sys/riscv/riscv/trap.c | 7 |
2 files changed, 9 insertions, 4 deletions
diff --git a/sys/cddl/dev/dtrace/riscv/dtrace_subr.c b/sys/cddl/dev/dtrace/riscv/dtrace_subr.c index 68d98db30c83..ccc6b77090ab 100644 --- a/sys/cddl/dev/dtrace/riscv/dtrace_subr.c +++ b/sys/cddl/dev/dtrace/riscv/dtrace_subr.c @@ -255,6 +255,8 @@ dtrace_invop_start(struct trapframe *frame) 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 @@ dtrace_invop_start(struct trapframe *frame) return (0); } +#ifdef INVARIANTS + panic("Instruction %x doesn't match any opcode.", invop); +#endif + return (-1); } diff --git a/sys/riscv/riscv/trap.c b/sys/riscv/riscv/trap.c index e1d8bb76e2df..9448043224fe 100644 --- a/sys/riscv/riscv/trap.c +++ b/sys/riscv/riscv/trap.c @@ -274,10 +274,9 @@ do_trap_supervisor(struct trapframe *frame) break; case EXCP_BREAKPOINT: #ifdef KDTRACE_HOOKS - if (dtrace_invop_jump_addr != 0) { - dtrace_invop_jump_addr(frame); - break; - } + if (dtrace_invop_jump_addr != NULL && + dtrace_invop_jump_addr(frame) == 0) + break; #endif #ifdef KDB kdb_trap(exception, 0, frame); |