ARM: ftrace: use gas macros to avoid code duplication
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>
This commit is contained in:
@@ -141,98 +141,112 @@ ENDPROC(ret_from_fork)
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
.macro __mcount suffix
|
||||||
ENTRY(__gnu_mcount_nc)
|
mcount_enter
|
||||||
mov ip, lr
|
|
||||||
ldmia sp!, {lr}
|
|
||||||
mov pc, ip
|
|
||||||
ENDPROC(__gnu_mcount_nc)
|
|
||||||
|
|
||||||
ENTRY(ftrace_caller)
|
|
||||||
stmdb sp!, {r0-r3, lr}
|
|
||||||
mov r0, lr
|
|
||||||
sub r0, r0, #MCOUNT_INSN_SIZE
|
|
||||||
ldr r1, [sp, #20]
|
|
||||||
|
|
||||||
.global ftrace_call
|
|
||||||
ftrace_call:
|
|
||||||
bl ftrace_stub
|
|
||||||
ldmia sp!, {r0-r3, ip, lr}
|
|
||||||
mov pc, ip
|
|
||||||
ENDPROC(ftrace_caller)
|
|
||||||
|
|
||||||
#ifdef CONFIG_OLD_MCOUNT
|
|
||||||
ENTRY(mcount)
|
|
||||||
stmdb sp!, {lr}
|
|
||||||
ldr lr, [fp, #-4]
|
|
||||||
ldmia sp!, {pc}
|
|
||||||
ENDPROC(mcount)
|
|
||||||
|
|
||||||
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}
|
|
||||||
ENDPROC(ftrace_caller_old)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
ENTRY(__gnu_mcount_nc)
|
|
||||||
stmdb sp!, {r0-r3, lr}
|
|
||||||
ldr r0, =ftrace_trace_function
|
ldr r0, =ftrace_trace_function
|
||||||
ldr r2, [r0]
|
ldr r2, [r0]
|
||||||
adr r0, .Lftrace_stub
|
adr r0, .Lftrace_stub
|
||||||
cmp r0, r2
|
cmp r0, r2
|
||||||
bne gnu_trace
|
bne 1f
|
||||||
ldmia sp!, {r0-r3, ip, lr}
|
mcount_exit
|
||||||
mov pc, ip
|
|
||||||
|
|
||||||
gnu_trace:
|
1: mcount_get_lr r1 @ lr of instrumented func
|
||||||
ldr r1, [sp, #20] @ lr of instrumented routine
|
mov r0, lr @ instrumented function
|
||||||
mov r0, lr
|
|
||||||
sub r0, r0, #MCOUNT_INSN_SIZE
|
sub r0, r0, #MCOUNT_INSN_SIZE
|
||||||
adr lr, BSYM(1f)
|
adr lr, BSYM(2f)
|
||||||
mov pc, r2
|
mov pc, r2
|
||||||
1:
|
2: mcount_exit
|
||||||
ldmia sp!, {r0-r3, ip, lr}
|
.endm
|
||||||
mov pc, ip
|
|
||||||
ENDPROC(__gnu_mcount_nc)
|
.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
|
||||||
|
|
||||||
|
.globl ftrace_call\suffix
|
||||||
|
ftrace_call\suffix:
|
||||||
|
bl ftrace_stub
|
||||||
|
|
||||||
|
mcount_exit
|
||||||
|
.endm
|
||||||
|
|
||||||
#ifdef CONFIG_OLD_MCOUNT
|
#ifdef CONFIG_OLD_MCOUNT
|
||||||
/*
|
/*
|
||||||
* This is under an ifdef in order to force link-time errors for people trying
|
* mcount
|
||||||
* 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:
|
.macro mcount_enter
|
||||||
ldr r1, [fp, #-4] @ lr of instrumented routine
|
stmdb sp!, {r0-r3, lr}
|
||||||
mov r0, lr
|
.endm
|
||||||
sub r0, r0, #MCOUNT_INSN_SIZE
|
|
||||||
mov lr, pc
|
.macro mcount_get_lr reg
|
||||||
mov pc, r2
|
ldr \reg, [fp, #-4]
|
||||||
ldr lr, [fp, #-4] @ restore lr
|
.endm
|
||||||
|
|
||||||
|
.macro mcount_exit
|
||||||
|
ldr lr, [fp, #-4]
|
||||||
ldmia sp!, {r0-r3, pc}
|
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)
|
ENDPROC(mcount)
|
||||||
|
|
||||||
|
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||||
|
ENTRY(ftrace_caller_old)
|
||||||
|
__ftrace_caller _old
|
||||||
|
ENDPROC(ftrace_caller_old)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* CONFIG_DYNAMIC_FTRACE */
|
.purgem mcount_enter
|
||||||
|
.purgem mcount_get_lr
|
||||||
|
.purgem mcount_exit
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* __gnu_mcount_nc
|
||||||
|
*/
|
||||||
|
|
||||||
|
.macro mcount_enter
|
||||||
|
stmdb sp!, {r0-r3, lr}
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro mcount_get_lr reg
|
||||||
|
ldr \reg, [sp, #20]
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro mcount_exit
|
||||||
|
ldmia sp!, {r0-r3, ip, lr}
|
||||||
|
mov pc, ip
|
||||||
|
.endm
|
||||||
|
|
||||||
|
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_DYNAMIC_FTRACE
|
||||||
|
ENTRY(ftrace_caller)
|
||||||
|
__ftrace_caller
|
||||||
|
ENDPROC(ftrace_caller)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
.purgem mcount_enter
|
||||||
|
.purgem mcount_get_lr
|
||||||
|
.purgem mcount_exit
|
||||||
|
|
||||||
ENTRY(ftrace_stub)
|
ENTRY(ftrace_stub)
|
||||||
.Lftrace_stub:
|
.Lftrace_stub:
|
||||||
|
|||||||
Reference in New Issue
Block a user