diff options
Diffstat (limited to 'arch/arm/lib')
-rw-r--r-- | arch/arm/lib/memmove.S | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/arch/arm/lib/memmove.S b/arch/arm/lib/memmove.S index d1fc0c0c342c..69a9d47fc5ab 100644 --- a/arch/arm/lib/memmove.S +++ b/arch/arm/lib/memmove.S | |||
@@ -12,6 +12,7 @@ | |||
12 | 12 | ||
13 | #include <linux/linkage.h> | 13 | #include <linux/linkage.h> |
14 | #include <asm/assembler.h> | 14 | #include <asm/assembler.h> |
15 | #include <asm/unwind.h> | ||
15 | 16 | ||
16 | .text | 17 | .text |
17 | 18 | ||
@@ -27,12 +28,17 @@ | |||
27 | */ | 28 | */ |
28 | 29 | ||
29 | ENTRY(memmove) | 30 | ENTRY(memmove) |
31 | UNWIND( .fnstart ) | ||
30 | 32 | ||
31 | subs ip, r0, r1 | 33 | subs ip, r0, r1 |
32 | cmphi r2, ip | 34 | cmphi r2, ip |
33 | bls memcpy | 35 | bls memcpy |
34 | 36 | ||
35 | stmfd sp!, {r0, r4, lr} | 37 | stmfd sp!, {r0, r4, lr} |
38 | UNWIND( .fnend ) | ||
39 | |||
40 | UNWIND( .fnstart ) | ||
41 | UNWIND( .save {r0, r4, lr} ) @ in first stmfd block | ||
36 | add r1, r1, r2 | 42 | add r1, r1, r2 |
37 | add r0, r0, r2 | 43 | add r0, r0, r2 |
38 | subs r2, r2, #4 | 44 | subs r2, r2, #4 |
@@ -45,6 +51,11 @@ ENTRY(memmove) | |||
45 | 51 | ||
46 | 1: subs r2, r2, #(28) | 52 | 1: subs r2, r2, #(28) |
47 | stmfd sp!, {r5 - r8} | 53 | stmfd sp!, {r5 - r8} |
54 | UNWIND( .fnend ) | ||
55 | |||
56 | UNWIND( .fnstart ) | ||
57 | UNWIND( .save {r0, r4, lr} ) | ||
58 | UNWIND( .save {r5 - r8} ) @ in second stmfd block | ||
48 | blt 5f | 59 | blt 5f |
49 | 60 | ||
50 | CALGN( ands ip, r0, #31 ) | 61 | CALGN( ands ip, r0, #31 ) |
@@ -97,6 +108,10 @@ ENTRY(memmove) | |||
97 | CALGN( bcs 2b ) | 108 | CALGN( bcs 2b ) |
98 | 109 | ||
99 | 7: ldmfd sp!, {r5 - r8} | 110 | 7: ldmfd sp!, {r5 - r8} |
111 | UNWIND( .fnend ) @ end of second stmfd block | ||
112 | |||
113 | UNWIND( .fnstart ) | ||
114 | UNWIND( .save {r0, r4, lr} ) @ still in first stmfd block | ||
100 | 115 | ||
101 | 8: movs r2, r2, lsl #31 | 116 | 8: movs r2, r2, lsl #31 |
102 | ldrneb r3, [r1, #-1]! | 117 | ldrneb r3, [r1, #-1]! |
@@ -124,10 +139,13 @@ ENTRY(memmove) | |||
124 | ldr r3, [r1, #0] | 139 | ldr r3, [r1, #0] |
125 | beq 17f | 140 | beq 17f |
126 | blt 18f | 141 | blt 18f |
142 | UNWIND( .fnend ) | ||
127 | 143 | ||
128 | 144 | ||
129 | .macro backward_copy_shift push pull | 145 | .macro backward_copy_shift push pull |
130 | 146 | ||
147 | UNWIND( .fnstart ) | ||
148 | UNWIND( .save {r0, r4, lr} ) @ still in first stmfd block | ||
131 | subs r2, r2, #28 | 149 | subs r2, r2, #28 |
132 | blt 14f | 150 | blt 14f |
133 | 151 | ||
@@ -137,6 +155,11 @@ ENTRY(memmove) | |||
137 | CALGN( bcc 15f ) | 155 | CALGN( bcc 15f ) |
138 | 156 | ||
139 | 11: stmfd sp!, {r5 - r9} | 157 | 11: stmfd sp!, {r5 - r9} |
158 | UNWIND( .fnend ) | ||
159 | |||
160 | UNWIND( .fnstart ) | ||
161 | UNWIND( .save {r0, r4, lr} ) | ||
162 | UNWIND( .save {r5 - r9} ) @ in new second stmfd block | ||
140 | 163 | ||
141 | PLD( pld [r1, #-4] ) | 164 | PLD( pld [r1, #-4] ) |
142 | PLD( subs r2, r2, #96 ) | 165 | PLD( subs r2, r2, #96 ) |
@@ -171,6 +194,10 @@ ENTRY(memmove) | |||
171 | PLD( bge 13b ) | 194 | PLD( bge 13b ) |
172 | 195 | ||
173 | ldmfd sp!, {r5 - r9} | 196 | ldmfd sp!, {r5 - r9} |
197 | UNWIND( .fnend ) @ end of the second stmfd block | ||
198 | |||
199 | UNWIND( .fnstart ) | ||
200 | UNWIND( .save {r0, r4, lr} ) @ still in first stmfd block | ||
174 | 201 | ||
175 | 14: ands ip, r2, #28 | 202 | 14: ands ip, r2, #28 |
176 | beq 16f | 203 | beq 16f |
@@ -186,6 +213,7 @@ ENTRY(memmove) | |||
186 | 213 | ||
187 | 16: add r1, r1, #(\pull / 8) | 214 | 16: add r1, r1, #(\pull / 8) |
188 | b 8b | 215 | b 8b |
216 | UNWIND( .fnend ) | ||
189 | 217 | ||
190 | .endm | 218 | .endm |
191 | 219 | ||