summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkettenis <kettenis@openbsd.org>2020-09-25 17:10:46 +0000
committerkettenis <kettenis@openbsd.org>2020-09-25 17:10:46 +0000
commit8e885a6934697747330f60436577aae07ab4509e (patch)
treebc27cd25f203fbdf9ed6f4343a81247e4ad000a8
parentmiod notes T_USER needs to be a bit, it was not. (diff)
downloadwireguard-openbsd-8e885a6934697747330f60436577aae07ab4509e.tar.xz
wireguard-openbsd-8e885a6934697747330f60436577aae07ab4509e.zip
Implement stacktrace_save_at().
-rw-r--r--sys/arch/powerpc64/powerpc64/db_trace.c40
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;
+ }
+}