18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/* Copyright (C) 2008-2018 Andes Technology Corporation */
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci#ifndef __ASM_STACKTRACE_H
58c2ecf20Sopenharmony_ci#define __ASM_STACKTRACE_H
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci/* Kernel callchain */
88c2ecf20Sopenharmony_cistruct stackframe {
98c2ecf20Sopenharmony_ci	unsigned long fp;
108c2ecf20Sopenharmony_ci	unsigned long sp;
118c2ecf20Sopenharmony_ci	unsigned long lp;
128c2ecf20Sopenharmony_ci};
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci/*
158c2ecf20Sopenharmony_ci * struct frame_tail: User callchain
168c2ecf20Sopenharmony_ci * IMPORTANT:
178c2ecf20Sopenharmony_ci * This struct is used for call-stack walking,
188c2ecf20Sopenharmony_ci * the order and types matters.
198c2ecf20Sopenharmony_ci * Do not use array, it only stores sizeof(pointer)
208c2ecf20Sopenharmony_ci *
218c2ecf20Sopenharmony_ci * The details can refer to arch/arm/kernel/perf_event.c
228c2ecf20Sopenharmony_ci */
238c2ecf20Sopenharmony_cistruct frame_tail {
248c2ecf20Sopenharmony_ci	unsigned long stack_fp;
258c2ecf20Sopenharmony_ci	unsigned long stack_lp;
268c2ecf20Sopenharmony_ci};
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci/* For User callchain with optimize for size */
298c2ecf20Sopenharmony_cistruct frame_tail_opt_size {
308c2ecf20Sopenharmony_ci	unsigned long stack_r6;
318c2ecf20Sopenharmony_ci	unsigned long stack_fp;
328c2ecf20Sopenharmony_ci	unsigned long stack_gp;
338c2ecf20Sopenharmony_ci	unsigned long stack_lp;
348c2ecf20Sopenharmony_ci};
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ciextern void
378c2ecf20Sopenharmony_ciget_real_ret_addr(unsigned long *addr, struct task_struct *tsk, int *graph);
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci#endif /* __ASM_STACKTRACE_H */
40