diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2011-01-05 13:09:03 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2011-01-05 13:09:03 -0500 |
commit | 58daf18cdcab550262a5f4681e1f1e073e21965a (patch) | |
tree | 2096324b947761a567dd451f33664f17ee1de2cd /arch/arm/kernel/entry-common.S | |
parent | aa312be1987d43216e72ffce42bccf6bf81f62ed (diff) | |
parent | 0af85dda39d9b673aca8c0ebae004ea70f3efc93 (diff) |
Merge branch 'clksrc' into devel
Conflicts:
arch/arm/mach-vexpress/v2m.c
arch/arm/plat-omap/counter_32k.c
arch/arm/plat-versatile/Makefile
Diffstat (limited to 'arch/arm/kernel/entry-common.S')
-rw-r--r-- | arch/arm/kernel/entry-common.S | 202 |
1 files changed, 137 insertions, 65 deletions
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 80bf8cd88d7c..1e7b04a40a31 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S | |||
@@ -147,98 +147,170 @@ ENDPROC(ret_from_fork) | |||
147 | #endif | 147 | #endif |
148 | #endif | 148 | #endif |
149 | 149 | ||
150 | #ifdef CONFIG_DYNAMIC_FTRACE | 150 | .macro __mcount suffix |
151 | ENTRY(__gnu_mcount_nc) | 151 | mcount_enter |
152 | mov ip, lr | 152 | ldr r0, =ftrace_trace_function |
153 | ldmia sp!, {lr} | 153 | ldr r2, [r0] |
154 | mov pc, ip | 154 | adr r0, .Lftrace_stub |
155 | ENDPROC(__gnu_mcount_nc) | 155 | cmp r0, r2 |
156 | bne 1f | ||
157 | |||
158 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||
159 | ldr r1, =ftrace_graph_return | ||
160 | ldr r2, [r1] | ||
161 | cmp r0, r2 | ||
162 | bne ftrace_graph_caller\suffix | ||
163 | |||
164 | ldr r1, =ftrace_graph_entry | ||
165 | ldr r2, [r1] | ||
166 | ldr r0, =ftrace_graph_entry_stub | ||
167 | cmp r0, r2 | ||
168 | bne ftrace_graph_caller\suffix | ||
169 | #endif | ||
156 | 170 | ||
157 | ENTRY(ftrace_caller) | 171 | mcount_exit |
158 | stmdb sp!, {r0-r3, lr} | 172 | |
159 | mov r0, lr | 173 | 1: mcount_get_lr r1 @ lr of instrumented func |
174 | mov r0, lr @ instrumented function | ||
175 | sub r0, r0, #MCOUNT_INSN_SIZE | ||
176 | adr lr, BSYM(2f) | ||
177 | mov pc, r2 | ||
178 | 2: mcount_exit | ||
179 | .endm | ||
180 | |||
181 | .macro __ftrace_caller suffix | ||
182 | mcount_enter | ||
183 | |||
184 | mcount_get_lr r1 @ lr of instrumented func | ||
185 | mov r0, lr @ instrumented function | ||
160 | sub r0, r0, #MCOUNT_INSN_SIZE | 186 | sub r0, r0, #MCOUNT_INSN_SIZE |
161 | ldr r1, [sp, #20] | ||
162 | 187 | ||
163 | .global ftrace_call | 188 | .globl ftrace_call\suffix |
164 | ftrace_call: | 189 | ftrace_call\suffix: |
165 | bl ftrace_stub | 190 | bl ftrace_stub |
166 | ldmia sp!, {r0-r3, ip, lr} | 191 | |
167 | mov pc, ip | 192 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER |
168 | ENDPROC(ftrace_caller) | 193 | .globl ftrace_graph_call\suffix |
194 | ftrace_graph_call\suffix: | ||
195 | mov r0, r0 | ||
196 | #endif | ||
197 | |||
198 | mcount_exit | ||
199 | .endm | ||
200 | |||
201 | .macro __ftrace_graph_caller | ||
202 | sub r0, fp, #4 @ &lr of instrumented routine (&parent) | ||
203 | #ifdef CONFIG_DYNAMIC_FTRACE | ||
204 | @ called from __ftrace_caller, saved in mcount_enter | ||
205 | ldr r1, [sp, #16] @ instrumented routine (func) | ||
206 | #else | ||
207 | @ called from __mcount, untouched in lr | ||
208 | mov r1, lr @ instrumented routine (func) | ||
209 | #endif | ||
210 | sub r1, r1, #MCOUNT_INSN_SIZE | ||
211 | mov r2, fp @ frame pointer | ||
212 | bl prepare_ftrace_return | ||
213 | mcount_exit | ||
214 | .endm | ||
169 | 215 | ||
170 | #ifdef CONFIG_OLD_MCOUNT | 216 | #ifdef CONFIG_OLD_MCOUNT |
217 | /* | ||
218 | * mcount | ||
219 | */ | ||
220 | |||
221 | .macro mcount_enter | ||
222 | stmdb sp!, {r0-r3, lr} | ||
223 | .endm | ||
224 | |||
225 | .macro mcount_get_lr reg | ||
226 | ldr \reg, [fp, #-4] | ||
227 | .endm | ||
228 | |||
229 | .macro mcount_exit | ||
230 | ldr lr, [fp, #-4] | ||
231 | ldmia sp!, {r0-r3, pc} | ||
232 | .endm | ||
233 | |||
171 | ENTRY(mcount) | 234 | ENTRY(mcount) |
235 | #ifdef CONFIG_DYNAMIC_FTRACE | ||
172 | stmdb sp!, {lr} | 236 | stmdb sp!, {lr} |
173 | ldr lr, [fp, #-4] | 237 | ldr lr, [fp, #-4] |
174 | ldmia sp!, {pc} | 238 | ldmia sp!, {pc} |
239 | #else | ||
240 | __mcount _old | ||
241 | #endif | ||
175 | ENDPROC(mcount) | 242 | ENDPROC(mcount) |
176 | 243 | ||
244 | #ifdef CONFIG_DYNAMIC_FTRACE | ||
177 | ENTRY(ftrace_caller_old) | 245 | ENTRY(ftrace_caller_old) |
178 | stmdb sp!, {r0-r3, lr} | 246 | __ftrace_caller _old |
179 | ldr r1, [fp, #-4] | ||
180 | mov r0, lr | ||
181 | sub r0, r0, #MCOUNT_INSN_SIZE | ||
182 | |||
183 | .globl ftrace_call_old | ||
184 | ftrace_call_old: | ||
185 | bl ftrace_stub | ||
186 | ldr lr, [fp, #-4] @ restore lr | ||
187 | ldmia sp!, {r0-r3, pc} | ||
188 | ENDPROC(ftrace_caller_old) | 247 | ENDPROC(ftrace_caller_old) |
189 | #endif | 248 | #endif |
190 | 249 | ||
191 | #else | 250 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER |
251 | ENTRY(ftrace_graph_caller_old) | ||
252 | __ftrace_graph_caller | ||
253 | ENDPROC(ftrace_graph_caller_old) | ||
254 | #endif | ||
192 | 255 | ||
193 | ENTRY(__gnu_mcount_nc) | 256 | .purgem mcount_enter |
257 | .purgem mcount_get_lr | ||
258 | .purgem mcount_exit | ||
259 | #endif | ||
260 | |||
261 | /* | ||
262 | * __gnu_mcount_nc | ||
263 | */ | ||
264 | |||
265 | .macro mcount_enter | ||
194 | stmdb sp!, {r0-r3, lr} | 266 | stmdb sp!, {r0-r3, lr} |
195 | ldr r0, =ftrace_trace_function | 267 | .endm |
196 | ldr r2, [r0] | 268 | |
197 | adr r0, .Lftrace_stub | 269 | .macro mcount_get_lr reg |
198 | cmp r0, r2 | 270 | ldr \reg, [sp, #20] |
199 | bne gnu_trace | 271 | .endm |
272 | |||
273 | .macro mcount_exit | ||
200 | ldmia sp!, {r0-r3, ip, lr} | 274 | ldmia sp!, {r0-r3, ip, lr} |
201 | mov pc, ip | 275 | mov pc, ip |
276 | .endm | ||
202 | 277 | ||
203 | gnu_trace: | 278 | ENTRY(__gnu_mcount_nc) |
204 | ldr r1, [sp, #20] @ lr of instrumented routine | 279 | #ifdef CONFIG_DYNAMIC_FTRACE |
205 | mov r0, lr | 280 | mov ip, lr |
206 | sub r0, r0, #MCOUNT_INSN_SIZE | 281 | ldmia sp!, {lr} |
207 | adr lr, BSYM(1f) | ||
208 | mov pc, r2 | ||
209 | 1: | ||
210 | ldmia sp!, {r0-r3, ip, lr} | ||
211 | mov pc, ip | 282 | mov pc, ip |
283 | #else | ||
284 | __mcount | ||
285 | #endif | ||
212 | ENDPROC(__gnu_mcount_nc) | 286 | ENDPROC(__gnu_mcount_nc) |
213 | 287 | ||
214 | #ifdef CONFIG_OLD_MCOUNT | 288 | #ifdef CONFIG_DYNAMIC_FTRACE |
215 | /* | 289 | ENTRY(ftrace_caller) |
216 | * This is under an ifdef in order to force link-time errors for people trying | 290 | __ftrace_caller |
217 | * to build with !FRAME_POINTER with a GCC which doesn't use the new-style | 291 | ENDPROC(ftrace_caller) |
218 | * mcount. | 292 | #endif |
219 | */ | ||
220 | ENTRY(mcount) | ||
221 | stmdb sp!, {r0-r3, lr} | ||
222 | ldr r0, =ftrace_trace_function | ||
223 | ldr r2, [r0] | ||
224 | adr r0, ftrace_stub | ||
225 | cmp r0, r2 | ||
226 | bne trace | ||
227 | ldr lr, [fp, #-4] @ restore lr | ||
228 | ldmia sp!, {r0-r3, pc} | ||
229 | 293 | ||
230 | trace: | 294 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER |
231 | ldr r1, [fp, #-4] @ lr of instrumented routine | 295 | ENTRY(ftrace_graph_caller) |
232 | mov r0, lr | 296 | __ftrace_graph_caller |
233 | sub r0, r0, #MCOUNT_INSN_SIZE | 297 | ENDPROC(ftrace_graph_caller) |
234 | mov lr, pc | ||
235 | mov pc, r2 | ||
236 | ldr lr, [fp, #-4] @ restore lr | ||
237 | ldmia sp!, {r0-r3, pc} | ||
238 | ENDPROC(mcount) | ||
239 | #endif | 298 | #endif |
240 | 299 | ||
241 | #endif /* CONFIG_DYNAMIC_FTRACE */ | 300 | .purgem mcount_enter |
301 | .purgem mcount_get_lr | ||
302 | .purgem mcount_exit | ||
303 | |||
304 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||
305 | .globl return_to_handler | ||
306 | return_to_handler: | ||
307 | stmdb sp!, {r0-r3} | ||
308 | mov r0, fp @ frame pointer | ||
309 | bl ftrace_return_to_handler | ||
310 | mov lr, r0 @ r0 has real ret addr | ||
311 | ldmia sp!, {r0-r3} | ||
312 | mov pc, lr | ||
313 | #endif | ||
242 | 314 | ||
243 | ENTRY(ftrace_stub) | 315 | ENTRY(ftrace_stub) |
244 | .Lftrace_stub: | 316 | .Lftrace_stub: |