Back to home page

LXR

 
 

    


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) /* no macro for reading user regs */
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 }