xref: /kvm-unit-tests/lib/x86/stack.c (revision 52266791750d89b7f4ab6bad4d42de0056e4fb32)
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