File indexing completed on 2025-05-11 08:23:59
0001 #include <inttypes.h>
0002 #include <rtems/bspIo.h>
0003 #include <libcpu/stackTrace.h>
0004 #include <libcpu/spr.h>
0005
0006 SPR_RO(PPC_LR)
0007
0008 typedef struct FrameRec_ {
0009 struct FrameRec_ *up;
0010 void *lr;
0011 } FrameRec, *Frame;
0012
0013 #define CPU_STACK_TRACE_DEPTH 40
0014
0015 void CPU_stack_take_snapshot(void **stack, int size, void *pc, void *lr, void *r1)
0016 {
0017 register Frame p = (Frame)lr;
0018 register int i=0;
0019 if (pc) stack[i++]=pc;
0020 if (!p)
0021 p = (Frame)_read_PPC_LR();
0022 stack[i++]=p;
0023 p = r1;
0024 if (!p)
0025 __asm__ __volatile__("mr %0, %%r1":"=r"(p));
0026 for (; i<size-1 && p->up; p=p->up, i++) {
0027 stack[i]=p->up->lr;
0028 }
0029 stack[i]=0;
0030 }
0031
0032 void CPU_print_stack(void)
0033 {
0034 void *stck[CPU_STACK_TRACE_DEPTH];
0035 int i;
0036 CPU_stack_take_snapshot(stck,CPU_STACK_TRACE_DEPTH,0,0,0);
0037 for (i=0; stck[i]; i++) {
0038 if (i%5) printk("--> ");
0039 else printk("\n");
0040 printk("0x%08" PRIuPTR, (uintptr_t)stck[i]);
0041 }
0042 printk("\n");
0043 }