diff options
Diffstat (limited to 'arch/s390/kernel/mcount.S')
-rw-r--r-- | arch/s390/kernel/mcount.S | 212 |
1 files changed, 185 insertions, 27 deletions
diff --git a/arch/s390/kernel/mcount.S b/arch/s390/kernel/mcount.S index 80641224a095..2a0a5e97ba8c 100644 --- a/arch/s390/kernel/mcount.S +++ b/arch/s390/kernel/mcount.S | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright IBM Corp. 2008 | 2 | * Copyright IBM Corp. 2008,2009 |
3 | * | 3 | * |
4 | * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>, | 4 | * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>, |
5 | * | 5 | * |
@@ -7,36 +7,64 @@ | |||
7 | 7 | ||
8 | #include <asm/asm-offsets.h> | 8 | #include <asm/asm-offsets.h> |
9 | 9 | ||
10 | #ifndef CONFIG_64BIT | 10 | .globl ftrace_stub |
11 | .globl _mcount | 11 | ftrace_stub: |
12 | br %r14 | ||
13 | |||
14 | #ifdef CONFIG_64BIT | ||
15 | |||
16 | #ifdef CONFIG_DYNAMIC_FTRACE | ||
17 | |||
18 | .globl _mcount | ||
12 | _mcount: | 19 | _mcount: |
13 | stm %r0,%r5,8(%r15) | ||
14 | st %r14,56(%r15) | ||
15 | lr %r1,%r15 | ||
16 | ahi %r15,-96 | ||
17 | l %r3,100(%r15) | ||
18 | la %r2,0(%r14) | ||
19 | st %r1,__SF_BACKCHAIN(%r15) | ||
20 | la %r3,0(%r3) | ||
21 | bras %r14,0f | ||
22 | .long ftrace_trace_function | ||
23 | 0: l %r14,0(%r14) | ||
24 | l %r14,0(%r14) | ||
25 | basr %r14,%r14 | ||
26 | ahi %r15,96 | ||
27 | lm %r0,%r5,8(%r15) | ||
28 | l %r14,56(%r15) | ||
29 | br %r14 | 20 | br %r14 |
30 | 21 | ||
31 | .globl ftrace_stub | 22 | .globl ftrace_caller |
32 | ftrace_stub: | 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) | ||
33 | br %r14 | 52 | br %r14 |
34 | 53 | ||
35 | #else /* CONFIG_64BIT */ | 54 | .data |
55 | .globl ftrace_dyn_func | ||
56 | ftrace_dyn_func: | ||
57 | .quad ftrace_stub | ||
58 | .previous | ||
59 | |||
60 | #else /* CONFIG_DYNAMIC_FTRACE */ | ||
36 | 61 | ||
37 | .globl _mcount | 62 | .globl _mcount |
38 | _mcount: | 63 | _mcount: |
39 | stmg %r0,%r5,16(%r15) | 64 | larl %r1,function_trace_stop |
65 | icm %r1,0xf,0(%r1) | ||
66 | bnzr %r14 | ||
67 | stmg %r2,%r5,32(%r15) | ||
40 | stg %r14,112(%r15) | 68 | stg %r14,112(%r15) |
41 | lgr %r1,%r15 | 69 | lgr %r1,%r15 |
42 | aghi %r15,-160 | 70 | aghi %r15,-160 |
@@ -46,13 +74,143 @@ _mcount: | |||
46 | larl %r14,ftrace_trace_function | 74 | larl %r14,ftrace_trace_function |
47 | lg %r14,0(%r14) | 75 | lg %r14,0(%r14) |
48 | basr %r14,%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 | ||
49 | aghi %r15,160 | 83 | aghi %r15,160 |
50 | lmg %r0,%r5,16(%r15) | 84 | lmg %r2,%r5,32(%r15) |
51 | lg %r14,112(%r15) | 85 | lg %r14,112(%r15) |
52 | br %r14 | 86 | br %r14 |
53 | 87 | ||
54 | .globl ftrace_stub | 88 | #endif /* CONFIG_DYNAMIC_FTRACE */ |
55 | ftrace_stub: | 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) | ||
56 | br %r14 | 151 | br %r14 |
57 | 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 | |||
58 | #endif /* CONFIG_64BIT */ | 216 | #endif /* CONFIG_64BIT */ |