xref: /kvm-unit-tests/lib/s390x/stack.c (revision 1f4057eb69c473df7086265946a3205cc95ddee6)
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
6*1f4057ebSJanosch Frank  * Copyright 2021 IBM Corp
739343080SDavid Hildenbrand  *
839343080SDavid Hildenbrand  * Authors:
939343080SDavid Hildenbrand  *  Thomas Huth <thuth@redhat.com>
1039343080SDavid Hildenbrand  *  David Hildenbrand <david@redhat.com>
11*1f4057ebSJanosch Frank  *  Janosch Frank <frankja@de.ibm.com>
1239343080SDavid Hildenbrand  */
1339343080SDavid Hildenbrand #include <libcflat.h>
1439343080SDavid Hildenbrand #include <stack.h>
15*1f4057ebSJanosch Frank #include <asm/arch_def.h>
1639343080SDavid Hildenbrand 
1739343080SDavid Hildenbrand int backtrace_frame(const void *frame, const void **return_addrs, int max_depth)
1839343080SDavid Hildenbrand {
19*1f4057ebSJanosch Frank 	int depth = 0;
20*1f4057ebSJanosch Frank 	struct stack_frame *stack = (struct stack_frame *)frame;
21*1f4057ebSJanosch Frank 
22*1f4057ebSJanosch Frank 	for (depth = 0; stack && depth < max_depth; depth++) {
23*1f4057ebSJanosch Frank 		return_addrs[depth] = (void *)stack->grs[8];
24*1f4057ebSJanosch Frank 		stack = stack->back_chain;
25*1f4057ebSJanosch Frank 	}
26*1f4057ebSJanosch Frank 
27*1f4057ebSJanosch Frank 	return depth;
2839343080SDavid Hildenbrand }
2939343080SDavid Hildenbrand 
3039343080SDavid Hildenbrand int backtrace(const void **return_addrs, int max_depth)
3139343080SDavid Hildenbrand {
32*1f4057ebSJanosch Frank 	return backtrace_frame(__builtin_frame_address(0),
3339343080SDavid Hildenbrand 			       return_addrs, max_depth);
3439343080SDavid Hildenbrand }
35