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 RESTORE_ABI_STATE
41 .macro RESTORE_RET_ABI_STATE
49 #ifdef CONFIG_DYNAMIC_FTRACE
51 .set MCOUNT_NAME, ftrace_stub
56 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
57 ENTRY(return_to_handler)
59 * On implementing the frame point test, the ideal way is to compare the
60 * s0 (frame pointer, if enabled) on entry and the sp (stack pointer) on return.
61 * However, the psABI of variable-length-argument functions does not allow this.
63 * So alternatively we check the *old* frame pointer position, that is, the
64 * value stored in -16(s0) on entry, and the s0 on return.
66 #ifdef HAVE_FUNCTION_GRAPH_FP_TEST
70 #ifdef HAVE_FUNCTION_GRAPH_FP_TEST
73 call ftrace_return_to_handler
77 ENDPROC(return_to_handler)
78 EXPORT_SYMBOL(return_to_handler)
81 #ifndef CONFIG_DYNAMIC_FTRACE
84 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
85 la t0, ftrace_graph_return
87 bne t1, t4, do_ftrace_graph_caller
89 la t3, ftrace_graph_entry
91 la t6, ftrace_graph_entry_stub
92 bne t2, t6, do_ftrace_graph_caller
94 la t3, ftrace_trace_function
99 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
101 * A pseudo representation for the function graph tracer:
102 * prepare_to_return(&ra_to_caller_of_caller, ra_to_caller)
104 do_ftrace_graph_caller:
107 #ifdef HAVE_FUNCTION_GRAPH_FP_TEST
111 call prepare_ftrace_return
117 * A pseudo representation for the function tracer:
118 * (*ftrace_trace_function)(ra_to_caller, ra_to_caller_of_caller)
130 EXPORT_SYMBOL(MCOUNT_NAME)