From: Ralf Baechle Date: Tue, 20 Sep 2005 10:56:26 +0000 (+0000) Subject: The type of sum in csum_tcpudp_nofold is "unsigned int", so when we assign X-Git-Tag: v2.6.15-rc1~731^2~1^2~64 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e97288386a316e3960b758a60ae7cd17b3ee10e7;p=linux-2.6 The type of sum in csum_tcpudp_nofold is "unsigned int", so when we assign to it in an asm() block, and we're running on a system with 64-bit registers, it is vitally important that we sign extend it correctly before returning to C. Otherwise the stray high bits will be preserved into csum_fold, and on the SB-1 processor, 32-bit arithmetic on a non sign-extended register will yield surprising results. This caused incorrect checksums in some UDP packets for NFS root. The problem was mild when using a 10.0.1.x IP address, but severe when using 192.168.1.x. Signed-off-by: Daniel Jacobowitz Signed-off-by: Ralf Baechle --- diff --git a/include/asm-mips/checksum.h b/include/asm-mips/checksum.h index 2ff53db8c0..b09f8971e9 100644 --- a/include/asm-mips/checksum.h +++ b/include/asm-mips/checksum.h @@ -150,7 +150,7 @@ static inline unsigned int csum_tcpudp_nofold(unsigned long saddr, " daddu %0, %4 \n" " dsll32 $1, %0, 0 \n" " daddu %0, $1 \n" - " dsrl32 %0, %0, 0 \n" + " dsra32 %0, %0, 0 \n" #endif " .set pop" : "=r" (sum)