xref: /kvm-unit-tests/lib/riscv/stack.c (revision 6fba6b84bae33db2b7fda1d4ff50f1d78e83adba)
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