From da1100e0355565faf09737521c222f65ab1e9069 Mon Sep 17 00:00:00 2001 From: cvs2git Date: Thu, 20 Feb 2003 22:07:23 +0000 Subject: [PATCH] This commit was manufactured by cvs2svn to create branch 'rtems-4-6-branch'. Cherrypick from master 2003-02-20 22:07:22 UTC Joel Sherrill '2003-02-20 Till Straumann ': c/src/lib/libcpu/powerpc/shared/src/stack.c c/src/lib/libcpu/powerpc/shared/src/stackTrace.h --- c/src/lib/libcpu/powerpc/shared/src/stack.c | 42 +++++++++++++++++++ .../libcpu/powerpc/shared/src/stackTrace.h | 8 ++++ 2 files changed, 50 insertions(+) create mode 100644 c/src/lib/libcpu/powerpc/shared/src/stack.c create mode 100644 c/src/lib/libcpu/powerpc/shared/src/stackTrace.h diff --git a/c/src/lib/libcpu/powerpc/shared/src/stack.c b/c/src/lib/libcpu/powerpc/shared/src/stack.c new file mode 100644 index 0000000000..bf97cb53db --- /dev/null +++ b/c/src/lib/libcpu/powerpc/shared/src/stack.c @@ -0,0 +1,42 @@ +#include "stackTrace.h" +#include +#include + +SPR_RO(LR) + +typedef struct FrameRec_ { + struct FrameRec_ *up; + void *lr; +} FrameRec, *Frame; + +#define CPU_STACK_TRACE_DEPTH 40 + +void CPU_stack_take_snapshot(void **stack, int size, void *pc, void *lr, void *r1) +{ +register Frame p = (Frame)lr; +register int i=0; + if (pc) stack[i++]=pc; + if (!p) + p = (Frame)_read_LR(); + stack[i++]=p; + p = r1; + if (!p) /* no macro for reading user regs */ + __asm__ __volatile__("mr %0, %%r1":"=r"(p)); + for (; iup; p=p->up, i++) { + stack[i]=p->up->lr; + } + stack[i]=0; +} + +void CPU_print_stack(void) +{ + void *stck[CPU_STACK_TRACE_DEPTH]; + int i; + CPU_stack_take_snapshot(stck,CPU_STACK_TRACE_DEPTH,0,0,0); + for (i=0; stck[i]; i++) { + if (i%5) printk("--> "); + else printk("\n"); + printk("0x%08x",stck[i]); + } + printk("\n"); +} diff --git a/c/src/lib/libcpu/powerpc/shared/src/stackTrace.h b/c/src/lib/libcpu/powerpc/shared/src/stackTrace.h new file mode 100644 index 0000000000..b85b333876 --- /dev/null +++ b/c/src/lib/libcpu/powerpc/shared/src/stackTrace.h @@ -0,0 +1,8 @@ +#ifndef CPU_STACK_UTIL_H +#define CPU_STACK_UTIL_H + +void CPU_stack_take_snapshot(void **stack, int size, void *pc, void *lr, void *r1); + +void CPU_print_stack(void); + +#endif