xref: /kvm-unit-tests/lib/x86/stack.c (revision 6444ae208ce0085d0f5c5ffb15909ca3bbd49c84)
152266791SPeter Feiner #include <libcflat.h>
252266791SPeter Feiner #include <stack.h>
352266791SPeter Feiner 
arch_backtrace_frame(const void * frame,const void ** return_addrs,int max_depth,bool current_frame)4*a8a78d75SAndrew Jones int arch_backtrace_frame(const void *frame, const void **return_addrs,
5*a8a78d75SAndrew Jones 			 int max_depth, bool current_frame)
652266791SPeter Feiner {
752266791SPeter Feiner 	static int walking;
852266791SPeter Feiner 	int depth = 0;
952266791SPeter Feiner 	const unsigned long *bp = (unsigned long *) frame;
1052266791SPeter Feiner 
11*a8a78d75SAndrew Jones 	if (current_frame)
12*a8a78d75SAndrew Jones 		bp = __builtin_frame_address(0);
13*a8a78d75SAndrew Jones 
1452266791SPeter Feiner 	if (walking) {
1552266791SPeter Feiner 		printf("RECURSIVE STACK WALK!!!\n");
1652266791SPeter Feiner 		return 0;
1752266791SPeter Feiner 	}
1852266791SPeter Feiner 	walking = 1;
1952266791SPeter Feiner 
20804e551cSAndrew Jones 	for (depth = 0; bp && depth < max_depth; depth++) {
2152266791SPeter Feiner 		return_addrs[depth] = (void *) bp[1];
2252266791SPeter Feiner 		if (return_addrs[depth] == 0)
2352266791SPeter Feiner 			break;
2452266791SPeter Feiner 		bp = (unsigned long *) bp[0];
2552266791SPeter Feiner 	}
2652266791SPeter Feiner 
2752266791SPeter Feiner 	walking = 0;
2852266791SPeter Feiner 	return depth;
2952266791SPeter Feiner }
30