aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/lib
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/lib')
-rw-r--r--arch/arm/lib/copy_from_user.S5
-rw-r--r--arch/arm/lib/copy_template.S30
-rw-r--r--arch/arm/lib/copy_to_user.S5
-rw-r--r--arch/arm/lib/memcpy.S5
-rw-r--r--arch/arm/lib/memmove.S28
-rw-r--r--arch/arm/lib/memset.S12
-rw-r--r--arch/arm/lib/memzero.S12
7 files changed, 97 insertions, 0 deletions
diff --git a/arch/arm/lib/copy_from_user.S b/arch/arm/lib/copy_from_user.S
index 66a477a3e3cc..7a235b9952be 100644
--- a/arch/arm/lib/copy_from_user.S
+++ b/arch/arm/lib/copy_from_user.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/* 17/*
17 * Prototype: 18 * Prototype:
@@ -77,6 +78,10 @@
77 stmdb sp!, {r0, r2, r3, \reg1, \reg2} 78 stmdb sp!, {r0, r2, r3, \reg1, \reg2}
78 .endm 79 .endm
79 80
81 .macro usave reg1 reg2
82 UNWIND( .save {r0, r2, r3, \reg1, \reg2} )
83 .endm
84
80 .macro exit reg1 reg2 85 .macro exit reg1 reg2
81 add sp, sp, #8 86 add sp, sp, #8
82 ldmfd sp!, {r0, \reg1, \reg2} 87 ldmfd sp!, {r0, \reg1, \reg2}
diff --git a/arch/arm/lib/copy_template.S b/arch/arm/lib/copy_template.S
index 3bc8eb811a73..652e4d98cd47 100644
--- a/arch/arm/lib/copy_template.S
+++ b/arch/arm/lib/copy_template.S
@@ -53,6 +53,12 @@
53 * data as needed by the implementation including this code. Called 53 * data as needed by the implementation including this code. Called
54 * upon code entry. 54 * upon code entry.
55 * 55 *
56 * usave reg1 reg2
57 *
58 * Unwind annotation macro is corresponding for 'enter' macro.
59 * It tell unwinder that preserved some provided registers on the stack
60 * and additional data by a prior 'enter' macro.
61 *
56 * exit reg1 reg2 62 * exit reg1 reg2
57 * 63 *
58 * Restore registers with the values previously saved with the 64 * Restore registers with the values previously saved with the
@@ -67,7 +73,12 @@
67 */ 73 */
68 74
69 75
76 UNWIND( .fnstart )
70 enter r4, lr 77 enter r4, lr
78 UNWIND( .fnend )
79
80 UNWIND( .fnstart )
81 usave r4, lr @ in first stmdb block
71 82
72 subs r2, r2, #4 83 subs r2, r2, #4
73 blt 8f 84 blt 8f
@@ -79,6 +90,11 @@
79 90
801: subs r2, r2, #(28) 911: subs r2, r2, #(28)
81 stmfd sp!, {r5 - r8} 92 stmfd sp!, {r5 - r8}
93 UNWIND( .fnend )
94
95 UNWIND( .fnstart )
96 usave r4, lr
97 UNWIND( .save {r5 - r8} ) @ in second stmfd block
82 blt 5f 98 blt 5f
83 99
84 CALGN( ands ip, r0, #31 ) 100 CALGN( ands ip, r0, #31 )
@@ -144,7 +160,10 @@
144 CALGN( bcs 2b ) 160 CALGN( bcs 2b )
145 161
1467: ldmfd sp!, {r5 - r8} 1627: ldmfd sp!, {r5 - r8}
163 UNWIND( .fnend ) @ end of second stmfd block
147 164
165 UNWIND( .fnstart )
166 usave r4, lr @ still in first stmdb block
1488: movs r2, r2, lsl #31 1678: movs r2, r2, lsl #31
149 ldr1b r1, r3, ne, abort=21f 168 ldr1b r1, r3, ne, abort=21f
150 ldr1b r1, r4, cs, abort=21f 169 ldr1b r1, r4, cs, abort=21f
@@ -173,10 +192,13 @@
173 ldr1w r1, lr, abort=21f 192 ldr1w r1, lr, abort=21f
174 beq 17f 193 beq 17f
175 bgt 18f 194 bgt 18f
195 UNWIND( .fnend )
176 196
177 197
178 .macro forward_copy_shift pull push 198 .macro forward_copy_shift pull push
179 199
200 UNWIND( .fnstart )
201 usave r4, lr @ still in first stmdb block
180 subs r2, r2, #28 202 subs r2, r2, #28
181 blt 14f 203 blt 14f
182 204
@@ -187,7 +209,11 @@
187 CALGN( bcc 15f ) 209 CALGN( bcc 15f )
188 210
18911: stmfd sp!, {r5 - r9} 21111: stmfd sp!, {r5 - r9}
212 UNWIND( .fnend )
190 213
214 UNWIND( .fnstart )
215 usave r4, lr
216 UNWIND( .save {r5 - r9} ) @ in new second stmfd block
191 PLD( pld [r1, #0] ) 217 PLD( pld [r1, #0] )
192 PLD( subs r2, r2, #96 ) 218 PLD( subs r2, r2, #96 )
193 PLD( pld [r1, #28] ) 219 PLD( pld [r1, #28] )
@@ -221,7 +247,10 @@
221 PLD( bge 13b ) 247 PLD( bge 13b )
222 248
223 ldmfd sp!, {r5 - r9} 249 ldmfd sp!, {r5 - r9}
250 UNWIND( .fnend ) @ end of the second stmfd block
224 251
252 UNWIND( .fnstart )
253 usave r4, lr @ still in first stmdb block
22514: ands ip, r2, #28 25414: ands ip, r2, #28
226 beq 16f 255 beq 16f
227 256
@@ -236,6 +265,7 @@
236 265
23716: sub r1, r1, #(\push / 8) 26616: sub r1, r1, #(\push / 8)
238 b 8b 267 b 8b
268 UNWIND( .fnend )
239 269
240 .endm 270 .endm
241 271
diff --git a/arch/arm/lib/copy_to_user.S b/arch/arm/lib/copy_to_user.S
index d066df686e17..a9d3db16ecb5 100644
--- a/arch/arm/lib/copy_to_user.S
+++ b/arch/arm/lib/copy_to_user.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/* 17/*
17 * Prototype: 18 * Prototype:
@@ -80,6 +81,10 @@
80 stmdb sp!, {r0, r2, r3, \reg1, \reg2} 81 stmdb sp!, {r0, r2, r3, \reg1, \reg2}
81 .endm 82 .endm
82 83
84 .macro usave reg1 reg2
85 UNWIND( .save {r0, r2, r3, \reg1, \reg2} )
86 .endm
87
83 .macro exit reg1 reg2 88 .macro exit reg1 reg2
84 add sp, sp, #8 89 add sp, sp, #8
85 ldmfd sp!, {r0, \reg1, \reg2} 90 ldmfd sp!, {r0, \reg1, \reg2}
diff --git a/arch/arm/lib/memcpy.S b/arch/arm/lib/memcpy.S
index a9b9e2287a09..7797e81e40e0 100644
--- a/arch/arm/lib/memcpy.S
+++ b/arch/arm/lib/memcpy.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#define LDR1W_SHIFT 0 17#define LDR1W_SHIFT 0
17#define STR1W_SHIFT 0 18#define STR1W_SHIFT 0
@@ -48,6 +49,10 @@
48 stmdb sp!, {r0, \reg1, \reg2} 49 stmdb sp!, {r0, \reg1, \reg2}
49 .endm 50 .endm
50 51
52 .macro usave reg1 reg2
53 UNWIND( .save {r0, \reg1, \reg2} )
54 .endm
55
51 .macro exit reg1 reg2 56 .macro exit reg1 reg2
52 ldmfd sp!, {r0, \reg1, \reg2} 57 ldmfd sp!, {r0, \reg1, \reg2}
53 .endm 58 .endm
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
29ENTRY(memmove) 30ENTRY(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
461: subs r2, r2, #(28) 521: 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
997: ldmfd sp!, {r5 - r8} 1107: 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
1018: movs r2, r2, lsl #31 1168: 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
13911: stmfd sp!, {r5 - r9} 15711: 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
17514: ands ip, r2, #28 20214: ands ip, r2, #28
176 beq 16f 203 beq 16f
@@ -186,6 +213,7 @@ ENTRY(memmove)
186 213
18716: add r1, r1, #(\pull / 8) 21416: add r1, r1, #(\pull / 8)
188 b 8b 215 b 8b
216 UNWIND( .fnend )
189 217
190 .endm 218 .endm
191 219
diff --git a/arch/arm/lib/memset.S b/arch/arm/lib/memset.S
index 671455c854fa..a4ee97b5a2bf 100644
--- a/arch/arm/lib/memset.S
+++ b/arch/arm/lib/memset.S
@@ -11,11 +11,13 @@
11 */ 11 */
12#include <linux/linkage.h> 12#include <linux/linkage.h>
13#include <asm/assembler.h> 13#include <asm/assembler.h>
14#include <asm/unwind.h>
14 15
15 .text 16 .text
16 .align 5 17 .align 5
17 18
18ENTRY(memset) 19ENTRY(memset)
20UNWIND( .fnstart )
19 ands r3, r0, #3 @ 1 unaligned? 21 ands r3, r0, #3 @ 1 unaligned?
20 mov ip, r0 @ preserve r0 as return value 22 mov ip, r0 @ preserve r0 as return value
21 bne 6f @ 1 23 bne 6f @ 1
@@ -34,6 +36,9 @@ ENTRY(memset)
34 * We need 2 extra registers for this loop - use r8 and the LR 36 * We need 2 extra registers for this loop - use r8 and the LR
35 */ 37 */
36 stmfd sp!, {r8, lr} 38 stmfd sp!, {r8, lr}
39UNWIND( .fnend )
40UNWIND( .fnstart )
41UNWIND( .save {r8, lr} )
37 mov r8, r1 42 mov r8, r1
38 mov lr, r1 43 mov lr, r1
39 44
@@ -53,6 +58,7 @@ ENTRY(memset)
53 tst r2, #16 58 tst r2, #16
54 stmneia ip!, {r1, r3, r8, lr} 59 stmneia ip!, {r1, r3, r8, lr}
55 ldmfd sp!, {r8, lr} 60 ldmfd sp!, {r8, lr}
61UNWIND( .fnend )
56 62
57#else 63#else
58 64
@@ -62,6 +68,9 @@ ENTRY(memset)
62 */ 68 */
63 69
64 stmfd sp!, {r4-r8, lr} 70 stmfd sp!, {r4-r8, lr}
71UNWIND( .fnend )
72UNWIND( .fnstart )
73UNWIND( .save {r4-r8, lr} )
65 mov r4, r1 74 mov r4, r1
66 mov r5, r1 75 mov r5, r1
67 mov r6, r1 76 mov r6, r1
@@ -94,9 +103,11 @@ ENTRY(memset)
94 tst r2, #16 103 tst r2, #16
95 stmneia ip!, {r4-r7} 104 stmneia ip!, {r4-r7}
96 ldmfd sp!, {r4-r8, lr} 105 ldmfd sp!, {r4-r8, lr}
106UNWIND( .fnend )
97 107
98#endif 108#endif
99 109
110UNWIND( .fnstart )
1004: tst r2, #8 1114: tst r2, #8
101 stmneia ip!, {r1, r3} 112 stmneia ip!, {r1, r3}
102 tst r2, #4 113 tst r2, #4
@@ -120,4 +131,5 @@ ENTRY(memset)
120 strb r1, [ip], #1 @ 1 131 strb r1, [ip], #1 @ 1
121 add r2, r2, r3 @ 1 (r2 = r2 - (4 - r3)) 132 add r2, r2, r3 @ 1 (r2 = r2 - (4 - r3))
122 b 1b 133 b 1b
134UNWIND( .fnend )
123ENDPROC(memset) 135ENDPROC(memset)
diff --git a/arch/arm/lib/memzero.S b/arch/arm/lib/memzero.S
index 385ccb306fa2..0eded952e089 100644
--- a/arch/arm/lib/memzero.S
+++ b/arch/arm/lib/memzero.S
@@ -9,6 +9,7 @@
9 */ 9 */
10#include <linux/linkage.h> 10#include <linux/linkage.h>
11#include <asm/assembler.h> 11#include <asm/assembler.h>
12#include <asm/unwind.h>
12 13
13 .text 14 .text
14 .align 5 15 .align 5
@@ -18,6 +19,7 @@
18 * mis-aligned by, and r1 is the number of bytes. If r1 < 4, then we 19 * mis-aligned by, and r1 is the number of bytes. If r1 < 4, then we
19 * don't bother; we use byte stores instead. 20 * don't bother; we use byte stores instead.
20 */ 21 */
22UNWIND( .fnstart )
211: subs r1, r1, #4 @ 1 do we have enough 231: subs r1, r1, #4 @ 1 do we have enough
22 blt 5f @ 1 bytes to align with? 24 blt 5f @ 1 bytes to align with?
23 cmp r3, #2 @ 1 25 cmp r3, #2 @ 1
@@ -47,6 +49,9 @@ ENTRY(__memzero)
47 * use the LR 49 * use the LR
48 */ 50 */
49 str lr, [sp, #-4]! @ 1 51 str lr, [sp, #-4]! @ 1
52UNWIND( .fnend )
53UNWIND( .fnstart )
54UNWIND( .save {lr} )
50 mov ip, r2 @ 1 55 mov ip, r2 @ 1
51 mov lr, r2 @ 1 56 mov lr, r2 @ 1
52 57
@@ -66,6 +71,7 @@ ENTRY(__memzero)
66 tst r1, #16 @ 1 16 bytes or more? 71 tst r1, #16 @ 1 16 bytes or more?
67 stmneia r0!, {r2, r3, ip, lr} @ 4 72 stmneia r0!, {r2, r3, ip, lr} @ 4
68 ldr lr, [sp], #4 @ 1 73 ldr lr, [sp], #4 @ 1
74UNWIND( .fnend )
69 75
70#else 76#else
71 77
@@ -75,6 +81,9 @@ ENTRY(__memzero)
75 */ 81 */
76 82
77 stmfd sp!, {r4-r7, lr} 83 stmfd sp!, {r4-r7, lr}
84UNWIND( .fnend )
85UNWIND( .fnstart )
86UNWIND( .save {r4-r7, lr} )
78 mov r4, r2 87 mov r4, r2
79 mov r5, r2 88 mov r5, r2
80 mov r6, r2 89 mov r6, r2
@@ -105,9 +114,11 @@ ENTRY(__memzero)
105 tst r1, #16 114 tst r1, #16
106 stmneia r0!, {r4-r7} 115 stmneia r0!, {r4-r7}
107 ldmfd sp!, {r4-r7, lr} 116 ldmfd sp!, {r4-r7, lr}
117UNWIND( .fnend )
108 118
109#endif 119#endif
110 120
121UNWIND( .fnstart )
1114: tst r1, #8 @ 1 8 bytes or more? 1224: tst r1, #8 @ 1 8 bytes or more?
112 stmneia r0!, {r2, r3} @ 2 123 stmneia r0!, {r2, r3} @ 2
113 tst r1, #4 @ 1 4 bytes or more? 124 tst r1, #4 @ 1 4 bytes or more?
@@ -122,4 +133,5 @@ ENTRY(__memzero)
122 tst r1, #1 @ 1 a byte left over 133 tst r1, #1 @ 1 a byte left over
123 strneb r2, [r0], #1 @ 1 134 strneb r2, [r0], #1 @ 1
124 ret lr @ 1 135 ret lr @ 1
136UNWIND( .fnend )
125ENDPROC(__memzero) 137ENDPROC(__memzero)