blob: 2a0a5e97ba8c2a6f954c2209a1836fe70d92ac0f [file] [log] [blame]
Heiko Carstens5d360a72008-12-25 13:38:56 +01001/*
Heiko Carstensdfd9f7a2009-06-12 10:26:44 +02002 * Copyright IBM Corp. 2008,2009
Heiko Carstens5d360a72008-12-25 13:38:56 +01003 *
4 * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>,
5 *
6 */
7
Heiko Carstenscf087342009-03-18 13:27:34 +01008#include <asm/asm-offsets.h>
9
Heiko Carstensdfd9f7a2009-06-12 10:26:44 +020010 .globl ftrace_stub
11ftrace_stub:
12 br %r14
13
14#ifdef CONFIG_64BIT
15
16#ifdef CONFIG_DYNAMIC_FTRACE
17
18 .globl _mcount
Heiko Carstens5d360a72008-12-25 13:38:56 +010019_mcount:
Heiko Carstensdfd9f7a2009-06-12 10:26:44 +020020 br %r14
21
22 .globl ftrace_caller
23ftrace_caller:
Heiko Carstens8b4488f2009-06-12 10:26:45 +020024 larl %r1,function_trace_stop
25 icm %r1,0xf,0(%r1)
26 bnzr %r14
Heiko Carstensdfd9f7a2009-06-12 10:26:44 +020027 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
Heiko Carstens88dbd202009-06-12 10:26:46 +020037#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
Heiko Carstensdfd9f7a2009-06-12 10:26:44 +020049 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:
Heiko Carstens8b4488f2009-06-12 10:26:45 +020064 larl %r1,function_trace_stop
65 icm %r1,0xf,0(%r1)
66 bnzr %r14
Heiko Carstensdfd9f7a2009-06-12 10:26:44 +020067 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
Heiko Carstens88dbd202009-06-12 10:26:46 +020077#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
Heiko Carstensdfd9f7a2009-06-12 10:26:44 +020083 aghi %r15,160
84 lmg %r2,%r5,32(%r15)
85 lg %r14,112(%r15)
86 br %r14
87
88#endif /* CONFIG_DYNAMIC_FTRACE */
89
Heiko Carstens88dbd202009-06-12 10:26:46 +020090#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
Heiko Carstensdfd9f7a2009-06-12 10:26:44 +0200106#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)
Heiko Carstens8b4488f2009-06-12 10:26:45 +0200117 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
Heiko Carstensdfd9f7a2009-06-12 10:26:44 +0200123 st %r14,56(%r15)
Heiko Carstens8b4488f2009-06-12 10:26:45 +0200124 lr %r0,%r15
Heiko Carstensdfd9f7a2009-06-12 10:26:44 +0200125 ahi %r15,-96
126 l %r3,100(%r15)
127 la %r2,0(%r14)
Heiko Carstens8b4488f2009-06-12 10:26:45 +0200128 st %r0,__SF_BACKCHAIN(%r15)
Heiko Carstensdfd9f7a2009-06-12 10:26:44 +0200129 la %r3,0(%r3)
Heiko Carstens8b4488f2009-06-12 10:26:45 +0200130 l %r14,0b-0b(%r1)
Heiko Carstensdfd9f7a2009-06-12 10:26:44 +0200131 l %r14,0(%r14)
132 basr %r14,%r14
Heiko Carstens88dbd202009-06-12 10:26:46 +0200133#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
Heiko Carstensdfd9f7a2009-06-12 10:26:44 +0200148 ahi %r15,96
Heiko Carstensdfd9f7a2009-06-12 10:26:44 +0200149 l %r14,56(%r15)
Heiko Carstens8b4488f2009-06-12 10:26:45 +02001503: lm %r2,%r5,16(%r15)
Heiko Carstensdfd9f7a2009-06-12 10:26:44 +0200151 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)
Heiko Carstens8b4488f2009-06-12 10:26:45 +0200164 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
Heiko Carstens5d360a72008-12-25 13:38:56 +0100170 st %r14,56(%r15)
Heiko Carstens8b4488f2009-06-12 10:26:45 +0200171 lr %r0,%r15
Heiko Carstens5d360a72008-12-25 13:38:56 +0100172 ahi %r15,-96
173 l %r3,100(%r15)
174 la %r2,0(%r14)
Heiko Carstens8b4488f2009-06-12 10:26:45 +0200175 st %r0,__SF_BACKCHAIN(%r15)
Heiko Carstens5d360a72008-12-25 13:38:56 +0100176 la %r3,0(%r3)
Heiko Carstens8b4488f2009-06-12 10:26:45 +0200177 l %r14,0b-0b(%r1)
Heiko Carstens5d360a72008-12-25 13:38:56 +0100178 l %r14,0(%r14)
179 basr %r14,%r14
Heiko Carstens88dbd202009-06-12 10:26:46 +0200180#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
Heiko Carstens5d360a72008-12-25 13:38:56 +0100189 ahi %r15,96
Heiko Carstens5d360a72008-12-25 13:38:56 +0100190 l %r14,56(%r15)
Heiko Carstens8b4488f2009-06-12 10:26:45 +02001913: lm %r2,%r5,16(%r15)
Heiko Carstens5d360a72008-12-25 13:38:56 +0100192 br %r14
193
Heiko Carstensdfd9f7a2009-06-12 10:26:44 +0200194#endif /* CONFIG_DYNAMIC_FTRACE */
Heiko Carstens88dbd202009-06-12 10:26:46 +0200195
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
Heiko Carstens5d360a72008-12-25 13:38:56 +0100216#endif /* CONFIG_64BIT */