152266791SPeter Feiner #include <libcflat.h> 252266791SPeter Feiner #include <stack.h> 352266791SPeter Feiner arch_backtrace_frame(const void * frame,const void ** return_addrs,int max_depth,bool current_frame)4*a8a78d75SAndrew Jonesint arch_backtrace_frame(const void *frame, const void **return_addrs, 5*a8a78d75SAndrew Jones int max_depth, bool current_frame) 652266791SPeter Feiner { 752266791SPeter Feiner static int walking; 852266791SPeter Feiner int depth = 0; 952266791SPeter Feiner const unsigned long *bp = (unsigned long *) frame; 1052266791SPeter Feiner 11*a8a78d75SAndrew Jones if (current_frame) 12*a8a78d75SAndrew Jones bp = __builtin_frame_address(0); 13*a8a78d75SAndrew Jones 1452266791SPeter Feiner if (walking) { 1552266791SPeter Feiner printf("RECURSIVE STACK WALK!!!\n"); 1652266791SPeter Feiner return 0; 1752266791SPeter Feiner } 1852266791SPeter Feiner walking = 1; 1952266791SPeter Feiner 20804e551cSAndrew Jones for (depth = 0; bp && depth < max_depth; depth++) { 2152266791SPeter Feiner return_addrs[depth] = (void *) bp[1]; 2252266791SPeter Feiner if (return_addrs[depth] == 0) 2352266791SPeter Feiner break; 2452266791SPeter Feiner bp = (unsigned long *) bp[0]; 2552266791SPeter Feiner } 2652266791SPeter Feiner 2752266791SPeter Feiner walking = 0; 2852266791SPeter Feiner return depth; 2952266791SPeter Feiner } 30