18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci * arch/xtensa/include/asm/stacktrace.h
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public
58c2ecf20Sopenharmony_ci * License.  See the file "COPYING" in the main directory of this archive
68c2ecf20Sopenharmony_ci * for more details.
78c2ecf20Sopenharmony_ci *
88c2ecf20Sopenharmony_ci * Copyright (C) 2001 - 2013 Tensilica Inc.
98c2ecf20Sopenharmony_ci */
108c2ecf20Sopenharmony_ci#ifndef _XTENSA_STACKTRACE_H
118c2ecf20Sopenharmony_ci#define _XTENSA_STACKTRACE_H
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci#include <linux/sched.h>
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_cistruct stackframe {
168c2ecf20Sopenharmony_ci	unsigned long pc;
178c2ecf20Sopenharmony_ci	unsigned long sp;
188c2ecf20Sopenharmony_ci};
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_cistatic __always_inline unsigned long *stack_pointer(struct task_struct *task)
218c2ecf20Sopenharmony_ci{
228c2ecf20Sopenharmony_ci	unsigned long *sp;
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci	if (!task || task == current)
258c2ecf20Sopenharmony_ci		__asm__ __volatile__ ("mov %0, a1\n" : "=a"(sp));
268c2ecf20Sopenharmony_ci	else
278c2ecf20Sopenharmony_ci		sp = (unsigned long *)task->thread.sp;
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci	return sp;
308c2ecf20Sopenharmony_ci}
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_civoid walk_stackframe(unsigned long *sp,
338c2ecf20Sopenharmony_ci		int (*fn)(struct stackframe *frame, void *data),
348c2ecf20Sopenharmony_ci		void *data);
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_civoid xtensa_backtrace_kernel(struct pt_regs *regs, unsigned int depth,
378c2ecf20Sopenharmony_ci			     int (*kfn)(struct stackframe *frame, void *data),
388c2ecf20Sopenharmony_ci			     int (*ufn)(struct stackframe *frame, void *data),
398c2ecf20Sopenharmony_ci			     void *data);
408c2ecf20Sopenharmony_civoid xtensa_backtrace_user(struct pt_regs *regs, unsigned int depth,
418c2ecf20Sopenharmony_ci			   int (*ufn)(struct stackframe *frame, void *data),
428c2ecf20Sopenharmony_ci			   void *data);
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci#endif /* _XTENSA_STACKTRACE_H */
45