Эх сурвалжийг харах

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: Catalin Marinas <catalin.marinas@arm.com>
Acked-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Rabin Vincent <rabin@rab.in>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Rabin Vincent 15 жил өмнө
parent
commit
09bfafac3e

+ 5 - 0
arch/arm/Kconfig.debug

@@ -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

+ 2 - 0
arch/arm/kernel/armksyms.c

@@ -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

+ 14 - 0
arch/arm/kernel/entry-common.S

@@ -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:
 	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:
 	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 */
 
 

+ 1 - 1
kernel/trace/Kconfig

@@ -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