Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=66218da212bf141532d678a699f5789c78145ab1
Commit:     66218da212bf141532d678a699f5789c78145ab1
Parent:     9cfdf6f15a2a462b6b328b4c60b252cfc04ec03e
Author:     Atsushi Nemoto <[EMAIL PROTECTED]>
AuthorDate: Wed Jan 24 15:43:34 2007 +0900
Committer:  Ralf Baechle <[EMAIL PROTECTED]>
CommitDate: Wed Jan 24 19:23:22 2007 +0000

    [MIPS] Fix wrong checksum calculation on 64-bit MIPS
    
    The commit 8e3d8433d8c22ca6c42cba4a67d300c39aae7822 ([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 <[EMAIL PROTECTED]>
    Signed-off-by: Ralf Baechle <[EMAIL PROTECTED]>
---
 include/asm-mips/checksum.h |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/include/asm-mips/checksum.h b/include/asm-mips/checksum.h
index 24cdcc6..20a81e1 100644
--- a/include/asm-mips/checksum.h
+++ b/include/asm-mips/checksum.h
@@ -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
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to