xref: /kvm-unit-tests/lib/s390x/stack.c (revision 6444ae208ce0085d0f5c5ffb15909ca3bbd49c84)
16c9f99dfSJanosch Frank /* SPDX-License-Identifier: GPL-2.0-only */
239343080SDavid Hildenbrand /*
339343080SDavid Hildenbrand  * s390x stack implementation
439343080SDavid Hildenbrand  *
539343080SDavid Hildenbrand  * Copyright (c) 2017 Red Hat Inc
61f4057ebSJanosch Frank  * Copyright 2021 IBM Corp
739343080SDavid Hildenbrand  *
839343080SDavid Hildenbrand  * Authors:
939343080SDavid Hildenbrand  *  Thomas Huth <thuth@redhat.com>
1039343080SDavid Hildenbrand  *  David Hildenbrand <david@redhat.com>
11b81a2cd4SJanosch Frank  *  Janosch Frank <frankja@linux.ibm.com>
1239343080SDavid Hildenbrand  */
1339343080SDavid Hildenbrand #include <libcflat.h>
1439343080SDavid Hildenbrand #include <stack.h>
151f4057ebSJanosch Frank #include <asm/arch_def.h>
1639343080SDavid Hildenbrand 
arch_backtrace_frame(const void * frame,const void ** return_addrs,int max_depth,bool current_frame)17*a8a78d75SAndrew Jones int arch_backtrace_frame(const void *frame, const void **return_addrs,
18*a8a78d75SAndrew Jones 			 int max_depth, bool current_frame)
1939343080SDavid Hildenbrand {
201f4057ebSJanosch Frank 	int depth = 0;
211f4057ebSJanosch Frank 	struct stack_frame *stack = (struct stack_frame *)frame;
221f4057ebSJanosch Frank 
23*a8a78d75SAndrew Jones 	if (current_frame)
24*a8a78d75SAndrew Jones 		stack = __builtin_frame_address(0);
25*a8a78d75SAndrew Jones 
261f4057ebSJanosch Frank 	for (depth = 0; stack && depth < max_depth; depth++) {
271f4057ebSJanosch Frank 		return_addrs[depth] = (void *)stack->grs[8];
281f4057ebSJanosch Frank 		stack = stack->back_chain;
2953f978a0SJanosch Frank 		if (!stack)
3053f978a0SJanosch Frank 			break;
311f4057ebSJanosch Frank 	}
321f4057ebSJanosch Frank 
331f4057ebSJanosch Frank 	return depth;
3439343080SDavid Hildenbrand }
35