Index: sys/arm64/arm64/db_trace.c =================================================================== --- sys/arm64/arm64/db_trace.c +++ sys/arm64/arm64/db_trace.c @@ -129,7 +129,7 @@ if (strcmp(name, "fork_trampoline") == 0) break; - if (!unwind_frame(td, frame)) + if (!unwind_frame(td, frame, false)) break; } } Index: sys/arm64/arm64/stack_machdep.c =================================================================== --- sys/arm64/arm64/stack_machdep.c +++ sys/arm64/arm64/stack_machdep.c @@ -47,7 +47,7 @@ stack_zero(st); while (1) { - if (!unwind_frame(td, frame)) + if (!unwind_frame(td, frame, true)) break; if (!INKERNEL((vm_offset_t)frame->pc)) break; Index: sys/arm64/arm64/unwind.c =================================================================== --- sys/arm64/arm64/unwind.c +++ sys/arm64/arm64/unwind.c @@ -35,14 +35,18 @@ #include bool -unwind_frame(struct thread *td, struct unwind_state *frame) +unwind_frame(struct thread *td, struct unwind_state *frame, bool check_fp) { uintptr_t fp; fp = frame->fp; - if (!kstack_contains(td, fp, sizeof(uintptr_t) * 2)) + if (check_fp) { + if (!kstack_contains(td, fp, sizeof(uintptr_t) * 2)) + return (false); + } else if (!INKERNEL(fp)) { return (false); + } /* FP to previous frame (X29) */ frame->fp = ((uintptr_t *)fp)[0]; Index: sys/arm64/include/csan.h =================================================================== --- sys/arm64/include/csan.h +++ sys/arm64/include/csan.h @@ -83,7 +83,7 @@ nsym = 0; while (1) { - if (!unwind_frame(curthread, &frame)) + if (!unwind_frame(curthread, &frame, true)) break; if (!INKERNEL((vm_offset_t)frame.pc)) break; Index: sys/arm64/include/stack.h =================================================================== --- sys/arm64/include/stack.h +++ sys/arm64/include/stack.h @@ -37,6 +37,6 @@ uintptr_t pc; }; -bool unwind_frame(struct thread *, struct unwind_state *); +bool unwind_frame(struct thread *, struct unwind_state *, bool); #endif /* !_MACHINE_STACK_H_ */ Index: sys/cddl/dev/dtrace/aarch64/dtrace_isa.c =================================================================== --- sys/cddl/dev/dtrace/aarch64/dtrace_isa.c +++ sys/cddl/dev/dtrace/aarch64/dtrace_isa.c @@ -83,7 +83,7 @@ state.pc = (uintptr_t)dtrace_getpcstack; while (depth < pcstack_limit) { - if (!unwind_frame(curthread, &state)) + if (!unwind_frame(curthread, &state, true)) break; if (!INKERNEL(state.pc)) break; @@ -271,7 +271,7 @@ state.pc = (uintptr_t)dtrace_getstackdepth; do { - done = !unwind_frame(curthread, &state); + done = !unwind_frame(curthread, &state, true); if (!INKERNEL(state.pc) || !INKERNEL(state.fp)) break; depth++;