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 arch_backtrace_frame(const void * frame,const void ** return_addrs,int max_depth,bool current_frame)17*a8a78d75SAndrew Jonesint arch_backtrace_frame(const void *frame, const void **return_addrs, 18*a8a78d75SAndrew Jones int max_depth, bool current_frame) 1939343080SDavid Hildenbrand { 201f4057ebSJanosch Frank int depth = 0; 211f4057ebSJanosch Frank struct stack_frame *stack = (struct stack_frame *)frame; 221f4057ebSJanosch Frank 23*a8a78d75SAndrew Jones if (current_frame) 24*a8a78d75SAndrew Jones stack = __builtin_frame_address(0); 25*a8a78d75SAndrew Jones 261f4057ebSJanosch Frank for (depth = 0; stack && depth < max_depth; depth++) { 271f4057ebSJanosch Frank return_addrs[depth] = (void *)stack->grs[8]; 281f4057ebSJanosch Frank stack = stack->back_chain; 2953f978a0SJanosch Frank if (!stack) 3053f978a0SJanosch Frank break; 311f4057ebSJanosch Frank } 321f4057ebSJanosch Frank 331f4057ebSJanosch Frank return depth; 3439343080SDavid Hildenbrand } 35