diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2003-02-20 22:07:22 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2003-02-20 22:07:22 +0000 |
commit | d49389adb995168842d8f5b967945f6bbb281244 (patch) | |
tree | 7035607055dbc6c107416c594e7baefb89e69332 /c/src/lib/libcpu/powerpc/shared/src/stack.c | |
parent | 2003-02-20 Till Straumann <strauman@slac.stanford.edu> (diff) | |
download | rtems-d49389adb995168842d8f5b967945f6bbb281244.tar.bz2 |
2003-02-20 Till Straumann <strauman@slac.stanford.edu>
PR 349/bsps
* mpc6xx/exceptions/raw_exception.c, mpc6xx/mmu/bat.c,
mpc6xx/mmu/pte121.c, shared/include/cpuIdent.c,
shared/include/cpuIdent.h, shared/src/Makefile.am, shared/src/stack.c,
shared/src/stackTrace.h, powerpc/registers.h:
- undo improper 'fix' who broke mpc604r identification
- fix: 7400 identification PVR value was wrong
- enhance 'setdbat()' to switch OFF a given BAT if called with 0 size
- fix: page table support bugfix
- enhancement: provide routines to take and print stack trace
snapshots
- add definitions for HID1 and DABR SPRs
Diffstat (limited to 'c/src/lib/libcpu/powerpc/shared/src/stack.c')
-rw-r--r-- | c/src/lib/libcpu/powerpc/shared/src/stack.c | 42 |
1 files changed, 42 insertions, 0 deletions
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 <rtems/bspIo.h> +#include <libcpu/spr.h> + +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 (; i<size-1 && p->up; 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"); +} |