Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[linux-2.6] / arch / s390 / kernel / mcount.S
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
11 ftrace_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
23 ftrace_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
39 ftrace_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)
47 0:
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
56 ftrace_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
93 return_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
115 ftrace_caller:
116         stm     %r2,%r5,16(%r15)
117         bras    %r1,2f
118 0:      .long   ftrace_trace_function
119 1:      .long   function_trace_stop
120 2:      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
135 ftrace_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
141 0:      l       %r2,152(%r15)
142         l       %r4,0(%r1)
143         l       %r3,100(%r15)
144         basr    %r14,%r4
145         st      %r2,100(%r15)
146 1:
147 #endif
148         ahi     %r15,96
149         l       %r14,56(%r15)
150 3:      lm      %r2,%r5,16(%r15)
151         br      %r14
152
153         .data
154         .globl  ftrace_dyn_func
155 ftrace_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
165 0:      .long   ftrace_trace_function
166 1:      .long   function_trace_stop
167 2:      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
183 0:      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)
191 3:      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
199 return_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
207 0:      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 */