Skip to content

Commit b80a1b8

Browse files
atsushi-nemotoralfbaechle
authored andcommitted
[MIPS] Fix 64-bit IP checksum code
Use unsigned loads to avoid possible misscalculation of IP checksums. This bug was instruced in f761106cd728bcf65b7fe161b10221ee00cf7132 (lmo) / ed99e2b (kernel.org). [Original fix by Atsushi. Improved instruction scheduling and fix for unaligned unsigned load by me -- Ralf] Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp> Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
1 parent 9824b8f commit b80a1b8

File tree

1 file changed

+17
-4
lines changed

1 file changed

+17
-4
lines changed

arch/mips/lib/csum_partial.S

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,14 @@
3939
#ifdef USE_DOUBLE
4040

4141
#define LOAD ld
42+
#define LOAD32 lwu
4243
#define ADD daddu
4344
#define NBYTES 8
4445

4546
#else
4647

4748
#define LOAD lw
49+
#define LOAD32 lw
4850
#define ADD addu
4951
#define NBYTES 4
5052

@@ -60,6 +62,14 @@
6062
ADD sum, v1; \
6163
.set pop
6264

65+
#define ADDC32(sum,reg) \
66+
.set push; \
67+
.set noat; \
68+
addu sum, reg; \
69+
sltu v1, sum, reg; \
70+
addu sum, v1; \
71+
.set pop
72+
6373
#define CSUM_BIGCHUNK1(src, offset, sum, _t0, _t1, _t2, _t3) \
6474
LOAD _t0, (offset + UNIT(0))(src); \
6575
LOAD _t1, (offset + UNIT(1))(src); \
@@ -132,7 +142,7 @@ LEAF(csum_partial)
132142
beqz t8, .Lqword_align
133143
andi t8, src, 0x8
134144

135-
lw t0, 0x00(src)
145+
LOAD32 t0, 0x00(src)
136146
LONG_SUBU a1, a1, 0x4
137147
ADDC(sum, t0)
138148
PTR_ADDU src, src, 0x4
@@ -211,7 +221,7 @@ LEAF(csum_partial)
211221
LONG_SRL t8, t8, 0x2
212222

213223
.Lend_words:
214-
lw t0, (src)
224+
LOAD32 t0, (src)
215225
LONG_SUBU t8, t8, 0x1
216226
ADDC(sum, t0)
217227
.set reorder /* DADDI_WAR */
@@ -230,6 +240,9 @@ LEAF(csum_partial)
230240
/* Still a full word to go */
231241
ulw t1, (src)
232242
PTR_ADDIU src, 4
243+
#ifdef USE_DOUBLE
244+
dsll t1, t1, 32 /* clear lower 32bit */
245+
#endif
233246
ADDC(sum, t1)
234247

235248
1: move t1, zero
@@ -280,7 +293,7 @@ LEAF(csum_partial)
280293
1:
281294
.set reorder
282295
/* Add the passed partial csum. */
283-
ADDC(sum, a2)
296+
ADDC32(sum, a2)
284297
jr ra
285298
.set noreorder
286299
END(csum_partial)
@@ -681,7 +694,7 @@ EXC( sb t0, NBYTES-2(dst), .Ls_exc)
681694
.set pop
682695
1:
683696
.set reorder
684-
ADDC(sum, psum)
697+
ADDC32(sum, psum)
685698
jr ra
686699
.set noreorder
687700

0 commit comments

Comments
 (0)