152266791SPeter Feiner #include <libcflat.h> 252266791SPeter Feiner #include <stack.h> 352266791SPeter Feiner 452266791SPeter Feiner int backtrace_frame(const void *frame, const void **return_addrs, int max_depth) 552266791SPeter Feiner { 652266791SPeter Feiner static int walking; 752266791SPeter Feiner int depth = 0; 852266791SPeter Feiner const unsigned long *bp = (unsigned long *) frame; 952266791SPeter Feiner 1052266791SPeter Feiner if (walking) { 1152266791SPeter Feiner printf("RECURSIVE STACK WALK!!!\n"); 1252266791SPeter Feiner return 0; 1352266791SPeter Feiner } 1452266791SPeter Feiner walking = 1; 1552266791SPeter Feiner 16*804e551cSAndrew Jones for (depth = 0; bp && depth < max_depth; depth++) { 1752266791SPeter Feiner return_addrs[depth] = (void *) bp[1]; 1852266791SPeter Feiner if (return_addrs[depth] == 0) 1952266791SPeter Feiner break; 2052266791SPeter Feiner bp = (unsigned long *) bp[0]; 2152266791SPeter Feiner } 2252266791SPeter Feiner 2352266791SPeter Feiner walking = 0; 2452266791SPeter Feiner return depth; 2552266791SPeter Feiner } 2652266791SPeter Feiner 2752266791SPeter Feiner int backtrace(const void **return_addrs, int max_depth) 2852266791SPeter Feiner { 2952266791SPeter Feiner return backtrace_frame(__builtin_frame_address(0), return_addrs, 3052266791SPeter Feiner max_depth); 3152266791SPeter Feiner } 32