Hexagon: Add basic stacktrace functionality for Hexagon architecture.
PATCH v5 34/36 Hexagon: Add basic stacktrace functionality for Hexagon architecture.
Signed-off-by Richard Kuo <[email protected]>
Signed-off-by Linas Vepstas <[email protected]>
Acked-by Arnd Bergmann <[email protected]>
--- arch/hexagon/kernel/stacktrace.c | 66 ++++++++++++++++++++++++++++++++++++++ 1 files changed, 66 insertions(+), 0 deletions(-) create mode 100644 arch/hexagon/kernel/stacktrace.c
arch/hexagon/kernel/stacktrace.c new file +66 -0
@@ -0,0 +1,66 @@ +/* +* Stacktrace support for Hexagon +* +* Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License version 2 and +* only version 2 as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +* 02110-1301, USA. +*/ + +#include <linux/sched.h> +#include <linux/stacktrace.h> +#include <linux/thread_info.h> +#include <linux/module.h> + +registerunsigned long current_frame_pointer asm("r30" ); + +struct stackframe { +unsigned long fp; +unsigned long rets; +}; + +/* +* Save stack-backtrace addresses into a stack_trace buffer. +*/ +void save_stack_trace (struct stack_trace *trace) +{ +unsigned long low, high; +unsigned long fp; +struct stackframe *frame; +int skip = trace->skip; + + low = (unsigned long )task_stack_page (current); + high = low +THREAD_SIZE ; + fp = current_frame_pointer; + +while (fp >= low && fp <= (high -sizeof (*frame))) { + frame = (struct stackframe *)fp; + +if (skip) { + skip--; + }else { + trace->entries[trace->nr_entries++] = frame->rets; +if (trace->nr_entries >= trace->max_entries) +break ; + } + +/* +* The next frame must be at a higher address than the +* current frame. +*/ + low = fp +sizeof (*frame); + fp = frame->fp; + } +} +EXPORT_SYMBOL_GPL (save_stack_trace);
Signature · 7 lines
1.7.1 -- Sent by an employee of the Qualcomm Innovation Center, Inc. The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.