xref: /linux/arch/s390/kernel/mcount.S (revision 5bdef865eb358b6f3760e25e591ae115e9eeddef)
1/*
2 * Copyright IBM Corp. 2008,2009
3 *
4 *   Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>,
5 *
6 */
7
8#include <asm/asm-offsets.h>
9
10	.globl ftrace_stub
11ftrace_stub:
12	br	%r14
13
14#ifdef CONFIG_64BIT
15
16#ifdef CONFIG_DYNAMIC_FTRACE
17
18	.globl _mcount
19_mcount:
20	br	%r14
21
22	.globl ftrace_caller
23ftrace_caller:
24	larl	%r1,function_trace_stop
25	icm	%r1,0xf,0(%r1)
26	bnzr	%r14
27	stmg	%r2,%r5,32(%r15)
28	stg	%r14,112(%r15)
29	lgr	%r1,%r15
30	aghi	%r15,-160
31	stg	%r1,__SF_BACKCHAIN(%r15)
32	lgr	%r2,%r14
33	lg	%r3,168(%r15)
34	larl	%r14,ftrace_dyn_func
35	lg	%r14,0(%r14)
36	basr	%r14,%r14
37#ifdef CONFIG_FUNCTION_GRAPH_TRACER
38	.globl	ftrace_graph_caller
39ftrace_graph_caller:
40	# This unconditional branch gets runtime patched. Change only if
41	# you know what you are doing. See ftrace_enable_graph_caller().
42	j	0f
43	lg	%r2,272(%r15)
44	lg	%r3,168(%r15)
45	brasl	%r14,prepare_ftrace_return
46	stg	%r2,168(%r15)
470:
48#endif
49	aghi	%r15,160
50	lmg	%r2,%r5,32(%r15)
51	lg	%r14,112(%r15)
52	br	%r14
53
54	.data
55	.globl	ftrace_dyn_func
56ftrace_dyn_func:
57	.quad	ftrace_stub
58	.previous
59
60#else /* CONFIG_DYNAMIC_FTRACE */
61
62	.globl _mcount
63_mcount:
64	larl	%r1,function_trace_stop
65	icm	%r1,0xf,0(%r1)
66	bnzr	%r14
67	stmg	%r2,%r5,32(%r15)
68	stg	%r14,112(%r15)
69	lgr	%r1,%r15
70	aghi	%r15,-160
71	stg	%r1,__SF_BACKCHAIN(%r15)
72	lgr	%r2,%r14
73	lg	%r3,168(%r15)
74	larl	%r14,ftrace_trace_function
75	lg	%r14,0(%r14)
76	basr	%r14,%r14
77#ifdef CONFIG_FUNCTION_GRAPH_TRACER
78	lg	%r2,272(%r15)
79	lg	%r3,168(%r15)
80	brasl	%r14,prepare_ftrace_return
81	stg	%r2,168(%r15)
82#endif
83	aghi	%r15,160
84	lmg	%r2,%r5,32(%r15)
85	lg	%r14,112(%r15)
86	br	%r14
87
88#endif /* CONFIG_DYNAMIC_FTRACE */
89
90#ifdef CONFIG_FUNCTION_GRAPH_TRACER
91
92	.globl	return_to_handler
93return_to_handler:
94	stmg	%r2,%r5,32(%r15)
95	lgr	%r1,%r15
96	aghi	%r15,-160
97	stg	%r1,__SF_BACKCHAIN(%r15)
98	brasl	%r14,ftrace_return_to_handler
99	aghi	%r15,160
100	lgr	%r14,%r2
101	lmg	%r2,%r5,32(%r15)
102	br	%r14
103
104#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
105
106#else /* CONFIG_64BIT */
107
108#ifdef CONFIG_DYNAMIC_FTRACE
109
110	.globl _mcount
111_mcount:
112	br	%r14
113
114	.globl ftrace_caller
115ftrace_caller:
116	stm	%r2,%r5,16(%r15)
117	bras	%r1,2f
1180:	.long	ftrace_trace_function
1191:	.long	function_trace_stop
1202:	l	%r2,1b-0b(%r1)
121	icm	%r2,0xf,0(%r2)
122	jnz	3f
123	st	%r14,56(%r15)
124	lr	%r0,%r15
125	ahi	%r15,-96
126	l	%r3,100(%r15)
127	la	%r2,0(%r14)
128	st	%r0,__SF_BACKCHAIN(%r15)
129	la	%r3,0(%r3)
130	l	%r14,0b-0b(%r1)
131	l	%r14,0(%r14)
132	basr	%r14,%r14
133#ifdef CONFIG_FUNCTION_GRAPH_TRACER
134	.globl	ftrace_graph_caller
135ftrace_graph_caller:
136	# This unconditional branch gets runtime patched. Change only if
137	# you know what you are doing. See ftrace_enable_graph_caller().
138	j	1f
139	bras	%r1,0f
140	.long	prepare_ftrace_return
1410:	l	%r2,152(%r15)
142	l	%r4,0(%r1)
143	l	%r3,100(%r15)
144	basr	%r14,%r4
145	st	%r2,100(%r15)
1461:
147#endif
148	ahi	%r15,96
149	l	%r14,56(%r15)
1503:	lm	%r2,%r5,16(%r15)
151	br	%r14
152
153	.data
154	.globl	ftrace_dyn_func
155ftrace_dyn_func:
156	.long	ftrace_stub
157	.previous
158
159#else /* CONFIG_DYNAMIC_FTRACE */
160
161	.globl _mcount
162_mcount:
163	stm	%r2,%r5,16(%r15)
164	bras	%r1,2f
1650:	.long	ftrace_trace_function
1661:	.long	function_trace_stop
1672:	l	%r2,1b-0b(%r1)
168	icm	%r2,0xf,0(%r2)
169	jnz	3f
170	st	%r14,56(%r15)
171	lr	%r0,%r15
172	ahi	%r15,-96
173	l	%r3,100(%r15)
174	la	%r2,0(%r14)
175	st	%r0,__SF_BACKCHAIN(%r15)
176	la	%r3,0(%r3)
177	l	%r14,0b-0b(%r1)
178	l	%r14,0(%r14)
179	basr	%r14,%r14
180#ifdef CONFIG_FUNCTION_GRAPH_TRACER
181	bras	%r1,0f
182	.long	prepare_ftrace_return
1830:	l	%r2,152(%r15)
184	l	%r4,0(%r1)
185	l	%r3,100(%r15)
186	basr	%r14,%r4
187	st	%r2,100(%r15)
188#endif
189	ahi	%r15,96
190	l	%r14,56(%r15)
1913:	lm	%r2,%r5,16(%r15)
192	br	%r14
193
194#endif /* CONFIG_DYNAMIC_FTRACE */
195
196#ifdef CONFIG_FUNCTION_GRAPH_TRACER
197
198	.globl	return_to_handler
199return_to_handler:
200	stm	%r2,%r5,16(%r15)
201	st	%r14,56(%r15)
202	lr	%r0,%r15
203	ahi	%r15,-96
204	st	%r0,__SF_BACKCHAIN(%r15)
205	bras	%r1,0f
206	.long	ftrace_return_to_handler
2070:	l	%r2,0b-0b(%r1)
208	basr	%r14,%r2
209	lr	%r14,%r2
210	ahi	%r15,96
211	lm	%r2,%r5,16(%r15)
212	br	%r14
213
214#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
215
216#endif /* CONFIG_64BIT */
217