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