提交 09bfafac 编写于 作者: R Rabin Vincent 提交者: Russell King

ARM: 6314/1: ftrace: allow build without frame pointers on ARM

With a new enough GCC, ARM function tracing can be supported without the
need for frame pointers.  This is essential for Thumb-2 support, since
frame pointers aren't available then.
Acked-by: NCatalin Marinas <catalin.marinas@arm.com>
Acked-by: NSteven Rostedt <rostedt@goodmis.org>
Signed-off-by: NRabin Vincent <rabin@rab.in>
Signed-off-by: NRussell King <rmk+kernel@arm.linux.org.uk>
上级 7e9501fd
...@@ -27,6 +27,11 @@ config ARM_UNWIND ...@@ -27,6 +27,11 @@ config ARM_UNWIND
the performance is not affected. Currently, this feature the performance is not affected. Currently, this feature
only works with EABI compilers. If unsure say Y. only works with EABI compilers. If unsure say Y.
config OLD_MCOUNT
bool
depends on FUNCTION_TRACER && FRAME_POINTER
default y
config DEBUG_USER config DEBUG_USER
bool "Verbose user fault messages" bool "Verbose user fault messages"
help help
......
...@@ -165,6 +165,8 @@ EXPORT_SYMBOL(_find_next_bit_be); ...@@ -165,6 +165,8 @@ EXPORT_SYMBOL(_find_next_bit_be);
#endif #endif
#ifdef CONFIG_FUNCTION_TRACER #ifdef CONFIG_FUNCTION_TRACER
#ifdef CONFIG_OLD_MCOUNT
EXPORT_SYMBOL(mcount); EXPORT_SYMBOL(mcount);
#endif
EXPORT_SYMBOL(__gnu_mcount_nc); EXPORT_SYMBOL(__gnu_mcount_nc);
#endif #endif
...@@ -128,6 +128,13 @@ ENDPROC(ret_from_fork) ...@@ -128,6 +128,13 @@ ENDPROC(ret_from_fork)
* allows it to be clobbered in subroutines and doesn't use it to hold * allows it to be clobbered in subroutines and doesn't use it to hold
* parameters.) * parameters.)
*/ */
#ifndef CONFIG_OLD_MCOUNT
#if (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 4))
#error Ftrace requires CONFIG_FRAME_POINTER=y with GCC older than 4.4.0.
#endif
#endif
#ifdef CONFIG_DYNAMIC_FTRACE #ifdef CONFIG_DYNAMIC_FTRACE
ENTRY(mcount) ENTRY(mcount)
stmdb sp!, {r0-r3, lr} stmdb sp!, {r0-r3, lr}
...@@ -173,6 +180,12 @@ gnu_trace: ...@@ -173,6 +180,12 @@ gnu_trace:
ldmia sp!, {r0-r3, ip, lr} ldmia sp!, {r0-r3, ip, lr}
mov pc, ip mov pc, ip
#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) ENTRY(mcount)
stmdb sp!, {r0-r3, lr} stmdb sp!, {r0-r3, lr}
ldr r0, =ftrace_trace_function ldr r0, =ftrace_trace_function
...@@ -191,6 +204,7 @@ trace: ...@@ -191,6 +204,7 @@ trace:
mov pc, r2 mov pc, r2
ldr lr, [fp, #-4] @ restore lr ldr lr, [fp, #-4] @ restore lr
ldmia sp!, {r0-r3, pc} ldmia sp!, {r0-r3, pc}
#endif
#endif /* CONFIG_DYNAMIC_FTRACE */ #endif /* CONFIG_DYNAMIC_FTRACE */
......
...@@ -121,7 +121,7 @@ if FTRACE ...@@ -121,7 +121,7 @@ if FTRACE
config FUNCTION_TRACER config FUNCTION_TRACER
bool "Kernel Function Tracer" bool "Kernel Function Tracer"
depends on HAVE_FUNCTION_TRACER depends on HAVE_FUNCTION_TRACER
select FRAME_POINTER select FRAME_POINTER if (!ARM_UNWIND)
select KALLSYMS select KALLSYMS
select GENERIC_TRACER select GENERIC_TRACER
select CONTEXT_SWITCH_TRACER select CONTEXT_SWITCH_TRACER
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册