ARM: ftrace: use gas macros to avoid code duplication
Rabin Vincent [Thu, 7 Oct 2010 12:09:47 +0000 (17:09 +0530)]
Use assembler macros to avoid copy/pasting code between the
implementations of the two variants of the mcount call.

Signed-off-by: Rabin Vincent <rabin@rab.in>

arch/arm/kernel/entry-common.S

index 8bfa987..fe1d586 100644 (file)
@@ -141,98 +141,112 @@ ENDPROC(ret_from_fork)
 #endif
 #endif
 
-#ifdef CONFIG_DYNAMIC_FTRACE
-ENTRY(__gnu_mcount_nc)
-       mov     ip, lr
-       ldmia   sp!, {lr}
-       mov     pc, ip
-ENDPROC(__gnu_mcount_nc)
+.macro __mcount suffix
+       mcount_enter
+       ldr     r0, =ftrace_trace_function
+       ldr     r2, [r0]
+       adr     r0, .Lftrace_stub
+       cmp     r0, r2
+       bne     1f
+       mcount_exit
 
-ENTRY(ftrace_caller)
-       stmdb   sp!, {r0-r3, lr}
-       mov     r0, lr
+1:     mcount_get_lr   r1                      @ lr of instrumented func
+       mov     r0, lr                          @ instrumented function
+       sub     r0, r0, #MCOUNT_INSN_SIZE
+       adr     lr, BSYM(2f)
+       mov     pc, r2
+2:     mcount_exit
+.endm
+
+.macro __ftrace_caller suffix
+       mcount_enter
+
+       mcount_get_lr   r1                      @ lr of instrumented func
+       mov     r0, lr                          @ instrumented function
        sub     r0, r0, #MCOUNT_INSN_SIZE
-       ldr     r1, [sp, #20]
 
-       .global ftrace_call
-ftrace_call:
+       .globl ftrace_call\suffix
+ftrace_call\suffix:
        bl      ftrace_stub
-       ldmia   sp!, {r0-r3, ip, lr}
-       mov     pc, ip
-ENDPROC(ftrace_caller)
+
+       mcount_exit
+.endm
 
 #ifdef CONFIG_OLD_MCOUNT
+/*
+ * mcount
+ */
+
+.macro mcount_enter
+       stmdb   sp!, {r0-r3, lr}
+.endm
+
+.macro mcount_get_lr reg
+       ldr     \reg, [fp, #-4]
+.endm
+
+.macro mcount_exit
+       ldr     lr, [fp, #-4]
+       ldmia   sp!, {r0-r3, pc}
+.endm
+
 ENTRY(mcount)
+#ifdef CONFIG_DYNAMIC_FTRACE
        stmdb   sp!, {lr}
        ldr     lr, [fp, #-4]
        ldmia   sp!, {pc}
+#else
+       __mcount _old
+#endif
 ENDPROC(mcount)
 
+#ifdef CONFIG_DYNAMIC_FTRACE
 ENTRY(ftrace_caller_old)
-       stmdb   sp!, {r0-r3, lr}
-       ldr     r1, [fp, #-4]
-       mov     r0, lr
-       sub     r0, r0, #MCOUNT_INSN_SIZE
-
-       .globl ftrace_call_old
-ftrace_call_old:
-       bl      ftrace_stub
-       ldr     lr, [fp, #-4]                   @ restore lr
-       ldmia   sp!, {r0-r3, pc}
+       __ftrace_caller _old
 ENDPROC(ftrace_caller_old)
 #endif
 
-#else
+.purgem mcount_enter
+.purgem mcount_get_lr
+.purgem mcount_exit
+#endif
 
-ENTRY(__gnu_mcount_nc)
+/*
+ * __gnu_mcount_nc
+ */
+
+.macro mcount_enter
        stmdb   sp!, {r0-r3, lr}
-       ldr     r0, =ftrace_trace_function
-       ldr     r2, [r0]
-       adr     r0, .Lftrace_stub
-       cmp     r0, r2
-       bne     gnu_trace
+.endm
+
+.macro mcount_get_lr reg
+       ldr     \reg, [sp, #20]
+.endm
+
+.macro mcount_exit
        ldmia   sp!, {r0-r3, ip, lr}
        mov     pc, ip
+.endm
 
-gnu_trace:
-       ldr     r1, [sp, #20]                   @ lr of instrumented routine
-       mov     r0, lr
-       sub     r0, r0, #MCOUNT_INSN_SIZE
-       adr     lr, BSYM(1f)
-       mov     pc, r2
-1:
-       ldmia   sp!, {r0-r3, ip, lr}
+ENTRY(__gnu_mcount_nc)
+#ifdef CONFIG_DYNAMIC_FTRACE
+       mov     ip, lr
+       ldmia   sp!, {lr}
        mov     pc, ip
+#else
+       __mcount
+#endif
 ENDPROC(__gnu_mcount_nc)
 
-#ifdef CONFIG_OLD_MCOUNT
-/*
- * This is under an ifdef in order to force link-time errors for people trying
- * to build with !FRAME_POINTER with a GCC which doesn't use the new-style
- * mcount.
- */
-ENTRY(mcount)
-       stmdb   sp!, {r0-r3, lr}
-       ldr     r0, =ftrace_trace_function
-       ldr     r2, [r0]
-       adr     r0, ftrace_stub
-       cmp     r0, r2
-       bne     trace
-       ldr     lr, [fp, #-4]                   @ restore lr
-       ldmia   sp!, {r0-r3, pc}
-
-trace:
-       ldr     r1, [fp, #-4]                   @ lr of instrumented routine
-       mov     r0, lr
-       sub     r0, r0, #MCOUNT_INSN_SIZE
-       mov     lr, pc
-       mov     pc, r2
-       ldr     lr, [fp, #-4]                   @ restore lr
-       ldmia   sp!, {r0-r3, pc}
-ENDPROC(mcount)
+#ifdef CONFIG_DYNAMIC_FTRACE
+ENTRY(ftrace_caller)
+       __ftrace_caller
+ENDPROC(ftrace_caller)
 #endif
 
-#endif /* CONFIG_DYNAMIC_FTRACE */
+.purgem mcount_enter
+.purgem mcount_get_lr
+.purgem mcount_exit
 
 ENTRY(ftrace_stub)
 .Lftrace_stub: