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