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