[MIPS] Fix wrong checksum calculation on 64-bit MIPS
The commit 8e3d8433d8
([NET]: MIPS
checksum annotations and cleanups) broke 64-bit MIPS.
The problem is the commit replaces some unsigned long with __be32. On
64bit MIPS, a __be32 (i.e. unsigned int) value is represented as a
sign-extented 32-bit value in a 64-bit argument register. So the
address 192.168.0.1 (0xc0a80001) is passed as 0xffffffffc0a80001 to
csum_tcpudp_nofold() but the asm code in the function expects
0x00000000c0a80001, therefore it returns a wrong checksum. Explicit
cast to unsigned long is needed to drop high 32bit.
Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
parent
9cfdf6f15a
commit
66218da212
|
@ -159,7 +159,8 @@ static inline __wsum csum_tcpudp_nofold(__be32 saddr,
|
|||
#endif
|
||||
" .set pop"
|
||||
: "=r" (sum)
|
||||
: "0" (daddr), "r"(saddr),
|
||||
: "0" ((__force unsigned long)daddr),
|
||||
"r" ((__force unsigned long)saddr),
|
||||
#ifdef __MIPSEL__
|
||||
"r" ((proto + len) << 8),
|
||||
#else
|
||||
|
|
Loading…
Reference in New Issue