aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/lib/uaccess.S230
1 files changed, 116 insertions, 114 deletions
diff --git a/arch/arm/lib/uaccess.S b/arch/arm/lib/uaccess.S
index 6f1b5b49fe4c..0cc450f863b6 100644
--- a/arch/arm/lib/uaccess.S
+++ b/arch/arm/lib/uaccess.S
@@ -27,7 +27,7 @@
27 * Returns : Number of bytes NOT copied. 27 * Returns : Number of bytes NOT copied.
28 */ 28 */
29 29
30.c2u_dest_not_aligned: 30.Lc2u_dest_not_aligned:
31 rsb ip, ip, #4 31 rsb ip, ip, #4
32 cmp ip, #2 32 cmp ip, #2
33 ldrb r3, [r1], #1 33 ldrb r3, [r1], #1
@@ -37,32 +37,32 @@ USER( strgebt r3, [r0], #1) @ May fault
37 ldrgtb r3, [r1], #1 37 ldrgtb r3, [r1], #1
38USER( strgtbt r3, [r0], #1) @ May fault 38USER( strgtbt r3, [r0], #1) @ May fault
39 sub r2, r2, ip 39 sub r2, r2, ip
40 b .c2u_dest_aligned 40 b .Lc2u_dest_aligned
41 41
42ENTRY(__arch_copy_to_user) 42ENTRY(__arch_copy_to_user)
43 stmfd sp!, {r2, r4 - r7, lr} 43 stmfd sp!, {r2, r4 - r7, lr}
44 cmp r2, #4 44 cmp r2, #4
45 blt .c2u_not_enough 45 blt .Lc2u_not_enough
46 ands ip, r0, #3 46 ands ip, r0, #3
47 bne .c2u_dest_not_aligned 47 bne .Lc2u_dest_not_aligned
48.c2u_dest_aligned: 48.Lc2u_dest_aligned:
49 49
50 ands ip, r1, #3 50 ands ip, r1, #3
51 bne .c2u_src_not_aligned 51 bne .Lc2u_src_not_aligned
52/* 52/*
53 * Seeing as there has to be at least 8 bytes to copy, we can 53 * Seeing as there has to be at least 8 bytes to copy, we can
54 * copy one word, and force a user-mode page fault... 54 * copy one word, and force a user-mode page fault...
55 */ 55 */
56 56
57.c2u_0fupi: subs r2, r2, #4 57.Lc2u_0fupi: subs r2, r2, #4
58 addmi ip, r2, #4 58 addmi ip, r2, #4
59 bmi .c2u_0nowords 59 bmi .Lc2u_0nowords
60 ldr r3, [r1], #4 60 ldr r3, [r1], #4
61USER( strt r3, [r0], #4) @ May fault 61USER( strt r3, [r0], #4) @ May fault
62 mov ip, r0, lsl #32 - PAGE_SHIFT @ On each page, use a ld/st??t instruction 62 mov ip, r0, lsl #32 - PAGE_SHIFT @ On each page, use a ld/st??t instruction
63 rsb ip, ip, #0 63 rsb ip, ip, #0
64 movs ip, ip, lsr #32 - PAGE_SHIFT 64 movs ip, ip, lsr #32 - PAGE_SHIFT
65 beq .c2u_0fupi 65 beq .Lc2u_0fupi
66/* 66/*
67 * ip = max no. of bytes to copy before needing another "strt" insn 67 * ip = max no. of bytes to copy before needing another "strt" insn
68 */ 68 */
@@ -70,16 +70,16 @@ USER( strt r3, [r0], #4) @ May fault
70 movlt ip, r2 70 movlt ip, r2
71 sub r2, r2, ip 71 sub r2, r2, ip
72 subs ip, ip, #32 72 subs ip, ip, #32
73 blt .c2u_0rem8lp 73 blt .Lc2u_0rem8lp
74 74
75.c2u_0cpy8lp: ldmia r1!, {r3 - r6} 75.Lc2u_0cpy8lp: ldmia r1!, {r3 - r6}
76 stmia r0!, {r3 - r6} @ Shouldnt fault 76 stmia r0!, {r3 - r6} @ Shouldnt fault
77 ldmia r1!, {r3 - r6} 77 ldmia r1!, {r3 - r6}
78 subs ip, ip, #32 78 subs ip, ip, #32
79 stmia r0!, {r3 - r6} @ Shouldnt fault 79 stmia r0!, {r3 - r6} @ Shouldnt fault
80 bpl .c2u_0cpy8lp 80 bpl .Lc2u_0cpy8lp
81 81
82.c2u_0rem8lp: cmn ip, #16 82.Lc2u_0rem8lp: cmn ip, #16
83 ldmgeia r1!, {r3 - r6} 83 ldmgeia r1!, {r3 - r6}
84 stmgeia r0!, {r3 - r6} @ Shouldnt fault 84 stmgeia r0!, {r3 - r6} @ Shouldnt fault
85 tst ip, #8 85 tst ip, #8
@@ -89,33 +89,33 @@ USER( strt r3, [r0], #4) @ May fault
89 ldrne r3, [r1], #4 89 ldrne r3, [r1], #4
90 strnet r3, [r0], #4 @ Shouldnt fault 90 strnet r3, [r0], #4 @ Shouldnt fault
91 ands ip, ip, #3 91 ands ip, ip, #3
92 beq .c2u_0fupi 92 beq .Lc2u_0fupi
93.c2u_0nowords: teq ip, #0 93.Lc2u_0nowords: teq ip, #0
94 beq .c2u_finished 94 beq .Lc2u_finished
95.c2u_nowords: cmp ip, #2 95.Lc2u_nowords: cmp ip, #2
96 ldrb r3, [r1], #1 96 ldrb r3, [r1], #1
97USER( strbt r3, [r0], #1) @ May fault 97USER( strbt r3, [r0], #1) @ May fault
98 ldrgeb r3, [r1], #1 98 ldrgeb r3, [r1], #1
99USER( strgebt r3, [r0], #1) @ May fault 99USER( strgebt r3, [r0], #1) @ May fault
100 ldrgtb r3, [r1], #1 100 ldrgtb r3, [r1], #1
101USER( strgtbt r3, [r0], #1) @ May fault 101USER( strgtbt r3, [r0], #1) @ May fault
102 b .c2u_finished 102 b .Lc2u_finished
103 103
104.c2u_not_enough: 104.Lc2u_not_enough:
105 movs ip, r2 105 movs ip, r2
106 bne .c2u_nowords 106 bne .Lc2u_nowords
107.c2u_finished: mov r0, #0 107.Lc2u_finished: mov r0, #0
108 LOADREGS(fd,sp!,{r2, r4 - r7, pc}) 108 LOADREGS(fd,sp!,{r2, r4 - r7, pc})
109 109
110.c2u_src_not_aligned: 110.Lc2u_src_not_aligned:
111 bic r1, r1, #3 111 bic r1, r1, #3
112 ldr r7, [r1], #4 112 ldr r7, [r1], #4
113 cmp ip, #2 113 cmp ip, #2
114 bgt .c2u_3fupi 114 bgt .Lc2u_3fupi
115 beq .c2u_2fupi 115 beq .Lc2u_2fupi
116.c2u_1fupi: subs r2, r2, #4 116.Lc2u_1fupi: subs r2, r2, #4
117 addmi ip, r2, #4 117 addmi ip, r2, #4
118 bmi .c2u_1nowords 118 bmi .Lc2u_1nowords
119 mov r3, r7, pull #8 119 mov r3, r7, pull #8
120 ldr r7, [r1], #4 120 ldr r7, [r1], #4
121 orr r3, r3, r7, push #24 121 orr r3, r3, r7, push #24
@@ -123,14 +123,14 @@ USER( strt r3, [r0], #4) @ May fault
123 mov ip, r0, lsl #32 - PAGE_SHIFT 123 mov ip, r0, lsl #32 - PAGE_SHIFT
124 rsb ip, ip, #0 124 rsb ip, ip, #0
125 movs ip, ip, lsr #32 - PAGE_SHIFT 125 movs ip, ip, lsr #32 - PAGE_SHIFT
126 beq .c2u_1fupi 126 beq .Lc2u_1fupi
127 cmp r2, ip 127 cmp r2, ip
128 movlt ip, r2 128 movlt ip, r2
129 sub r2, r2, ip 129 sub r2, r2, ip
130 subs ip, ip, #16 130 subs ip, ip, #16
131 blt .c2u_1rem8lp 131 blt .Lc2u_1rem8lp
132 132
133.c2u_1cpy8lp: mov r3, r7, pull #8 133.Lc2u_1cpy8lp: mov r3, r7, pull #8
134 ldmia r1!, {r4 - r7} 134 ldmia r1!, {r4 - r7}
135 subs ip, ip, #16 135 subs ip, ip, #16
136 orr r3, r3, r4, push #24 136 orr r3, r3, r4, push #24
@@ -141,9 +141,9 @@ USER( strt r3, [r0], #4) @ May fault
141 mov r6, r6, pull #8 141 mov r6, r6, pull #8
142 orr r6, r6, r7, push #24 142 orr r6, r6, r7, push #24
143 stmia r0!, {r3 - r6} @ Shouldnt fault 143 stmia r0!, {r3 - r6} @ Shouldnt fault
144 bpl .c2u_1cpy8lp 144 bpl .Lc2u_1cpy8lp
145 145
146.c2u_1rem8lp: tst ip, #8 146.Lc2u_1rem8lp: tst ip, #8
147 movne r3, r7, pull #8 147 movne r3, r7, pull #8
148 ldmneia r1!, {r4, r7} 148 ldmneia r1!, {r4, r7}
149 orrne r3, r3, r4, push #24 149 orrne r3, r3, r4, push #24
@@ -156,21 +156,21 @@ USER( strt r3, [r0], #4) @ May fault
156 orrne r3, r3, r7, push #24 156 orrne r3, r3, r7, push #24
157 strnet r3, [r0], #4 @ Shouldnt fault 157 strnet r3, [r0], #4 @ Shouldnt fault
158 ands ip, ip, #3 158 ands ip, ip, #3
159 beq .c2u_1fupi 159 beq .Lc2u_1fupi
160.c2u_1nowords: mov r3, r7, get_byte_1 160.Lc2u_1nowords: mov r3, r7, get_byte_1
161 teq ip, #0 161 teq ip, #0
162 beq .c2u_finished 162 beq .Lc2u_finished
163 cmp ip, #2 163 cmp ip, #2
164USER( strbt r3, [r0], #1) @ May fault 164USER( strbt r3, [r0], #1) @ May fault
165 movge r3, r7, get_byte_2 165 movge r3, r7, get_byte_2
166USER( strgebt r3, [r0], #1) @ May fault 166USER( strgebt r3, [r0], #1) @ May fault
167 movgt r3, r7, get_byte_3 167 movgt r3, r7, get_byte_3
168USER( strgtbt r3, [r0], #1) @ May fault 168USER( strgtbt r3, [r0], #1) @ May fault
169 b .c2u_finished 169 b .Lc2u_finished
170 170
171.c2u_2fupi: subs r2, r2, #4 171.Lc2u_2fupi: subs r2, r2, #4
172 addmi ip, r2, #4 172 addmi ip, r2, #4
173 bmi .c2u_2nowords 173 bmi .Lc2u_2nowords
174 mov r3, r7, pull #16 174 mov r3, r7, pull #16
175 ldr r7, [r1], #4 175 ldr r7, [r1], #4
176 orr r3, r3, r7, push #16 176 orr r3, r3, r7, push #16
@@ -178,14 +178,14 @@ USER( strt r3, [r0], #4) @ May fault
178 mov ip, r0, lsl #32 - PAGE_SHIFT 178 mov ip, r0, lsl #32 - PAGE_SHIFT
179 rsb ip, ip, #0 179 rsb ip, ip, #0
180 movs ip, ip, lsr #32 - PAGE_SHIFT 180 movs ip, ip, lsr #32 - PAGE_SHIFT
181 beq .c2u_2fupi 181 beq .Lc2u_2fupi
182 cmp r2, ip 182 cmp r2, ip
183 movlt ip, r2 183 movlt ip, r2
184 sub r2, r2, ip 184 sub r2, r2, ip
185 subs ip, ip, #16 185 subs ip, ip, #16
186 blt .c2u_2rem8lp 186 blt .Lc2u_2rem8lp
187 187
188.c2u_2cpy8lp: mov r3, r7, pull #16 188.Lc2u_2cpy8lp: mov r3, r7, pull #16
189 ldmia r1!, {r4 - r7} 189 ldmia r1!, {r4 - r7}
190 subs ip, ip, #16 190 subs ip, ip, #16
191 orr r3, r3, r4, push #16 191 orr r3, r3, r4, push #16
@@ -196,9 +196,9 @@ USER( strt r3, [r0], #4) @ May fault
196 mov r6, r6, pull #16 196 mov r6, r6, pull #16
197 orr r6, r6, r7, push #16 197 orr r6, r6, r7, push #16
198 stmia r0!, {r3 - r6} @ Shouldnt fault 198 stmia r0!, {r3 - r6} @ Shouldnt fault
199 bpl .c2u_2cpy8lp 199 bpl .Lc2u_2cpy8lp
200 200
201.c2u_2rem8lp: tst ip, #8 201.Lc2u_2rem8lp: tst ip, #8
202 movne r3, r7, pull #16 202 movne r3, r7, pull #16
203 ldmneia r1!, {r4, r7} 203 ldmneia r1!, {r4, r7}
204 orrne r3, r3, r4, push #16 204 orrne r3, r3, r4, push #16
@@ -211,21 +211,21 @@ USER( strt r3, [r0], #4) @ May fault
211 orrne r3, r3, r7, push #16 211 orrne r3, r3, r7, push #16
212 strnet r3, [r0], #4 @ Shouldnt fault 212 strnet r3, [r0], #4 @ Shouldnt fault
213 ands ip, ip, #3 213 ands ip, ip, #3
214 beq .c2u_2fupi 214 beq .Lc2u_2fupi
215.c2u_2nowords: mov r3, r7, get_byte_2 215.Lc2u_2nowords: mov r3, r7, get_byte_2
216 teq ip, #0 216 teq ip, #0
217 beq .c2u_finished 217 beq .Lc2u_finished
218 cmp ip, #2 218 cmp ip, #2
219USER( strbt r3, [r0], #1) @ May fault 219USER( strbt r3, [r0], #1) @ May fault
220 movge r3, r7, get_byte_3 220 movge r3, r7, get_byte_3
221USER( strgebt r3, [r0], #1) @ May fault 221USER( strgebt r3, [r0], #1) @ May fault
222 ldrgtb r3, [r1], #0 222 ldrgtb r3, [r1], #0
223USER( strgtbt r3, [r0], #1) @ May fault 223USER( strgtbt r3, [r0], #1) @ May fault
224 b .c2u_finished 224 b .Lc2u_finished
225 225
226.c2u_3fupi: subs r2, r2, #4 226.Lc2u_3fupi: subs r2, r2, #4
227 addmi ip, r2, #4 227 addmi ip, r2, #4
228 bmi .c2u_3nowords 228 bmi .Lc2u_3nowords
229 mov r3, r7, pull #24 229 mov r3, r7, pull #24
230 ldr r7, [r1], #4 230 ldr r7, [r1], #4
231 orr r3, r3, r7, push #8 231 orr r3, r3, r7, push #8
@@ -233,14 +233,14 @@ USER( strt r3, [r0], #4) @ May fault
233 mov ip, r0, lsl #32 - PAGE_SHIFT 233 mov ip, r0, lsl #32 - PAGE_SHIFT
234 rsb ip, ip, #0 234 rsb ip, ip, #0
235 movs ip, ip, lsr #32 - PAGE_SHIFT 235 movs ip, ip, lsr #32 - PAGE_SHIFT
236 beq .c2u_3fupi 236 beq .Lc2u_3fupi
237 cmp r2, ip 237 cmp r2, ip
238 movlt ip, r2 238 movlt ip, r2
239 sub r2, r2, ip 239 sub r2, r2, ip
240 subs ip, ip, #16 240 subs ip, ip, #16
241 blt .c2u_3rem8lp 241 blt .Lc2u_3rem8lp
242 242
243.c2u_3cpy8lp: mov r3, r7, pull #24 243.Lc2u_3cpy8lp: mov r3, r7, pull #24
244 ldmia r1!, {r4 - r7} 244 ldmia r1!, {r4 - r7}
245 subs ip, ip, #16 245 subs ip, ip, #16
246 orr r3, r3, r4, push #8 246 orr r3, r3, r4, push #8
@@ -251,9 +251,9 @@ USER( strt r3, [r0], #4) @ May fault
251 mov r6, r6, pull #24 251 mov r6, r6, pull #24
252 orr r6, r6, r7, push #8 252 orr r6, r6, r7, push #8
253 stmia r0!, {r3 - r6} @ Shouldnt fault 253 stmia r0!, {r3 - r6} @ Shouldnt fault
254 bpl .c2u_3cpy8lp 254 bpl .Lc2u_3cpy8lp
255 255
256.c2u_3rem8lp: tst ip, #8 256.Lc2u_3rem8lp: tst ip, #8
257 movne r3, r7, pull #24 257 movne r3, r7, pull #24
258 ldmneia r1!, {r4, r7} 258 ldmneia r1!, {r4, r7}
259 orrne r3, r3, r4, push #8 259 orrne r3, r3, r4, push #8
@@ -266,17 +266,17 @@ USER( strt r3, [r0], #4) @ May fault
266 orrne r3, r3, r7, push #8 266 orrne r3, r3, r7, push #8
267 strnet r3, [r0], #4 @ Shouldnt fault 267 strnet r3, [r0], #4 @ Shouldnt fault
268 ands ip, ip, #3 268 ands ip, ip, #3
269 beq .c2u_3fupi 269 beq .Lc2u_3fupi
270.c2u_3nowords: mov r3, r7, get_byte_3 270.Lc2u_3nowords: mov r3, r7, get_byte_3
271 teq ip, #0 271 teq ip, #0
272 beq .c2u_finished 272 beq .Lc2u_finished
273 cmp ip, #2 273 cmp ip, #2
274USER( strbt r3, [r0], #1) @ May fault 274USER( strbt r3, [r0], #1) @ May fault
275 ldrgeb r3, [r1], #1 275 ldrgeb r3, [r1], #1
276USER( strgebt r3, [r0], #1) @ May fault 276USER( strgebt r3, [r0], #1) @ May fault
277 ldrgtb r3, [r1], #0 277 ldrgtb r3, [r1], #0
278USER( strgtbt r3, [r0], #1) @ May fault 278USER( strgtbt r3, [r0], #1) @ May fault
279 b .c2u_finished 279 b .Lc2u_finished
280 280
281 .section .fixup,"ax" 281 .section .fixup,"ax"
282 .align 0 282 .align 0
@@ -290,7 +290,7 @@ USER( strgtbt r3, [r0], #1) @ May fault
290 * : n - number of bytes to copy 290 * : n - number of bytes to copy
291 * Returns : Number of bytes NOT copied. 291 * Returns : Number of bytes NOT copied.
292 */ 292 */
293.cfu_dest_not_aligned: 293.Lcfu_dest_not_aligned:
294 rsb ip, ip, #4 294 rsb ip, ip, #4
295 cmp ip, #2 295 cmp ip, #2
296USER( ldrbt r3, [r1], #1) @ May fault 296USER( ldrbt r3, [r1], #1) @ May fault
@@ -300,31 +300,32 @@ USER( ldrgebt r3, [r1], #1) @ May fault
300USER( ldrgtbt r3, [r1], #1) @ May fault 300USER( ldrgtbt r3, [r1], #1) @ May fault
301 strgtb r3, [r0], #1 301 strgtb r3, [r0], #1
302 sub r2, r2, ip 302 sub r2, r2, ip
303 b .cfu_dest_aligned 303 b .Lcfu_dest_aligned
304 304
305ENTRY(__arch_copy_from_user) 305ENTRY(__arch_copy_from_user)
306 stmfd sp!, {r0, r2, r4 - r7, lr} 306 stmfd sp!, {r0, r2, r4 - r7, lr}
307 cmp r2, #4 307 cmp r2, #4
308 blt .cfu_not_enough 308 blt .Lcfu_not_enough
309 ands ip, r0, #3 309 ands ip, r0, #3
310 bne .cfu_dest_not_aligned 310 bne .Lcfu_dest_not_aligned
311.cfu_dest_aligned: 311.Lcfu_dest_aligned:
312 ands ip, r1, #3 312 ands ip, r1, #3
313 bne .cfu_src_not_aligned 313 bne .Lcfu_src_not_aligned
314
314/* 315/*
315 * Seeing as there has to be at least 8 bytes to copy, we can 316 * Seeing as there has to be at least 8 bytes to copy, we can
316 * copy one word, and force a user-mode page fault... 317 * copy one word, and force a user-mode page fault...
317 */ 318 */
318 319
319.cfu_0fupi: subs r2, r2, #4 320.Lcfu_0fupi: subs r2, r2, #4
320 addmi ip, r2, #4 321 addmi ip, r2, #4
321 bmi .cfu_0nowords 322 bmi .Lcfu_0nowords
322USER( ldrt r3, [r1], #4) 323USER( ldrt r3, [r1], #4)
323 str r3, [r0], #4 324 str r3, [r0], #4
324 mov ip, r1, lsl #32 - PAGE_SHIFT @ On each page, use a ld/st??t instruction 325 mov ip, r1, lsl #32 - PAGE_SHIFT @ On each page, use a ld/st??t instruction
325 rsb ip, ip, #0 326 rsb ip, ip, #0
326 movs ip, ip, lsr #32 - PAGE_SHIFT 327 movs ip, ip, lsr #32 - PAGE_SHIFT
327 beq .cfu_0fupi 328 beq .Lcfu_0fupi
328/* 329/*
329 * ip = max no. of bytes to copy before needing another "strt" insn 330 * ip = max no. of bytes to copy before needing another "strt" insn
330 */ 331 */
@@ -332,16 +333,16 @@ USER( ldrt r3, [r1], #4)
332 movlt ip, r2 333 movlt ip, r2
333 sub r2, r2, ip 334 sub r2, r2, ip
334 subs ip, ip, #32 335 subs ip, ip, #32
335 blt .cfu_0rem8lp 336 blt .Lcfu_0rem8lp
336 337
337.cfu_0cpy8lp: ldmia r1!, {r3 - r6} @ Shouldnt fault 338.Lcfu_0cpy8lp: ldmia r1!, {r3 - r6} @ Shouldnt fault
338 stmia r0!, {r3 - r6} 339 stmia r0!, {r3 - r6}
339 ldmia r1!, {r3 - r6} @ Shouldnt fault 340 ldmia r1!, {r3 - r6} @ Shouldnt fault
340 subs ip, ip, #32 341 subs ip, ip, #32
341 stmia r0!, {r3 - r6} 342 stmia r0!, {r3 - r6}
342 bpl .cfu_0cpy8lp 343 bpl .Lcfu_0cpy8lp
343 344
344.cfu_0rem8lp: cmn ip, #16 345.Lcfu_0rem8lp: cmn ip, #16
345 ldmgeia r1!, {r3 - r6} @ Shouldnt fault 346 ldmgeia r1!, {r3 - r6} @ Shouldnt fault
346 stmgeia r0!, {r3 - r6} 347 stmgeia r0!, {r3 - r6}
347 tst ip, #8 348 tst ip, #8
@@ -351,34 +352,34 @@ USER( ldrt r3, [r1], #4)
351 ldrnet r3, [r1], #4 @ Shouldnt fault 352 ldrnet r3, [r1], #4 @ Shouldnt fault
352 strne r3, [r0], #4 353 strne r3, [r0], #4
353 ands ip, ip, #3 354 ands ip, ip, #3
354 beq .cfu_0fupi 355 beq .Lcfu_0fupi
355.cfu_0nowords: teq ip, #0 356.Lcfu_0nowords: teq ip, #0
356 beq .cfu_finished 357 beq .Lcfu_finished
357.cfu_nowords: cmp ip, #2 358.Lcfu_nowords: cmp ip, #2
358USER( ldrbt r3, [r1], #1) @ May fault 359USER( ldrbt r3, [r1], #1) @ May fault
359 strb r3, [r0], #1 360 strb r3, [r0], #1
360USER( ldrgebt r3, [r1], #1) @ May fault 361USER( ldrgebt r3, [r1], #1) @ May fault
361 strgeb r3, [r0], #1 362 strgeb r3, [r0], #1
362USER( ldrgtbt r3, [r1], #1) @ May fault 363USER( ldrgtbt r3, [r1], #1) @ May fault
363 strgtb r3, [r0], #1 364 strgtb r3, [r0], #1
364 b .cfu_finished 365 b .Lcfu_finished
365 366
366.cfu_not_enough: 367.Lcfu_not_enough:
367 movs ip, r2 368 movs ip, r2
368 bne .cfu_nowords 369 bne .Lcfu_nowords
369.cfu_finished: mov r0, #0 370.Lcfu_finished: mov r0, #0
370 add sp, sp, #8 371 add sp, sp, #8
371 LOADREGS(fd,sp!,{r4 - r7, pc}) 372 LOADREGS(fd,sp!,{r4 - r7, pc})
372 373
373.cfu_src_not_aligned: 374.Lcfu_src_not_aligned:
374 bic r1, r1, #3 375 bic r1, r1, #3
375USER( ldrt r7, [r1], #4) @ May fault 376USER( ldrt r7, [r1], #4) @ May fault
376 cmp ip, #2 377 cmp ip, #2
377 bgt .cfu_3fupi 378 bgt .Lcfu_3fupi
378 beq .cfu_2fupi 379 beq .Lcfu_2fupi
379.cfu_1fupi: subs r2, r2, #4 380.Lcfu_1fupi: subs r2, r2, #4
380 addmi ip, r2, #4 381 addmi ip, r2, #4
381 bmi .cfu_1nowords 382 bmi .Lcfu_1nowords
382 mov r3, r7, pull #8 383 mov r3, r7, pull #8
383USER( ldrt r7, [r1], #4) @ May fault 384USER( ldrt r7, [r1], #4) @ May fault
384 orr r3, r3, r7, push #24 385 orr r3, r3, r7, push #24
@@ -386,14 +387,14 @@ USER( ldrt r7, [r1], #4) @ May fault
386 mov ip, r1, lsl #32 - PAGE_SHIFT 387 mov ip, r1, lsl #32 - PAGE_SHIFT
387 rsb ip, ip, #0 388 rsb ip, ip, #0
388 movs ip, ip, lsr #32 - PAGE_SHIFT 389 movs ip, ip, lsr #32 - PAGE_SHIFT
389 beq .cfu_1fupi 390 beq .Lcfu_1fupi
390 cmp r2, ip 391 cmp r2, ip
391 movlt ip, r2 392 movlt ip, r2
392 sub r2, r2, ip 393 sub r2, r2, ip
393 subs ip, ip, #16 394 subs ip, ip, #16
394 blt .cfu_1rem8lp 395 blt .Lcfu_1rem8lp
395 396
396.cfu_1cpy8lp: mov r3, r7, pull #8 397.Lcfu_1cpy8lp: mov r3, r7, pull #8
397 ldmia r1!, {r4 - r7} @ Shouldnt fault 398 ldmia r1!, {r4 - r7} @ Shouldnt fault
398 subs ip, ip, #16 399 subs ip, ip, #16
399 orr r3, r3, r4, push #24 400 orr r3, r3, r4, push #24
@@ -404,9 +405,9 @@ USER( ldrt r7, [r1], #4) @ May fault
404 mov r6, r6, pull #8 405 mov r6, r6, pull #8
405 orr r6, r6, r7, push #24 406 orr r6, r6, r7, push #24
406 stmia r0!, {r3 - r6} 407 stmia r0!, {r3 - r6}
407 bpl .cfu_1cpy8lp 408 bpl .Lcfu_1cpy8lp
408 409
409.cfu_1rem8lp: tst ip, #8 410.Lcfu_1rem8lp: tst ip, #8
410 movne r3, r7, pull #8 411 movne r3, r7, pull #8
411 ldmneia r1!, {r4, r7} @ Shouldnt fault 412 ldmneia r1!, {r4, r7} @ Shouldnt fault
412 orrne r3, r3, r4, push #24 413 orrne r3, r3, r4, push #24
@@ -419,21 +420,21 @@ USER( ldrnet r7, [r1], #4) @ May fault
419 orrne r3, r3, r7, push #24 420 orrne r3, r3, r7, push #24
420 strne r3, [r0], #4 421 strne r3, [r0], #4
421 ands ip, ip, #3 422 ands ip, ip, #3
422 beq .cfu_1fupi 423 beq .Lcfu_1fupi
423.cfu_1nowords: mov r3, r7, get_byte_1 424.Lcfu_1nowords: mov r3, r7, get_byte_1
424 teq ip, #0 425 teq ip, #0
425 beq .cfu_finished 426 beq .Lcfu_finished
426 cmp ip, #2 427 cmp ip, #2
427 strb r3, [r0], #1 428 strb r3, [r0], #1
428 movge r3, r7, get_byte_2 429 movge r3, r7, get_byte_2
429 strgeb r3, [r0], #1 430 strgeb r3, [r0], #1
430 movgt r3, r7, get_byte_3 431 movgt r3, r7, get_byte_3
431 strgtb r3, [r0], #1 432 strgtb r3, [r0], #1
432 b .cfu_finished 433 b .Lcfu_finished
433 434
434.cfu_2fupi: subs r2, r2, #4 435.Lcfu_2fupi: subs r2, r2, #4
435 addmi ip, r2, #4 436 addmi ip, r2, #4
436 bmi .cfu_2nowords 437 bmi .Lcfu_2nowords
437 mov r3, r7, pull #16 438 mov r3, r7, pull #16
438USER( ldrt r7, [r1], #4) @ May fault 439USER( ldrt r7, [r1], #4) @ May fault
439 orr r3, r3, r7, push #16 440 orr r3, r3, r7, push #16
@@ -441,14 +442,15 @@ USER( ldrt r7, [r1], #4) @ May fault
441 mov ip, r1, lsl #32 - PAGE_SHIFT 442 mov ip, r1, lsl #32 - PAGE_SHIFT
442 rsb ip, ip, #0 443 rsb ip, ip, #0
443 movs ip, ip, lsr #32 - PAGE_SHIFT 444 movs ip, ip, lsr #32 - PAGE_SHIFT
444 beq .cfu_2fupi 445 beq .Lcfu_2fupi
445 cmp r2, ip 446 cmp r2, ip
446 movlt ip, r2 447 movlt ip, r2
447 sub r2, r2, ip 448 sub r2, r2, ip
448 subs ip, ip, #16 449 subs ip, ip, #16
449 blt .cfu_2rem8lp 450 blt .Lcfu_2rem8lp
451
450 452
451.cfu_2cpy8lp: mov r3, r7, pull #16 453.Lcfu_2cpy8lp: mov r3, r7, pull #16
452 ldmia r1!, {r4 - r7} @ Shouldnt fault 454 ldmia r1!, {r4 - r7} @ Shouldnt fault
453 subs ip, ip, #16 455 subs ip, ip, #16
454 orr r3, r3, r4, push #16 456 orr r3, r3, r4, push #16
@@ -459,9 +461,9 @@ USER( ldrt r7, [r1], #4) @ May fault
459 mov r6, r6, pull #16 461 mov r6, r6, pull #16
460 orr r6, r6, r7, push #16 462 orr r6, r6, r7, push #16
461 stmia r0!, {r3 - r6} 463 stmia r0!, {r3 - r6}
462 bpl .cfu_2cpy8lp 464 bpl .Lcfu_2cpy8lp
463 465
464.cfu_2rem8lp: tst ip, #8 466.Lcfu_2rem8lp: tst ip, #8
465 movne r3, r7, pull #16 467 movne r3, r7, pull #16
466 ldmneia r1!, {r4, r7} @ Shouldnt fault 468 ldmneia r1!, {r4, r7} @ Shouldnt fault
467 orrne r3, r3, r4, push #16 469 orrne r3, r3, r4, push #16
@@ -474,21 +476,21 @@ USER( ldrnet r7, [r1], #4) @ May fault
474 orrne r3, r3, r7, push #16 476 orrne r3, r3, r7, push #16
475 strne r3, [r0], #4 477 strne r3, [r0], #4
476 ands ip, ip, #3 478 ands ip, ip, #3
477 beq .cfu_2fupi 479 beq .Lcfu_2fupi
478.cfu_2nowords: mov r3, r7, get_byte_2 480.Lcfu_2nowords: mov r3, r7, get_byte_2
479 teq ip, #0 481 teq ip, #0
480 beq .cfu_finished 482 beq .Lcfu_finished
481 cmp ip, #2 483 cmp ip, #2
482 strb r3, [r0], #1 484 strb r3, [r0], #1
483 movge r3, r7, get_byte_3 485 movge r3, r7, get_byte_3
484 strgeb r3, [r0], #1 486 strgeb r3, [r0], #1
485USER( ldrgtbt r3, [r1], #0) @ May fault 487USER( ldrgtbt r3, [r1], #0) @ May fault
486 strgtb r3, [r0], #1 488 strgtb r3, [r0], #1
487 b .cfu_finished 489 b .Lcfu_finished
488 490
489.cfu_3fupi: subs r2, r2, #4 491.Lcfu_3fupi: subs r2, r2, #4
490 addmi ip, r2, #4 492 addmi ip, r2, #4
491 bmi .cfu_3nowords 493 bmi .Lcfu_3nowords
492 mov r3, r7, pull #24 494 mov r3, r7, pull #24
493USER( ldrt r7, [r1], #4) @ May fault 495USER( ldrt r7, [r1], #4) @ May fault
494 orr r3, r3, r7, push #8 496 orr r3, r3, r7, push #8
@@ -496,14 +498,14 @@ USER( ldrt r7, [r1], #4) @ May fault
496 mov ip, r1, lsl #32 - PAGE_SHIFT 498 mov ip, r1, lsl #32 - PAGE_SHIFT
497 rsb ip, ip, #0 499 rsb ip, ip, #0
498 movs ip, ip, lsr #32 - PAGE_SHIFT 500 movs ip, ip, lsr #32 - PAGE_SHIFT
499 beq .cfu_3fupi 501 beq .Lcfu_3fupi
500 cmp r2, ip 502 cmp r2, ip
501 movlt ip, r2 503 movlt ip, r2
502 sub r2, r2, ip 504 sub r2, r2, ip
503 subs ip, ip, #16 505 subs ip, ip, #16
504 blt .cfu_3rem8lp 506 blt .Lcfu_3rem8lp
505 507
506.cfu_3cpy8lp: mov r3, r7, pull #24 508.Lcfu_3cpy8lp: mov r3, r7, pull #24
507 ldmia r1!, {r4 - r7} @ Shouldnt fault 509 ldmia r1!, {r4 - r7} @ Shouldnt fault
508 orr r3, r3, r4, push #8 510 orr r3, r3, r4, push #8
509 mov r4, r4, pull #24 511 mov r4, r4, pull #24
@@ -514,9 +516,9 @@ USER( ldrt r7, [r1], #4) @ May fault
514 orr r6, r6, r7, push #8 516 orr r6, r6, r7, push #8
515 stmia r0!, {r3 - r6} 517 stmia r0!, {r3 - r6}
516 subs ip, ip, #16 518 subs ip, ip, #16
517 bpl .cfu_3cpy8lp 519 bpl .Lcfu_3cpy8lp
518 520
519.cfu_3rem8lp: tst ip, #8 521.Lcfu_3rem8lp: tst ip, #8
520 movne r3, r7, pull #24 522 movne r3, r7, pull #24
521 ldmneia r1!, {r4, r7} @ Shouldnt fault 523 ldmneia r1!, {r4, r7} @ Shouldnt fault
522 orrne r3, r3, r4, push #8 524 orrne r3, r3, r4, push #8
@@ -529,17 +531,17 @@ USER( ldrnet r7, [r1], #4) @ May fault
529 orrne r3, r3, r7, push #8 531 orrne r3, r3, r7, push #8
530 strne r3, [r0], #4 532 strne r3, [r0], #4
531 ands ip, ip, #3 533 ands ip, ip, #3
532 beq .cfu_3fupi 534 beq .Lcfu_3fupi
533.cfu_3nowords: mov r3, r7, get_byte_3 535.Lcfu_3nowords: mov r3, r7, get_byte_3
534 teq ip, #0 536 teq ip, #0
535 beq .cfu_finished 537 beq .Lcfu_finished
536 cmp ip, #2 538 cmp ip, #2
537 strb r3, [r0], #1 539 strb r3, [r0], #1
538USER( ldrgebt r3, [r1], #1) @ May fault 540USER( ldrgebt r3, [r1], #1) @ May fault
539 strgeb r3, [r0], #1 541 strgeb r3, [r0], #1
540USER( ldrgtbt r3, [r1], #1) @ May fault 542USER( ldrgtbt r3, [r1], #1) @ May fault
541 strgtb r3, [r0], #1 543 strgtb r3, [r0], #1
542 b .cfu_finished 544 b .Lcfu_finished
543 545
544 .section .fixup,"ax" 546 .section .fixup,"ax"
545 .align 0 547 .align 0