99#include <linux/init.h>
1010#include <linux/linkage.h>
1111#include <asm-generic/export.h>
12+
13+ #ifdef CONFIG_ISA_ARCV3
1214#include <asm/asm-macro-64-bit.h>
15+ #else
16+ #include <asm/asm-macro-32-bit.h>
17+ #endif
1318
1419.text
1520; ftrace placeholder, just return to caller
@@ -31,11 +36,9 @@ ENDPROC(ftrace_stub)
3136.macro SAVE_ABI_RET
3237 PUSHR r0
3338 PUSHR r1
34- PUSHR blink
3539.endm
3640
3741.macro LOAD_ABI_RET
38- POPR blink
3942 POPR r1
4043 POPR r0
4144.endm
@@ -68,21 +71,21 @@ ENTRY(_mcount)
6871
6972 ; *ftrace_graph_return != ftrace_stub
7073 MOVA r3, ftrace_graph_return
71- LD64 r3, r3
74+ LDR r3, r3
7275 MOVA r4, @ftrace_stub
7376 brne r3, r4, @do_ftrace_graph_caller
7477
7578 ; *ftrace_graph_entry != *ftrace_graph_entry_stub
7679 MOVA r3, @ftrace_graph_entry
77- LD64 r3, r3
80+ LDR r3, r3
7881 MOVA r4, @ftrace_graph_entry_stub
7982 brne r3, r4, @do_ftrace_graph_caller
8083
8184#endif
8285
8386 ; *ftrace_trace_function != ftrace_stub
8487 MOVA r2, ftrace_trace_function
85- LD64 r2, r2
88+ LDR r2, r2
8689
8790 MOVA r3, @ftrace_stub
8891 brne r2, r3, @do_trace
@@ -95,9 +98,23 @@ ENDPROC(_mcount)
9598#ifdef CONFIG_FUNCTION_GRAPH_TRACER
9699do_ftrace_graph_caller:
97100
98- SAVE_ABI
101+ #ifndef CONFIG_ISA_ARCV3
102+ # ABI does not allow us to infer blink location
103+ # ARC GCC port inserts into r1 the delta between the pushed blink and
104+ # the sp at call time
105+ # We perform calculation before any push (sp change) happens
106+ ADDR r0, r1, sp
107+
108+ SAVE_ABI
109+
110+ SUBR r0, r0, 4
111+ #else
112+ SAVE_ABI
99113
100114 ADDR r0, fp, 8
115+ #endif
116+
117+
101118 MOVR r1, blink
102119
103120 MOVA r2, @prepare_ftrace_return
@@ -117,3 +134,5 @@ SAVE_ABI
117134
118135LOAD_ABI
119136 j_s [blink]
137+
138+ EXPORT_SYMBOL(_mcount)
0 commit comments