summaryrefslogtreecommitdiffstats
path: root/sys/powerpc
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/powerpc
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/powerpc')
-rw-r--r--sys/powerpc/powerpc/db_trace.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/sys/powerpc/powerpc/db_trace.c b/sys/powerpc/powerpc/db_trace.c
index a32625a..a30595c 100644
--- a/sys/powerpc/powerpc/db_trace.c
+++ b/sys/powerpc/powerpc/db_trace.c
@@ -32,6 +32,7 @@
#include <sys/systm.h>
#include <sys/kdb.h>
#include <sys/proc.h>
+#include <sys/stack.h>
#include <vm/vm.h>
#include <vm/pmap.h>
@@ -287,3 +288,25 @@ db_trace_thread(struct thread *td, int count)
return (db_backtrace(td, (db_addr_t)ctx->pcb_sp, count));
}
+void
+stack_save(struct stack *st)
+{
+ vm_offset_t callpc;
+ db_addr_t stackframe;
+
+ stack_zero(st);
+ stackframe = (db_addr_t)__builtin_frame_address(1);
+ if (stackframe < PAGE_SIZE)
+ return;
+ while (1) {
+ stackframe = *(db_addr_t *)stackframe;
+ if (stackframe < PAGE_SIZE)
+ break;
+ callpc = *(vm_offset_t *)(stackframe + 4) - 4;
+ if ((callpc & 3) || (callpc < 0x100))
+ break;
+ if (stack_put(st, callpc) == -1)
+ break;
+ }
+}
+
OpenPOWER on IntegriCloud