1*52266791SPeter Feiner #include <libcflat.h> 2*52266791SPeter Feiner #include <stack.h> 3*52266791SPeter Feiner 4*52266791SPeter Feiner int backtrace_frame(const void *frame, const void **return_addrs, int max_depth) 5*52266791SPeter Feiner { 6*52266791SPeter Feiner static int walking; 7*52266791SPeter Feiner int depth = 0; 8*52266791SPeter Feiner const unsigned long *bp = (unsigned long *) frame; 9*52266791SPeter Feiner 10*52266791SPeter Feiner if (walking) { 11*52266791SPeter Feiner printf("RECURSIVE STACK WALK!!!\n"); 12*52266791SPeter Feiner return 0; 13*52266791SPeter Feiner } 14*52266791SPeter Feiner walking = 1; 15*52266791SPeter Feiner 16*52266791SPeter Feiner for (depth = 0; depth < max_depth; depth++) { 17*52266791SPeter Feiner return_addrs[depth] = (void *) bp[1]; 18*52266791SPeter Feiner if (return_addrs[depth] == 0) 19*52266791SPeter Feiner break; 20*52266791SPeter Feiner bp = (unsigned long *) bp[0]; 21*52266791SPeter Feiner } 22*52266791SPeter Feiner 23*52266791SPeter Feiner walking = 0; 24*52266791SPeter Feiner return depth; 25*52266791SPeter Feiner } 26*52266791SPeter Feiner 27*52266791SPeter Feiner int backtrace(const void **return_addrs, int max_depth) 28*52266791SPeter Feiner { 29*52266791SPeter Feiner return backtrace_frame(__builtin_frame_address(0), return_addrs, 30*52266791SPeter Feiner max_depth); 31*52266791SPeter Feiner } 32