ARM: 8223/1: Add unwinding support for __memzero function
authorLin Yongting <linyongting@gmail.com>
Wed, 26 Nov 2014 13:33:49 +0000 (14:33 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Thu, 27 Nov 2014 16:00:23 +0000 (16:00 +0000)
The __memzero function never had unwinding annotations added.
Currently, when accessing invalid pointer by __memzero occurs the
backtrace shown will stop at __memzero or some completely unrelated
function. Add unwinding annotations in hopes of getting a more
useful backtrace in following cases:
1. die on accessing invalid pointer by __memzero
2. kprobe trapped at any instruction within __memzero
3. interrupted at any instruction within __memzero

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

index 385ccb3..0eded95 100644 (file)
@@ -9,6 +9,7 @@
  */
 #include <linux/linkage.h>
 #include <asm/assembler.h>
+#include <asm/unwind.h>
 
        .text
        .align  5
@@ -18,6 +19,7 @@
  * mis-aligned by, and r1 is the number of bytes.  If r1 < 4, then we
  * don't bother; we use byte stores instead.
  */
+UNWIND(        .fnstart                        )
 1:     subs    r1, r1, #4              @ 1 do we have enough
        blt     5f                      @ 1 bytes to align with?
        cmp     r3, #2                  @ 1
@@ -47,6 +49,9 @@ ENTRY(__memzero)
  * use the LR
  */
        str     lr, [sp, #-4]!          @ 1
+UNWIND(        .fnend                          )
+UNWIND(        .fnstart                        )
+UNWIND(        .save   {lr}                    )
        mov     ip, r2                  @ 1
        mov     lr, r2                  @ 1
 
@@ -66,6 +71,7 @@ ENTRY(__memzero)
        tst     r1, #16                 @ 1 16 bytes or more?
        stmneia r0!, {r2, r3, ip, lr}   @ 4
        ldr     lr, [sp], #4            @ 1
+UNWIND(        .fnend                          )
 
 #else
 
@@ -75,6 +81,9 @@ ENTRY(__memzero)
  */
 
        stmfd   sp!, {r4-r7, lr}
+UNWIND(        .fnend                 )
+UNWIND(        .fnstart               )
+UNWIND(        .save   {r4-r7, lr}    )
        mov     r4, r2
        mov     r5, r2
        mov     r6, r2
@@ -105,9 +114,11 @@ ENTRY(__memzero)
        tst     r1, #16
        stmneia r0!, {r4-r7}
        ldmfd   sp!, {r4-r7, lr}
+UNWIND(        .fnend                 )
 
 #endif
 
+UNWIND(        .fnstart                        )
 4:     tst     r1, #8                  @ 1 8 bytes or more?
        stmneia r0!, {r2, r3}           @ 2
        tst     r1, #4                  @ 1 4 bytes or more?
@@ -122,4 +133,5 @@ ENTRY(__memzero)
        tst     r1, #1                  @ 1 a byte left over
        strneb  r2, [r0], #1            @ 1
        ret     lr                      @ 1
+UNWIND(        .fnend                          )
 ENDPROC(__memzero)