[MIPS] Fixes for uaccess.h with gcc >= 4.0.1
Atsushi Nemoto [Tue, 14 Feb 2006 06:57:50 +0000 (15:57 +0900)]
It seems current get_user() incorrectly sign-extend an unsigned int
value on 64bit kernel.  I think this is because '(__typeof__(val))'
cast in final assignment.  I suppose the cast should be
'(__typeof__(*(addr))'.

Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>

include/asm-mips/uaccess.h

index 7a553e9..b96f3e0 100644 (file)
@@ -233,7 +233,7 @@ do {                                                                        \
 #define __get_user_check(x,ptr,size)                                   \
 ({                                                                     \
        long __gu_err = -EFAULT;                                        \
-       const void __user * __gu_ptr = (ptr);                           \
+       const __typeof__(*(ptr)) __user * __gu_ptr = (ptr);             \
                                                                        \
        if (likely(access_ok(VERIFY_READ,  __gu_ptr, size)))            \
                __get_user_common((x), size, __gu_ptr);                 \
@@ -258,7 +258,7 @@ do {                                                                        \
        : "=r" (__gu_err), "=r" (__gu_tmp)                              \
        : "0" (0), "o" (__m(addr)), "i" (-EFAULT));                     \
                                                                        \
-       (val) = (__typeof__(val)) __gu_tmp;                             \
+       (val) = (__typeof__(*(addr))) __gu_tmp;                         \
 }
 
 /*
@@ -284,7 +284,7 @@ do {                                                                        \
        "       .previous                                       \n"     \
        : "=r" (__gu_err), "=&r" (__gu_tmp)                             \
        : "0" (0), "r" (addr), "i" (-EFAULT));                          \
-       (val) = __gu_tmp;                                               \
+       (val) = (__typeof__(*(addr))) __gu_tmp;                         \
 }
 
 /*