aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorRuslan Bukin <br@FreeBSD.org>2020-05-26 16:44:05 +0000
committerRuslan Bukin <br@FreeBSD.org>2020-05-26 16:44:05 +0000
commitd75038a0af0726561d1d6bd1729d4e00c803fa22 (patch)
treef84019aa165bac65978674f396a700385b570c01 /sys
parent43843cc28166a02f077a045057938a1728ec8f09 (diff)
downloadsrc-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.c6
-rw-r--r--sys/riscv/riscv/trap.c7
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);