xref: /openbmc/linux/arch/csky/abiv2/mcount.S (revision 03638e62)
1/* SPDX-License-Identifier: GPL-2.0 */
2// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
3
4#include <linux/linkage.h>
5#include <asm/ftrace.h>
6
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
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)
32	stw	r8, (sp, 20)
33.endm
34
35.macro mcount_exit
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)
41	ldw	r8, (sp, 20)
42	ldw	lr, (sp, 24)
43	addi	sp, 28
44	jmp	t1
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
64.macro nop32_stub
65	nop32
66	nop32
67	nop32
68.endm
69
70ENTRY(ftrace_stub)
71	jmp	lr
72END(ftrace_stub)
73
74#ifndef CONFIG_DYNAMIC_FTRACE
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
86	subi	a0, 4
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)
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 */
139
140#ifdef CONFIG_FUNCTION_GRAPH_TRACER
141ENTRY(ftrace_graph_caller)
142	mov	a0, sp
143	addi	a0, 24
144	ldw	a1, (sp, 16)
145	subi	a1, 4
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
160