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