sh: Setup the frame register in asm code
authorMatt Fleming <matt@console-pimps.org>
Sun, 2 Aug 2009 21:33:26 +0000 (22:33 +0100)
committerPaul Mundt <lethal@linux-sh.org>
Thu, 13 Aug 2009 16:59:55 +0000 (01:59 +0900)
In order to use DWARF unwinder info the frame register has to contain a
valid value. Whilst GCC takes care of this for C code, we have to do it
ourselves for assembly.

Signed-off-by: Matt Fleming <matt@console-pimps.org>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
arch/sh/include/asm/entry-macros.S
arch/sh/kernel/cpu/sh3/entry.S
arch/sh/kernel/entry-common.S

index 1bdd93891cd7567ce2baad7963106436cad6852c..64fd0de24dafe244ac6b9dc3e94ffbe9e8795ae8 100644 (file)
 #else
 # define PREF(x)       nop
 #endif
+
+       /*
+        * Macro for use within assembly. Because the DWARF unwinder
+        * needs to use the frame register to unwind the stack, we
+        * need to setup r14 with the value of the stack pointer as
+        * the return address is usually on the stack somewhere.
+        */
+       .macro  setup_frame_reg
+#ifdef CONFIG_DWARF_UNWINDER
+       mov     r15, r14
+#endif
+       .endm
index 3cb531f233f24cd27edcf1f8aedd7d86201c0d5c..67ad6467c694b43cfca77b28bd96ee9a3648c5a8 100644 (file)
@@ -137,6 +137,7 @@ ENTRY(tlb_protection_violation_store)
         mov    #1, r5
 
 call_dpf:
+       setup_frame_reg
        mov.l   1f, r0
        mov     r5, r8
        mov.l   @r0, r6
index fc26ccd82789f0bc44e053f8d27e637e302d3a7a..b3b215fb21f7fe70cfc9f9e33d3466f8c84f7ba1 100644 (file)
@@ -285,6 +285,7 @@ ret_from_fork:
  * system calls and debug traps through their respective jump tables.
  */
 ENTRY(system_call)
+       setup_frame_reg
 #if !defined(CONFIG_CPU_SH2)
        mov.l   1f, r9
        mov.l   @r9, r8         ! Read from TRA (Trap Address) Register