xref: /kvm-unit-tests/lib/s390x/stack.c (revision 53f978a03d534d2ba055a4c10a9ce53c3883de05)
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 
1739343080SDavid Hildenbrand int backtrace_frame(const void *frame, const void **return_addrs, int max_depth)
1839343080SDavid Hildenbrand {
191f4057ebSJanosch Frank 	int depth = 0;
201f4057ebSJanosch Frank 	struct stack_frame *stack = (struct stack_frame *)frame;
211f4057ebSJanosch Frank 
221f4057ebSJanosch Frank 	for (depth = 0; stack && depth < max_depth; depth++) {
231f4057ebSJanosch Frank 		return_addrs[depth] = (void *)stack->grs[8];
241f4057ebSJanosch Frank 		stack = stack->back_chain;
25*53f978a0SJanosch Frank 		if (!stack)
26*53f978a0SJanosch Frank 			break;
271f4057ebSJanosch Frank 	}
281f4057ebSJanosch Frank 
291f4057ebSJanosch Frank 	return depth;
3039343080SDavid Hildenbrand }
3139343080SDavid Hildenbrand 
3239343080SDavid Hildenbrand int backtrace(const void **return_addrs, int max_depth)
3339343080SDavid Hildenbrand {
341f4057ebSJanosch Frank 	return backtrace_frame(__builtin_frame_address(0),
3539343080SDavid Hildenbrand 			       return_addrs, max_depth);
3639343080SDavid Hildenbrand }
37