[PATCH 0/7] Fix handling of FP in THUMB2 mode

Nikolay Borisov Nikolay.Borisov at arm.com
Tue May 13 02:46:51 PDT 2014

Currently, most code which deals with stack unwinding relies on the fact 
that the frame pointer is stored in register R11. This is primary done via 
referencing the ARM_fp inside the pt_regs array as well as calling the 
thread_saved_fp macro. Unfortunately, this is not true in the case when 
the kernel is compiled in THUMB2 mode, since gcc uses exclusively R7 
to be the frame pointer. 

This patch series aims to rectify the situation in the following ways: 

 * Patch 1/7 Changes the way the thread_saved_fp macro is defined so that
 THUMB2 case is automatically handled. It has already been tested and reviewed. 
 * Patch 2/7 Introduces a new function - arm_get_current_stack_frame, which 
 just copies the appropriate registers from "struct pt_regs" into 
 "struct stackframe". This replaces several places where common code such 
 as "copy regs.{pc, lr, sp, fp} to frame.{pc, lr, sp, fp}" is present. It is
 implemented by using the newly-introduced frame_pointer(regs) macro which
 decides which register to extract based on the current kernel compile option

 * Patches 3-5,7 Actualy "flip the switch" so that code can start
 using the new function. 

 * Patch 6/7 Introduces the correct changes in traps.c where only the
 * frame_pointer and not a full "struct stack" frame is being passed. 

Nikolay Borisov (7):
  ARM: Make thread_save_fp macro aware of THUMB2 mode
  ARM: Introduce arm_get_current_stack_frame()
  ARM: perf: Make perf use arm_get_current_stackframe
  ARM: time: Make use of arm_get_current_stackframe
  ARM: unwind: Use arm_get_current_stackframe
  ARM: traps: Make use of the frame_pointer macro
  ARM: oprofile: Use of arm_get_current_stackframe

 arch/arm/include/asm/ptrace.h      | 3 +++
 arch/arm/include/asm/stacktrace.h  | 5 +++++
 arch/arm/include/asm/thread_info.h | 6 ++++++
 arch/arm/kernel/perf_event.c       | 5 +----
 arch/arm/kernel/stacktrace.c       | 9 +++++++++
 arch/arm/kernel/time.c             | 5 +----
 arch/arm/kernel/traps.c            | 6 ++++--
 arch/arm/kernel/unwind.c           | 8 +++-----
 arch/arm/oprofile/common.c         | 5 +----
 9 files changed, 33 insertions(+), 19 deletions(-)


More information about the linux-arm-kernel mailing list