Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ARM: 8204/1: Add unwinding support for memset function

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>

authored by

Lin Yongting and committed by
Russell King
c2459d35 a391263c

+12
+12
arch/arm/lib/memset.S
··· 11 11 */ 12 12 #include <linux/linkage.h> 13 13 #include <asm/assembler.h> 14 + #include <asm/unwind.h> 14 15 15 16 .text 16 17 .align 5 17 18 18 19 ENTRY(memset) 20 + UNWIND( .fnstart ) 19 21 ands r3, r0, #3 @ 1 unaligned? 20 22 mov ip, r0 @ preserve r0 as return value 21 23 bne 6f @ 1 ··· 36 34 * We need 2 extra registers for this loop - use r8 and the LR 37 35 */ 38 36 stmfd sp!, {r8, lr} 37 + UNWIND( .fnend ) 38 + UNWIND( .fnstart ) 39 + UNWIND( .save {r8, lr} ) 39 40 mov r8, r1 40 41 mov lr, r1 41 42 ··· 58 53 tst r2, #16 59 54 stmneia ip!, {r1, r3, r8, lr} 60 55 ldmfd sp!, {r8, lr} 56 + UNWIND( .fnend ) 61 57 62 58 #else 63 59 ··· 68 62 */ 69 63 70 64 stmfd sp!, {r4-r8, lr} 65 + UNWIND( .fnend ) 66 + UNWIND( .fnstart ) 67 + UNWIND( .save {r4-r8, lr} ) 71 68 mov r4, r1 72 69 mov r5, r1 73 70 mov r6, r1 ··· 103 94 tst r2, #16 104 95 stmneia ip!, {r4-r7} 105 96 ldmfd sp!, {r4-r8, lr} 97 + UNWIND( .fnend ) 106 98 107 99 #endif 108 100 101 + UNWIND( .fnstart ) 109 102 4: tst r2, #8 110 103 stmneia ip!, {r1, r3} 111 104 tst r2, #4 ··· 131 120 strb r1, [ip], #1 @ 1 132 121 add r2, r2, r3 @ 1 (r2 = r2 - (4 - r3)) 133 122 b 1b 123 + UNWIND( .fnend ) 134 124 ENDPROC(memset)