]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/blame - arch/csky/abiv2/mcount.S
Merge tag 'tee-optee-for-5.4' of git://git.linaro.org/people/jens.wiklander/linux...
[mirror_ubuntu-focal-kernel.git] / arch / csky / abiv2 / mcount.S
CommitLineData
230c77a5
GR
1/* SPDX-License-Identifier: GPL-2.0 */
2// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
3
4#include <linux/linkage.h>
d7950be1 5#include <asm/ftrace.h>
230c77a5 6
d7950be1
GR
7/*
8 * csky-gcc with -pg will put the following asm after prologue:
9 * push r15
10 * jsri _mcount
11 *
12 * stack layout after mcount_enter in _mcount():
13 *
14 * current sp => 0:+-------+
15 * | a0-a3 | -> must save all argument regs
16 * +16:+-------+
17 * | lr | -> _mcount lr (instrumente function's pc)
18 * +20:+-------+
19 * | fp=r8 | -> instrumented function fp
20 * +24:+-------+
21 * | plr | -> instrumented function lr (parent's pc)
22 * +-------+
23 */
24
25.macro mcount_enter
26 subi sp, 24
230c77a5
GR
27 stw a0, (sp, 0)
28 stw a1, (sp, 4)
29 stw a2, (sp, 8)
30 stw a3, (sp, 12)
31 stw lr, (sp, 16)
d7950be1
GR
32 stw r8, (sp, 20)
33.endm
34
35.macro mcount_exit
230c77a5
GR
36 ldw a0, (sp, 0)
37 ldw a1, (sp, 4)
38 ldw a2, (sp, 8)
39 ldw a3, (sp, 12)
40 ldw t1, (sp, 16)
d7950be1
GR
41 ldw r8, (sp, 20)
42 ldw lr, (sp, 24)
43 addi sp, 28
230c77a5 44 jmp t1
d7950be1
GR
45.endm
46
47.macro save_return_regs
48 subi sp, 16
49 stw a0, (sp, 0)
50 stw a1, (sp, 4)
51 stw a2, (sp, 8)
52 stw a3, (sp, 12)
53.endm
54
55.macro restore_return_regs
56 mov lr, a0
57 ldw a0, (sp, 0)
58 ldw a1, (sp, 4)
59 ldw a2, (sp, 8)
60 ldw a3, (sp, 12)
61 addi sp, 16
62.endm
63
28bb030f
GR
64.macro nop32_stub
65 nop32
66 nop32
67 nop32
68.endm
69
d7950be1
GR
70ENTRY(ftrace_stub)
71 jmp lr
72END(ftrace_stub)
73
28bb030f 74#ifndef CONFIG_DYNAMIC_FTRACE
d7950be1
GR
75ENTRY(_mcount)
76 mcount_enter
77
78 /* r26 is link register, only used with jsri translation */
79 lrw r26, ftrace_trace_function
80 ldw r26, (r26, 0)
81 lrw a1, ftrace_stub
82 cmpne r26, a1
83 bf skip_ftrace
84
85 mov a0, lr
28bb030f 86 subi a0, 4
d7950be1
GR
87 ldw a1, (sp, 24)
88
89 jsr r26
90
91#ifndef CONFIG_FUNCTION_GRAPH_TRACER
92skip_ftrace:
93 mcount_exit
94#else
95skip_ftrace:
96 lrw a0, ftrace_graph_return
97 ldw a0, (a0, 0)
98 lrw a1, ftrace_stub
99 cmpne a0, a1
100 bt ftrace_graph_caller
101
102 lrw a0, ftrace_graph_entry
103 ldw a0, (a0, 0)
104 lrw a1, ftrace_graph_entry_stub
105 cmpne a0, a1
106 bt ftrace_graph_caller
107
108 mcount_exit
109#endif
110END(_mcount)
28bb030f
GR
111#else /* CONFIG_DYNAMIC_FTRACE */
112ENTRY(_mcount)
113 mov t1, lr
114 ldw lr, (sp, 0)
115 addi sp, 4
116 jmp t1
117ENDPROC(_mcount)
118
119ENTRY(ftrace_caller)
120 mcount_enter
121
122 ldw a0, (sp, 16)
123 subi a0, 4
124 ldw a1, (sp, 24)
125
126 nop
127GLOBAL(ftrace_call)
128 nop32_stub
129
130#ifdef CONFIG_FUNCTION_GRAPH_TRACER
131 nop
132GLOBAL(ftrace_graph_call)
133 nop32_stub
134#endif
135
136 mcount_exit
137ENDPROC(ftrace_caller)
138#endif /* CONFIG_DYNAMIC_FTRACE */
d7950be1
GR
139
140#ifdef CONFIG_FUNCTION_GRAPH_TRACER
141ENTRY(ftrace_graph_caller)
142 mov a0, sp
143 addi a0, 24
144 ldw a1, (sp, 16)
28bb030f 145 subi a1, 4
d7950be1
GR
146 mov a2, r8
147 lrw r26, prepare_ftrace_return
148 jsr r26
149 mcount_exit
150END(ftrace_graph_caller)
151
152ENTRY(return_to_handler)
153 save_return_regs
154 mov a0, r8
155 jsri ftrace_return_to_handler
156 restore_return_regs
157 jmp lr
158END(return_to_handler)
159#endif