diff options
author | 2020-09-25 17:10:46 +0000 | |
---|---|---|
committer | 2020-09-25 17:10:46 +0000 | |
commit | 8e885a6934697747330f60436577aae07ab4509e (patch) | |
tree | bc27cd25f203fbdf9ed6f4343a81247e4ad000a8 | |
parent | miod notes T_USER needs to be a bit, it was not. (diff) | |
download | wireguard-openbsd-8e885a6934697747330f60436577aae07ab4509e.tar.xz wireguard-openbsd-8e885a6934697747330f60436577aae07ab4509e.zip |
Implement stacktrace_save_at().
-rw-r--r-- | sys/arch/powerpc64/powerpc64/db_trace.c | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/sys/arch/powerpc64/powerpc64/db_trace.c b/sys/arch/powerpc64/powerpc64/db_trace.c index f2b4ef32a6e..6f384ad37c3 100644 --- a/sys/arch/powerpc64/powerpc64/db_trace.c +++ b/sys/arch/powerpc64/powerpc64/db_trace.c @@ -1,4 +1,4 @@ -/* $OpenBSD: db_trace.c,v 1.6 2020/06/24 20:19:14 kettenis Exp $ */ +/* $OpenBSD: db_trace.c,v 1.7 2020/09/25 17:10:46 kettenis Exp $ */ /* $NetBSD: db_trace.c,v 1.15 1996/02/22 23:23:41 gwr Exp $ */ /* @@ -28,7 +28,10 @@ */ #include <sys/param.h> +#include <sys/proc.h> +#include <sys/stacktrace.h> #include <sys/systm.h> +#include <sys/user.h> #include <machine/db_machdep.h> @@ -192,3 +195,38 @@ db_stack_trace_print(db_expr_t addr, int have_addr, db_expr_t count, --count; } } + +extern char _start[], _etext[]; + +void +stacktrace_save_at(struct stacktrace *st, unsigned int skip) +{ + struct callframe *frame, *lastframe, *limit; + struct proc *p = curproc; + + st->st_count = 0; + + if (p == NULL) + return; + + frame = __builtin_frame_address(0); + limit = (struct callframe *)(p->p_addr + USPACE - FRAMELEN); + + while (st->st_count < STACKTRACE_MAX) { + if (skip == 0) + st->st_pc[st->st_count++] = frame->cf_lr; + else + skip--; + + lastframe = frame; + frame = (struct callframe *)frame->cf_sp; + + if (frame <= lastframe) + break; + if (frame >= limit) + break; + if (frame->cf_lr < (vaddr_t)_start || + frame->cf_lr >= (vaddr_t)_etext) + break; + } +} |