diff options
| author | Rabin Vincent <rabin@rab.in> | 2010-08-10 14:37:21 -0400 |
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-09-02 10:26:12 -0400 |
| commit | a3ba87a614992500cf2c47e6f788e74a971ce91f (patch) | |
| tree | 5b644570cf2d93e6216a0c308e1fbf72efda2913 | |
| parent | 72fa62fa5dff0e2e06491dd99c429adb137f299b (diff) | |
ARM: 6316/1: ftrace: add Thumb-2 support
Fix the mcount routines to build and run on a kernel built with the
Thumb-2 instruction set by correcting the following errors using the
fixes suggested by Catalin Marinas:
- Problem: The following assembler errors appear at the "adr r0,
ftrace_stub" instruction:
entry-common.S: Assembler messages:
entry-common.S:179: Error: invalid immediate for address calculation (value = 0x00000004)
Fix: The errors don't occur with a non-global symbol, so use one.
- Problem: The "mov lr, pc" does not set the lsb when storing the pc in
lr. The called function returns with "bx lr", and the mode changes
to ARM.
Fix: Add a label on the return address and use "adr lr, BSYM(label)".
We don't modify the old mcount because it won't be built when using
Thumb-2.
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Rabin Vincent <rabin@rab.in>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
| -rw-r--r-- | arch/arm/kernel/entry-common.S | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index c7a8c208a45c..f5e75de0203e 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S | |||
| @@ -167,7 +167,7 @@ ENTRY(__gnu_mcount_nc) | |||
| 167 | stmdb sp!, {r0-r3, lr} | 167 | stmdb sp!, {r0-r3, lr} |
| 168 | ldr r0, =ftrace_trace_function | 168 | ldr r0, =ftrace_trace_function |
| 169 | ldr r2, [r0] | 169 | ldr r2, [r0] |
| 170 | adr r0, ftrace_stub | 170 | adr r0, .Lftrace_stub |
| 171 | cmp r0, r2 | 171 | cmp r0, r2 |
| 172 | bne gnu_trace | 172 | bne gnu_trace |
| 173 | ldmia sp!, {r0-r3, ip, lr} | 173 | ldmia sp!, {r0-r3, ip, lr} |
| @@ -177,8 +177,9 @@ gnu_trace: | |||
| 177 | ldr r1, [sp, #20] @ lr of instrumented routine | 177 | ldr r1, [sp, #20] @ lr of instrumented routine |
| 178 | mov r0, lr | 178 | mov r0, lr |
| 179 | sub r0, r0, #MCOUNT_INSN_SIZE | 179 | sub r0, r0, #MCOUNT_INSN_SIZE |
| 180 | mov lr, pc | 180 | adr lr, BSYM(1f) |
| 181 | mov pc, r2 | 181 | mov pc, r2 |
| 182 | 1: | ||
| 182 | ldmia sp!, {r0-r3, ip, lr} | 183 | ldmia sp!, {r0-r3, ip, lr} |
| 183 | mov pc, ip | 184 | mov pc, ip |
| 184 | ENDPROC(__gnu_mcount_nc) | 185 | ENDPROC(__gnu_mcount_nc) |
| @@ -213,6 +214,7 @@ ENDPROC(mcount) | |||
| 213 | #endif /* CONFIG_DYNAMIC_FTRACE */ | 214 | #endif /* CONFIG_DYNAMIC_FTRACE */ |
| 214 | 215 | ||
| 215 | ENTRY(ftrace_stub) | 216 | ENTRY(ftrace_stub) |
| 217 | .Lftrace_stub: | ||
| 216 | mov pc, lr | 218 | mov pc, lr |
| 217 | ENDPROC(ftrace_stub) | 219 | ENDPROC(ftrace_stub) |
| 218 | 220 | ||
