All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ralf Baechle <ralf@linux-mips.org>
To: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Cc: u1@terran.org, macro@linux-mips.org, linux-mips@linux-mips.org
Subject: Re: MIPS checksum bug
Date: Fri, 19 Sep 2008 03:14:45 +0200	[thread overview]
Message-ID: <20080919011445.GA2639@linux-mips.org> (raw)
In-Reply-To: <20080919.011704.59652451.anemo@mba.ocn.ne.jp>

On Fri, Sep 19, 2008 at 01:17:04AM +0900, Atsushi Nemoto wrote:

It seems __csum_partial_copy_user and csum_partial_copy_nocheck were
affected by the same bug.  Below a patch which tries to fix the issue.
I've tested it on 64-bit only.  I seem to observe that TCP transfers
on my test machine are ramping up to full bandwith somewhat more
slowly than on another machine but there are all sorts of reasons which
make that an unscientific test.  Anyway, I'd appreciate if people could
test this on 32-bit and 64-bit machines asap.

  Ralf

Signed-off-by: Ralf Baechle <ralf@linux-mips.org>

diff --git a/arch/mips/lib/csum_partial.S b/arch/mips/lib/csum_partial.S
index 8d77841..9143a42 100644
--- a/arch/mips/lib/csum_partial.S
+++ b/arch/mips/lib/csum_partial.S
@@ -53,12 +53,14 @@
 #define UNIT(unit)  ((unit)*NBYTES)
 
 #define ADDC(sum,reg)						\
-	.set	push;						\
-	.set	noat;						\
 	ADD	sum, reg;					\
 	sltu	v1, sum, reg;					\
 	ADD	sum, v1;					\
-	.set	pop
+
+#define ADDC32(sum,reg)						\
+	addu	sum, reg;					\
+	sltu	v1, sum, reg;					\
+	addu	sum, v1;					\
 
 #define CSUM_BIGCHUNK1(src, offset, sum, _t0, _t1, _t2, _t3)	\
 	LOAD	_t0, (offset + UNIT(0))(src);			\
@@ -263,24 +265,25 @@ LEAF(csum_partial)
 	dsra32	sum, sum, 0
 	addu	sum, v1
 #endif
-	sll	v1, sum, 16
-	addu	sum, v1
-	sltu	v1, sum, v1
-	srl	sum, sum, 16
-	addu	sum, v1
 
 	/* odd buffer alignment? */
 	beqz	t7, 1f
 	 nop
-	sll	v1, sum, 8
+#ifdef CPU_MIPSR2
+	wsbh	sum, sum	
+#else
+	li	v1, 0xff00ff
+	and	t0, sum, v1
+	sll	t0, t0, 8
 	srl	sum, sum, 8
-	or	sum, v1
-	andi	sum, 0xffff
+	and	sum, sum, v1
+	or	sum, sum, t0
+#endif
 	.set	pop
 1:
 	.set	reorder
 	/* Add the passed partial csum.  */
-	ADDC(sum, a2)
+	ADDC32(sum, a2)
 	jr	ra
 	.set	noreorder
 	END(csum_partial)
@@ -665,23 +668,24 @@ EXC(	sb	t0, NBYTES-2(dst), .Ls_exc)
 	dsra32	sum, sum, 0
 	addu	sum, v1
 #endif
-	sll	v1, sum, 16
-	addu	sum, v1
-	sltu	v1, sum, v1
-	srl	sum, sum, 16
-	addu	sum, v1
 
 	/* odd buffer alignment? */
 	beqz	odd, 1f
 	 nop
-	sll	v1, sum, 8
+#ifdef CPU_MIPSR2
+	wsbh	sum, sum
+#else
+	li	v1, 0xff00ff
+	and	t0, sum, v1
+	sll	t0, t0, 8
 	srl	sum, sum, 8
-	or	sum, v1
-	andi	sum, 0xffff
+	and	sum, sum, v1
+	or	sum, sum, t0
+#endif
 	.set	pop
 1:
 	.set reorder
-	ADDC(sum, psum)
+	ADDC32(sum, psum)
 	jr	ra
 	.set noreorder
 

  reply	other threads:[~2008-09-19  1:14 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <072748C6-07A9-4167-A8A5-80D0F7D9C784@darkforest.org>
2008-09-17  5:15 ` MIPS checksum bug Bryan Phillippe
2008-09-17 10:40   ` Maciej W. Rozycki
2008-09-17 13:23     ` Atsushi Nemoto
2008-09-17 14:46       ` Maciej W. Rozycki
2008-09-17 15:27         ` Atsushi Nemoto
2008-09-17 18:21           ` Maciej W. Rozycki
2008-09-18 22:07             ` Ralf Baechle
2008-09-19 10:12               ` Maciej W. Rozycki
2008-09-19 11:23                 ` Ralf Baechle
2008-09-19 11:47                   ` [PATCH] MIPS checksum fix Ralf Baechle
2008-09-19 12:07                     ` Ralf Baechle
2008-09-19 12:15                       ` Maciej W. Rozycki
2008-09-19 14:09                       ` Atsushi Nemoto
2008-09-19 15:02                         ` Maciej W. Rozycki
2008-09-20 15:09                         ` Ralf Baechle
2008-09-23 21:52                       ` Bryan Phillippe
2008-09-23 22:06                         ` Ralf Baechle
2008-09-29 15:28                         ` Atsushi Nemoto
2008-09-19 12:26                   ` MIPS checksum bug Maciej W. Rozycki
2008-09-19 16:04                     ` Bryan Phillippe
2008-09-17 22:52       ` Bryan Phillippe
2008-09-18 16:17         ` Atsushi Nemoto
2008-09-19  1:14           ` Ralf Baechle [this message]
2008-09-19 15:43           ` Atsushi Nemoto
2008-09-19 16:09             ` Maciej W. Rozycki
2008-09-19 16:35               ` Thiemo Seufer
2008-09-19 23:18                 ` Maciej W. Rozycki
2008-09-20  0:13               ` Ralf Baechle
2008-09-20 13:45                 ` Atsushi Nemoto
2008-09-18  4:43     ` Bryan Phillippe
2008-09-18 10:06       ` Maciej W. Rozycki

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080919011445.GA2639@linux-mips.org \
    --to=ralf@linux-mips.org \
    --cc=anemo@mba.ocn.ne.jp \
    --cc=linux-mips@linux-mips.org \
    --cc=macro@linux-mips.org \
    --cc=u1@terran.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.