1
2
3
4
5
6
7
8
9
10#include <linux/linkage.h>
11#include <asm/assembler.h>
12
13 .text
14
15
16
17
18
19
20
21buf .req r0
22len .req r1
23sum .req r2
24td0 .req r3
25td1 .req r4 @ save before use
26td2 .req r5 @ save before use
27td3 .req lr
28
29.Lzero: mov r0, sum
30 add sp, sp,
31 ldr pc, [sp],
32
33
34
35
36
37.Lless8: teq len,
38 beq .Lzero
39
40
41 tst buf,
42 movne sum, sum, ror
43 ldrneb td0, [buf],
44 subne len, len,
45 adcnes sum, sum, td0, put_byte_1
46
47.Lless4: tst len,
48 beq .Lless8_byte
49
50
51
52.Lless8_wordlp:
53
54 ldrh td0, [buf],
55 sub len, len,
56#else
57 ldrb td0, [buf],
58 ldrb td3, [buf],
59 sub len, len,
60#ifndef __ARMEB__
61 orr td0, td0, td3, lsl
62#else
63 orr td0, td3, td0, lsl
64#endif
65#endif
66 adcs sum, sum, td0
67 tst len,
68 bne .Lless8_wordlp
69
70.Lless8_byte: tst len,
71 ldrneb td0, [buf],
72 adcnes sum, sum, td0, put_byte_0 @ update checksum
73
74.Ldone: adc r0, sum,
75 ldr td0, [sp],
76 tst td0,
77 movne r0, r0, ror
78 ldr pc, [sp],
79
80.Lnot_aligned: tst buf,
81 ldrneb td0, [buf],
82 subne len, len,
83 adcnes sum, sum, td0, put_byte_1 @ update checksum
84
85 tst buf,
86
87 ldrneh td0, [buf],
88 subne len, len,
89#else
90 ldrneb td0, [buf],
91 ldrneb ip, [buf],
92 subne len, len,
93#ifndef __ARMEB__
94 orrne td0, td0, ip, lsl
95#else
96 orrne td0, ip, td0, lsl
97#endif
98#endif
99 adcnes sum, sum, td0 @ update checksum
100 mov pc, lr
101
102ENTRY(csum_partial)
103 stmfd sp!, {buf, lr}
104 cmp len,
105 blo .Lless8 @ 8 bytes to copy.
106
107 tst buf,
108 movne sum, sum, ror
109
110 adds sum, sum,
111 tst buf,
112 blne .Lnot_aligned @ align destination, return here
113
1141: bics ip, len,
115 beq 3f
116
117 stmfd sp!, {r4 - r5}
1182: ldmia buf!, {td0, td1, td2, td3}
119 adcs sum, sum, td0
120 adcs sum, sum, td1
121 adcs sum, sum, td2
122 adcs sum, sum, td3
123 ldmia buf!, {td0, td1, td2, td3}
124 adcs sum, sum, td0
125 adcs sum, sum, td1
126 adcs sum, sum, td2
127 adcs sum, sum, td3
128 sub ip, ip,
129 teq ip,
130 bne 2b
131 ldmfd sp!, {r4 - r5}
132
1333: tst len,
134 beq .Lless4
135
1364: ldr td0, [buf],
137 sub len, len,
138 adcs sum, sum, td0
139 tst len,
140 bne 4b
141 b .Lless4
142ENDPROC(csum_partial)
143