1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Copyright (C) 2017 Andes Technology Corporation */
4 #include <linux/init.h>
5 #include <linux/linkage.h>
8 #include <asm/unistd.h>
9 #include <asm/thread_info.h>
10 #include <asm/asm-offsets.h>
11 #include <asm-generic/export.h>
12 #include <asm/ftrace.h>
24 * The call to ftrace_return_to_handler would overwrite the return
25 * register if a0 was not saved.
27 .macro SAVE_RET_ABI_STATE
35 .macro STORE_ABI_STATE
41 .macro STORE_RET_ABI_STATE
52 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
53 ENTRY(return_to_handler)
55 * On implementing the frame point test, the ideal way is to compare the
56 * s0 (frame pointer, if enabled) on entry and the sp (stack pointer) on return.
57 * However, the psABI of variable-length-argument functions does not allow this.
59 * So alternatively we check the *old* frame pointer position, that is, the
60 * value stored in -16(s0) on entry, and the s0 on return.
62 #ifdef HAVE_FUNCTION_GRAPH_FP_TEST
66 #ifdef HAVE_FUNCTION_GRAPH_FP_TEST
69 la t0, ftrace_return_to_handler
74 ENDPROC(return_to_handler)
75 EXPORT_SYMBOL(return_to_handler)
80 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
81 la t0, ftrace_graph_return
83 bne t1, t4, do_ftrace_graph_caller
85 la t3, ftrace_graph_entry
87 la t6, ftrace_graph_entry_stub
88 bne t2, t6, do_ftrace_graph_caller
90 la t3, ftrace_trace_function
95 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
97 * A pseudo representation for the function graph tracer:
98 * prepare_to_return(&ra_to_caller_of_caller, ra_to_caller)
100 do_ftrace_graph_caller:
103 #ifdef HAVE_FUNCTION_GRAPH_FP_TEST
107 la t0, prepare_ftrace_return
114 * A pseudo representation for the function tracer:
115 * (*ftrace_trace_function)(ra_to_caller, ra_to_caller_of_caller)
126 EXPORT_SYMBOL(_mcount)