ARM: 8800/1: use choice for kernel unwinders
authorStefan Agner <stefan@agner.ch>
Sun, 30 Sep 2018 22:02:33 +0000 (23:02 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 22 Dec 2021 08:18:01 +0000 (09:18 +0100)
commit f9b58e8c7d031b0daa5c9a9ee27f5a4028ba53ac upstream.

While in theory multiple unwinders could be compiled in, it does
not make sense in practise. Use a choice to make the unwinder
selection mutually exclusive and mandatory.

Already before this commit it has not been possible to deselect
FRAME_POINTER. Remove the obsolete comment.

Furthermore, to produce a meaningful backtrace with FRAME_POINTER
enabled the kernel needs a specific function prologue:
    mov    ip, sp
    stmfd    sp!, {fp, ip, lr, pc}
    sub    fp, ip, #4

To get to the required prologue gcc uses apcs and no-sched-prolog.
This compiler options are not available on clang, and clang is not
able to generate the required prologue. Make the FRAME_POINTER
config symbol depending on !clang.

Suggested-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Stefan Agner <stefan@agner.ch>
Reviewed-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: Anders Roxell <anders.roxell@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/arm/Kconfig.debug
lib/Kconfig.debug

index b14f154919a5d67c3e9227d647dd39c7ab149677..d6cf18a0cb0a93d8ecd00494fdfa8fdbfc765d40 100644 (file)
@@ -16,30 +16,42 @@ config ARM_PTDUMP
          kernel.
          If in doubt, say "N"
 
-# RMK wants arm kernels compiled with frame pointers or stack unwinding.
-# If you know what you are doing and are willing to live without stack
-# traces, you can get a slightly smaller kernel by setting this option to
-# n, but then RMK will have to kill you ;).
-config FRAME_POINTER
-       bool
-       depends on !THUMB2_KERNEL
-       default y if !ARM_UNWIND || FUNCTION_GRAPH_TRACER
+choice
+       prompt "Choose kernel unwinder"
+       default UNWINDER_ARM if AEABI && !FUNCTION_GRAPH_TRACER
+       default UNWINDER_FRAME_POINTER if !AEABI || FUNCTION_GRAPH_TRACER
+       help
+         This determines which method will be used for unwinding kernel stack
+         traces for panics, oopses, bugs, warnings, perf, /proc/<pid>/stack,
+         livepatch, lockdep, and more.
+
+config UNWINDER_FRAME_POINTER
+       bool "Frame pointer unwinder"
+       depends on !THUMB2_KERNEL && !CC_IS_CLANG
+       select ARCH_WANT_FRAME_POINTERS
+       select FRAME_POINTER
        help
-         If you say N here, the resulting kernel will be slightly smaller and
-         faster. However, if neither FRAME_POINTER nor ARM_UNWIND are enabled,
-         when a problem occurs with the kernel, the information that is
-         reported is severely limited.
+         This option enables the frame pointer unwinder for unwinding
+         kernel stack traces.
 
-config ARM_UNWIND
-       bool "Enable stack unwinding support (EXPERIMENTAL)"
+config UNWINDER_ARM
+       bool "ARM EABI stack unwinder"
        depends on AEABI
-       default y
+       select ARM_UNWIND
        help
          This option enables stack unwinding support in the kernel
          using the information automatically generated by the
          compiler. The resulting kernel image is slightly bigger but
          the performance is not affected. Currently, this feature
-         only works with EABI compilers. If unsure say Y.
+         only works with EABI compilers.
+
+endchoice
+
+config ARM_UNWIND
+       bool
+
+config FRAME_POINTER
+       bool
 
 config OLD_MCOUNT
        bool
index 428eaf16a1d2508bf1aeb424660d98bf5cb39782..f63a4faf244e8c360e79b301eff3ff8ddfea399b 100644 (file)
@@ -1131,7 +1131,7 @@ config LOCKDEP
        bool
        depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT
        select STACKTRACE
-       select FRAME_POINTER if !MIPS && !PPC && !ARM_UNWIND && !S390 && !MICROBLAZE && !ARC && !SCORE && !X86
+       select FRAME_POINTER if !MIPS && !PPC && !ARM && !S390 && !MICROBLAZE && !ARC && !SCORE && !X86
        select KALLSYMS
        select KALLSYMS_ALL
 
@@ -1566,7 +1566,7 @@ config FAULT_INJECTION_STACKTRACE_FILTER
        depends on FAULT_INJECTION_DEBUG_FS && STACKTRACE_SUPPORT
        depends on !X86_64
        select STACKTRACE
-       select FRAME_POINTER if !MIPS && !PPC && !S390 && !MICROBLAZE && !ARM_UNWIND && !ARC && !SCORE && !X86
+       select FRAME_POINTER if !MIPS && !PPC && !S390 && !MICROBLAZE && !ARM && !ARC && !SCORE && !X86
        help
          Provide stacktrace filter for fault-injection capabilities
 
@@ -1575,7 +1575,7 @@ config LATENCYTOP
        depends on DEBUG_KERNEL
        depends on STACKTRACE_SUPPORT
        depends on PROC_FS
-       select FRAME_POINTER if !MIPS && !PPC && !S390 && !MICROBLAZE && !ARM_UNWIND && !ARC && !X86
+       select FRAME_POINTER if !MIPS && !PPC && !S390 && !MICROBLAZE && !ARM && !ARC && !X86
        select KALLSYMS
        select KALLSYMS_ALL
        select STACKTRACE