18c2ecf20Sopenharmony_ci/** 28c2ecf20Sopenharmony_ci * @file backtrace.c 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * @remark Copyright 2008 Tensilica Inc. 58c2ecf20Sopenharmony_ci * Copyright (C) 2015 Cadence Design Systems Inc. 68c2ecf20Sopenharmony_ci * @remark Read the file COPYING 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <linux/oprofile.h> 118c2ecf20Sopenharmony_ci#include <asm/ptrace.h> 128c2ecf20Sopenharmony_ci#include <asm/stacktrace.h> 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_cistatic int xtensa_backtrace_cb(struct stackframe *frame, void *data) 158c2ecf20Sopenharmony_ci{ 168c2ecf20Sopenharmony_ci oprofile_add_trace(frame->pc); 178c2ecf20Sopenharmony_ci return 0; 188c2ecf20Sopenharmony_ci} 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_civoid xtensa_backtrace(struct pt_regs * const regs, unsigned int depth) 218c2ecf20Sopenharmony_ci{ 228c2ecf20Sopenharmony_ci if (user_mode(regs)) 238c2ecf20Sopenharmony_ci xtensa_backtrace_user(regs, depth, xtensa_backtrace_cb, NULL); 248c2ecf20Sopenharmony_ci else 258c2ecf20Sopenharmony_ci xtensa_backtrace_kernel(regs, depth, xtensa_backtrace_cb, 268c2ecf20Sopenharmony_ci xtensa_backtrace_cb, NULL); 278c2ecf20Sopenharmony_ci} 28