ARM: 8204/1: Add unwinding support for memset function
authorLin Yongting <linyongting@gmail.com>
Sun, 16 Nov 2014 02:14:58 +0000 (03:14 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Fri, 21 Nov 2014 15:24:49 +0000 (15:24 +0000)
The memset function never had unwinding annotations added.
Currently, when accessing NULL pointer by memset occurs the
backtrace shown will stop at memset or some completely unrelated
function. Add unwinding annotations in hopes of getting a more
useful backtrace when accessing NULL pointer by memset, kprobe
or interrupt.

Signed-off-by: Lin Yongting <linyongting@gmail.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/lib/memset.S

index 671455c854fa9b6a64ed6cb3ab26a6edcbed4e23..a4ee97b5a2bfcfd3099353b44e8678c4df5bff6b 100644 (file)
  */
 #include <linux/linkage.h>
 #include <asm/assembler.h>
+#include <asm/unwind.h>
 
        .text
        .align  5
 
 ENTRY(memset)
+UNWIND( .fnstart         )
        ands    r3, r0, #3              @ 1 unaligned?
        mov     ip, r0                  @ preserve r0 as return value
        bne     6f                      @ 1
@@ -34,6 +36,9 @@ ENTRY(memset)
  * We need 2 extra registers for this loop - use r8 and the LR
  */
        stmfd   sp!, {r8, lr}
+UNWIND( .fnend              )
+UNWIND( .fnstart            )
+UNWIND( .save {r8, lr}      )
        mov     r8, r1
        mov     lr, r1
 
@@ -53,6 +58,7 @@ ENTRY(memset)
        tst     r2, #16
        stmneia ip!, {r1, r3, r8, lr}
        ldmfd   sp!, {r8, lr}
+UNWIND( .fnend              )
 
 #else
 
@@ -62,6 +68,9 @@ ENTRY(memset)
  */
 
        stmfd   sp!, {r4-r8, lr}
+UNWIND( .fnend                 )
+UNWIND( .fnstart               )
+UNWIND( .save {r4-r8, lr}      )
        mov     r4, r1
        mov     r5, r1
        mov     r6, r1
@@ -94,9 +103,11 @@ ENTRY(memset)
        tst     r2, #16
        stmneia ip!, {r4-r7}
        ldmfd   sp!, {r4-r8, lr}
+UNWIND( .fnend                 )
 
 #endif
 
+UNWIND( .fnstart            )
 4:     tst     r2, #8
        stmneia ip!, {r1, r3}
        tst     r2, #4
@@ -120,4 +131,5 @@ ENTRY(memset)
        strb    r1, [ip], #1            @ 1
        add     r2, r2, r3              @ 1 (r2 = r2 - (4 - r3))
        b       1b
+UNWIND( .fnend   )
 ENDPROC(memset)