1
2
3
4
5
6
7
8
9
10
11 #include <linux/sys.h>
12 #include <asm/processor.h>
13 #include <asm/errno.h>
14 #include <asm/ppc_asm.h>
15 #include <asm/export.h>
16
17
18
19
20
21
22
23 _GLOBAL(__csum_partial)
24 addic r0,r5,0
25
26 srdi. r6,r4,3
27 beq .Lcsum_tail_word
28
29
30
31
32
33
34
35 rldicl. r6,r3,64-1,64-2
36 beq .Lcsum_aligned
37
38 li r7,4
39 sub r6,r7,r6
40 mtctr r6
41
42 1:
43 lhz r6,0(r3)
44 subi r4,r4,2
45 addi r3,r3,2
46 adde r0,r0,r6
47 bdnz 1b
48
49 .Lcsum_aligned:
50
51
52
53
54
55 srdi. r6,r4,7
56 beq .Lcsum_tail_doublewords
57
58 srdi r6,r4,6
59 subi r6,r6,1
60 mtctr r6
61
62 stdu r1,-STACKFRAMESIZE(r1)
63 std r14,STK_REG(R14)(r1)
64 std r15,STK_REG(R15)(r1)
65 std r16,STK_REG(R16)(r1)
66
67 ld r6,0(r3)
68 ld r9,8(r3)
69
70 ld r10,16(r3)
71 ld r11,24(r3)
72
73
74
75
76
77
78
79 .align 5
80 2:
81 adde r0,r0,r6
82 ld r12,32(r3)
83 ld r14,40(r3)
84
85 adde r0,r0,r9
86 ld r15,48(r3)
87 ld r16,56(r3)
88 addi r3,r3,64
89
90 adde r0,r0,r10
91
92 adde r0,r0,r11
93
94 adde r0,r0,r12
95
96 adde r0,r0,r14
97
98 adde r0,r0,r15
99 ld r6,0(r3)
100 ld r9,8(r3)
101
102 adde r0,r0,r16
103 ld r10,16(r3)
104 ld r11,24(r3)
105 bdnz 2b
106
107
108 adde r0,r0,r6
109 ld r12,32(r3)
110 ld r14,40(r3)
111
112 adde r0,r0,r9
113 ld r15,48(r3)
114 ld r16,56(r3)
115 addi r3,r3,64
116
117 adde r0,r0,r10
118 adde r0,r0,r11
119 adde r0,r0,r12
120 adde r0,r0,r14
121 adde r0,r0,r15
122 adde r0,r0,r16
123
124 ld r14,STK_REG(R14)(r1)
125 ld r15,STK_REG(R15)(r1)
126 ld r16,STK_REG(R16)(r1)
127 addi r1,r1,STACKFRAMESIZE
128
129 andi. r4,r4,63
130
131 .Lcsum_tail_doublewords:
132 srdi. r6,r4,3
133 beq .Lcsum_tail_word
134
135 mtctr r6
136 3:
137 ld r6,0(r3)
138 addi r3,r3,8
139 adde r0,r0,r6
140 bdnz 3b
141
142 andi. r4,r4,7
143
144 .Lcsum_tail_word:
145 srdi. r6,r4,2
146 beq .Lcsum_tail_halfword
147
148 lwz r6,0(r3)
149 addi r3,r3,4
150 adde r0,r0,r6
151 subi r4,r4,4
152
153 .Lcsum_tail_halfword:
154 srdi. r6,r4,1
155 beq .Lcsum_tail_byte
156
157 lhz r6,0(r3)
158 addi r3,r3,2
159 adde r0,r0,r6
160 subi r4,r4,2
161
162 .Lcsum_tail_byte:
163 andi. r6,r4,1
164 beq .Lcsum_finish
165
166 lbz r6,0(r3)
167 #ifdef __BIG_ENDIAN__
168 sldi r9,r6,8
169 adde r0,r0,r9
170 #else
171 adde r0,r0,r6
172 #endif
173
174 .Lcsum_finish:
175 addze r0,r0
176 rldicl r4,r0,32,0
177 add r3,r4,r0
178 srdi r3,r3,32
179 blr
180 EXPORT_SYMBOL(__csum_partial)
181
182
183 .macro srcnr
184 100:
185 EX_TABLE(100b,.Lsrc_error_nr)
186 .endm
187
188 .macro source
189 150:
190 EX_TABLE(150b,.Lsrc_error)
191 .endm
192
193 .macro dstnr
194 200:
195 EX_TABLE(200b,.Ldest_error_nr)
196 .endm
197
198 .macro dest
199 250:
200 EX_TABLE(250b,.Ldest_error)
201 .endm
202
203
204
205
206
207
208
209
210
211
212 _GLOBAL(csum_partial_copy_generic)
213 addic r0,r6,0
214
215 srdi. r6,r5,3
216 beq .Lcopy_tail_word
217
218
219
220
221
222
223
224
225
226
227 rldicl. r6,r3,64-1,64-2
228 beq .Lcopy_aligned
229
230 li r9,4
231 sub r6,r9,r6
232 mtctr r6
233
234 1:
235 srcnr; lhz r6,0(r3)
236 subi r5,r5,2
237 addi r3,r3,2
238 adde r0,r0,r6
239 dstnr; sth r6,0(r4)
240 addi r4,r4,2
241 bdnz 1b
242
243 .Lcopy_aligned:
244
245
246
247
248
249 srdi. r6,r5,7
250 beq .Lcopy_tail_doublewords
251
252 srdi r6,r5,6
253 subi r6,r6,1
254 mtctr r6
255
256 stdu r1,-STACKFRAMESIZE(r1)
257 std r14,STK_REG(R14)(r1)
258 std r15,STK_REG(R15)(r1)
259 std r16,STK_REG(R16)(r1)
260
261 source; ld r6,0(r3)
262 source; ld r9,8(r3)
263
264 source; ld r10,16(r3)
265 source; ld r11,24(r3)
266
267
268
269
270
271
272
273 .align 5
274 2:
275 adde r0,r0,r6
276 source; ld r12,32(r3)
277 source; ld r14,40(r3)
278
279 adde r0,r0,r9
280 source; ld r15,48(r3)
281 source; ld r16,56(r3)
282 addi r3,r3,64
283
284 adde r0,r0,r10
285 dest; std r6,0(r4)
286 dest; std r9,8(r4)
287
288 adde r0,r0,r11
289 dest; std r10,16(r4)
290 dest; std r11,24(r4)
291
292 adde r0,r0,r12
293 dest; std r12,32(r4)
294 dest; std r14,40(r4)
295
296 adde r0,r0,r14
297 dest; std r15,48(r4)
298 dest; std r16,56(r4)
299 addi r4,r4,64
300
301 adde r0,r0,r15
302 source; ld r6,0(r3)
303 source; ld r9,8(r3)
304
305 adde r0,r0,r16
306 source; ld r10,16(r3)
307 source; ld r11,24(r3)
308 bdnz 2b
309
310
311 adde r0,r0,r6
312 source; ld r12,32(r3)
313 source; ld r14,40(r3)
314
315 adde r0,r0,r9
316 source; ld r15,48(r3)
317 source; ld r16,56(r3)
318 addi r3,r3,64
319
320 adde r0,r0,r10
321 dest; std r6,0(r4)
322 dest; std r9,8(r4)
323
324 adde r0,r0,r11
325 dest; std r10,16(r4)
326 dest; std r11,24(r4)
327
328 adde r0,r0,r12
329 dest; std r12,32(r4)
330 dest; std r14,40(r4)
331
332 adde r0,r0,r14
333 dest; std r15,48(r4)
334 dest; std r16,56(r4)
335 addi r4,r4,64
336
337 adde r0,r0,r15
338 adde r0,r0,r16
339
340 ld r14,STK_REG(R14)(r1)
341 ld r15,STK_REG(R15)(r1)
342 ld r16,STK_REG(R16)(r1)
343 addi r1,r1,STACKFRAMESIZE
344
345 andi. r5,r5,63
346
347 .Lcopy_tail_doublewords:
348 srdi. r6,r5,3
349 beq .Lcopy_tail_word
350
351 mtctr r6
352 3:
353 srcnr; ld r6,0(r3)
354 addi r3,r3,8
355 adde r0,r0,r6
356 dstnr; std r6,0(r4)
357 addi r4,r4,8
358 bdnz 3b
359
360 andi. r5,r5,7
361
362 .Lcopy_tail_word:
363 srdi. r6,r5,2
364 beq .Lcopy_tail_halfword
365
366 srcnr; lwz r6,0(r3)
367 addi r3,r3,4
368 adde r0,r0,r6
369 dstnr; stw r6,0(r4)
370 addi r4,r4,4
371 subi r5,r5,4
372
373 .Lcopy_tail_halfword:
374 srdi. r6,r5,1
375 beq .Lcopy_tail_byte
376
377 srcnr; lhz r6,0(r3)
378 addi r3,r3,2
379 adde r0,r0,r6
380 dstnr; sth r6,0(r4)
381 addi r4,r4,2
382 subi r5,r5,2
383
384 .Lcopy_tail_byte:
385 andi. r6,r5,1
386 beq .Lcopy_finish
387
388 srcnr; lbz r6,0(r3)
389 #ifdef __BIG_ENDIAN__
390 sldi r9,r6,8
391 adde r0,r0,r9
392 #else
393 adde r0,r0,r6
394 #endif
395 dstnr; stb r6,0(r4)
396
397 .Lcopy_finish:
398 addze r0,r0
399 rldicl r4,r0,32,0
400 add r3,r4,r0
401 srdi r3,r3,32
402 blr
403
404 .Lsrc_error:
405 ld r14,STK_REG(R14)(r1)
406 ld r15,STK_REG(R15)(r1)
407 ld r16,STK_REG(R16)(r1)
408 addi r1,r1,STACKFRAMESIZE
409 .Lsrc_error_nr:
410 cmpdi 0,r7,0
411 beqlr
412 li r6,-EFAULT
413 stw r6,0(r7)
414 blr
415
416 .Ldest_error:
417 ld r14,STK_REG(R14)(r1)
418 ld r15,STK_REG(R15)(r1)
419 ld r16,STK_REG(R16)(r1)
420 addi r1,r1,STACKFRAMESIZE
421 .Ldest_error_nr:
422 cmpdi 0,r8,0
423 beqlr
424 li r6,-EFAULT
425 stw r6,0(r8)
426 blr
427 EXPORT_SYMBOL(csum_partial_copy_generic)
428
429
430
431
432
433
434
435 _GLOBAL(csum_ipv6_magic)
436 ld r8, 0(r3)
437 ld r9, 8(r3)
438 add r5, r5, r6
439 addc r0, r8, r9
440 ld r10, 0(r4)
441 ld r11, 8(r4)
442 #ifdef CONFIG_CPU_LITTLE_ENDIAN
443 rotldi r5, r5, 8
444 #endif
445 adde r0, r0, r10
446 add r5, r5, r7
447 adde r0, r0, r11
448 adde r0, r0, r5
449 addze r0, r0
450 rotldi r3, r0, 32
451 add r3, r0, r3
452 srdi r0, r3, 32
453 rotlwi r3, r0, 16
454 add r3, r0, r3
455 not r3, r3
456 rlwinm r3, r3, 16, 16, 31
457 blr
458 EXPORT_SYMBOL(csum_ipv6_magic)