summaryrefslogtreecommitdiffstats
path: root/sys/sparc64
diff options
context:
space:
mode:
authorjeff <jeff@FreeBSD.org>2005-08-03 04:27:40 +0000
committerjeff <jeff@FreeBSD.org>2005-08-03 04:27:40 +0000
commit4a761caec7754f1fc2754466099320c54bf45abb (patch)
tree52986abea99ce3e4955fd106535de6f4e591bac2 /sys/sparc64
parent24f85b0b69c29af04dc033d110270b9a40a1bcaa (diff)
downloadFreeBSD-src-4a761caec7754f1fc2754466099320c54bf45abb.zip
FreeBSD-src-4a761caec7754f1fc2754466099320c54bf45abb.tar.gz
- Add support for saving stack traces and displaying them via printf(9)
and KTR. Contributed by: Antoine Brodin <antoine.brodin@laposte.net> Concept code from: Neal Fachan <neal@isilon.com>
Diffstat (limited to 'sys/sparc64')
-rw-r--r--sys/sparc64/sparc64/db_trace.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/sys/sparc64/sparc64/db_trace.c b/sys/sparc64/sparc64/db_trace.c
index dc6e4bb..66cc76b 100644
--- a/sys/sparc64/sparc64/db_trace.c
+++ b/sys/sparc64/sparc64/db_trace.c
@@ -31,6 +31,7 @@
#include <sys/kdb.h>
#include <sys/linker_set.h>
#include <sys/proc.h>
+#include <sys/stack.h>
#include <sys/sysent.h>
#include <vm/vm.h>
@@ -291,3 +292,23 @@ db_trace_thread(struct thread *td, int count)
ctx = kdb_thr_ctx(td);
return (db_backtrace(td, (struct frame*)(ctx->pcb_sp + SPOFF), count));
}
+
+void
+stack_save(struct stack *st)
+{
+ struct frame *fp;
+ db_expr_t addr;
+ vm_offset_t callpc;
+
+ stack_zero(st);
+ addr = (db_expr_t)__builtin_frame_address(1);
+ fp = (struct frame *)(addr + SPOFF);
+ while (1) {
+ callpc = fp->fr_pc;
+ if (!INKERNEL(callpc))
+ break;
+ if (stack_put(st, callpc) == -1)
+ break;
+ fp = (struct frame *)(fp->fr_fp + SPOFF);
+ }
+}
OpenPOWER on IntegriCloud