xref: /kvm-unit-tests/lib/s390x/stack.c (revision b81a2cd4c2900db3fd6100c6b6bb09f768a2e4bf)
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>
11*b81a2cd4SJanosch 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;
251f4057ebSJanosch Frank 	}
261f4057ebSJanosch Frank 
271f4057ebSJanosch Frank 	return depth;
2839343080SDavid Hildenbrand }
2939343080SDavid Hildenbrand 
3039343080SDavid Hildenbrand int backtrace(const void **return_addrs, int max_depth)
3139343080SDavid Hildenbrand {
321f4057ebSJanosch Frank 	return backtrace_frame(__builtin_frame_address(0),
3339343080SDavid Hildenbrand 			       return_addrs, max_depth);
3439343080SDavid Hildenbrand }
35