Linux 5.7.6
[linux/fpc-iii.git] / arch / csky / abiv2 / mcount.S
blob911512bf480f3ef9102e3d24b072dc2a37fd6d07
1 /* SPDX-License-Identifier: GPL-2.0 */
2 // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
4 #include <linux/linkage.h>
5 #include <asm/ftrace.h>
6 #include <abi/entry.h>
7 #include <asm/asm-offsets.h>
9 /*
10  * csky-gcc with -pg will put the following asm after prologue:
11  *      push    r15
12  *      jsri    _mcount
13  *
14  * stack layout after mcount_enter in _mcount():
15  *
16  * current sp => 0:+-------+
17  *                 | a0-a3 | -> must save all argument regs
18  *             +16:+-------+
19  *                 | lr    | -> _mcount lr (instrumente function's pc)
20  *             +20:+-------+
21  *                 | fp=r8 | -> instrumented function fp
22  *             +24:+-------+
23  *                 | plr   | -> instrumented function lr (parent's pc)
24  *                 +-------+
25  */
27 .macro mcount_enter
28         subi    sp, 24
29         stw     a0, (sp, 0)
30         stw     a1, (sp, 4)
31         stw     a2, (sp, 8)
32         stw     a3, (sp, 12)
33         stw     lr, (sp, 16)
34         stw     r8, (sp, 20)
35 .endm
37 .macro mcount_exit
38         ldw     a0, (sp, 0)
39         ldw     a1, (sp, 4)
40         ldw     a2, (sp, 8)
41         ldw     a3, (sp, 12)
42         ldw     t1, (sp, 16)
43         ldw     r8, (sp, 20)
44         ldw     lr, (sp, 24)
45         addi    sp, 28
46         jmp     t1
47 .endm
49 .macro mcount_enter_regs
50         subi    sp, 8
51         stw     lr, (sp, 0)
52         stw     r8, (sp, 4)
53         SAVE_REGS_FTRACE
54 .endm
56 .macro mcount_exit_regs
57         RESTORE_REGS_FTRACE
58         ldw     t1, (sp, 0)
59         ldw     r8, (sp, 4)
60         ldw     lr, (sp, 8)
61         addi    sp, 12
62         jmp     t1
63 .endm
65 .macro save_return_regs
66         subi    sp, 16
67         stw     a0, (sp, 0)
68         stw     a1, (sp, 4)
69         stw     a2, (sp, 8)
70         stw     a3, (sp, 12)
71 .endm
73 .macro restore_return_regs
74         mov     lr, a0
75         ldw     a0, (sp, 0)
76         ldw     a1, (sp, 4)
77         ldw     a2, (sp, 8)
78         ldw     a3, (sp, 12)
79         addi    sp, 16
80 .endm
82 .macro nop32_stub
83         nop32
84         nop32
85         nop32
86 .endm
88 ENTRY(ftrace_stub)
89         jmp     lr
90 END(ftrace_stub)
92 #ifndef CONFIG_DYNAMIC_FTRACE
93 ENTRY(_mcount)
94         mcount_enter
96         /* r26 is link register, only used with jsri translation */
97         lrw     r26, ftrace_trace_function
98         ldw     r26, (r26, 0)
99         lrw     a1, ftrace_stub
100         cmpne   r26, a1
101         bf      skip_ftrace
103         mov     a0, lr
104         subi    a0, 4
105         ldw     a1, (sp, 24)
106         lrw     a2, function_trace_op
107         ldw     a2, (a2, 0)
109         jsr     r26
111 #ifndef CONFIG_FUNCTION_GRAPH_TRACER
112 skip_ftrace:
113         mcount_exit
114 #else
115 skip_ftrace:
116         lrw     a0, ftrace_graph_return
117         ldw     a0, (a0, 0)
118         lrw     a1, ftrace_stub
119         cmpne   a0, a1
120         bt      ftrace_graph_caller
122         lrw     a0, ftrace_graph_entry
123         ldw     a0, (a0, 0)
124         lrw     a1, ftrace_graph_entry_stub
125         cmpne   a0, a1
126         bt      ftrace_graph_caller
128         mcount_exit
129 #endif
130 END(_mcount)
131 #else /* CONFIG_DYNAMIC_FTRACE */
132 ENTRY(_mcount)
133         mov     t1, lr
134         ldw     lr, (sp, 0)
135         addi    sp, 4
136         jmp     t1
137 ENDPROC(_mcount)
139 ENTRY(ftrace_caller)
140         mcount_enter
142         ldw     a0, (sp, 16)
143         subi    a0, 4
144         ldw     a1, (sp, 24)
145         lrw     a2, function_trace_op
146         ldw     a2, (a2, 0)
148         nop
149 GLOBAL(ftrace_call)
150         nop32_stub
152 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
153         nop
154 GLOBAL(ftrace_graph_call)
155         nop32_stub
156 #endif
158         mcount_exit
159 ENDPROC(ftrace_caller)
160 #endif /* CONFIG_DYNAMIC_FTRACE */
162 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
163 ENTRY(ftrace_graph_caller)
164         mov     a0, sp
165         addi    a0, 24
166         ldw     a1, (sp, 16)
167         subi    a1, 4
168         mov     a2, r8
169         lrw     r26, prepare_ftrace_return
170         jsr     r26
171         mcount_exit
172 END(ftrace_graph_caller)
174 ENTRY(return_to_handler)
175         save_return_regs
176         mov     a0, r8
177         jsri    ftrace_return_to_handler
178         restore_return_regs
179         jmp     lr
180 END(return_to_handler)
181 #endif
183 #ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS
184 ENTRY(ftrace_regs_caller)
185         mcount_enter_regs
187         lrw     t1, PT_FRAME_SIZE
188         add     t1, sp
190         ldw     a0, (t1, 0)
191         subi    a0, 4
192         ldw     a1, (t1, 8)
193         lrw     a2, function_trace_op
194         ldw     a2, (a2, 0)
195         mov     a3, sp
197         nop
198 GLOBAL(ftrace_regs_call)
199         nop32_stub
201 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
202         nop
203 GLOBAL(ftrace_graph_regs_call)
204         nop32_stub
205 #endif
207         mcount_exit_regs
208 ENDPROC(ftrace_regs_caller)
209 #endif /* CONFIG_DYNAMIC_FTRACE */