提交 8ecbbcaf 编写于 作者: A Atsushi Nemoto 提交者: Ralf Baechle

[MIPS] Fixes for uaccess.h with gcc >= 4.0.1

    
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: NAtsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: NRalf Baechle <ralf@linux-mips.org>
上级 36ccf1c0
...@@ -233,7 +233,7 @@ do { \ ...@@ -233,7 +233,7 @@ do { \
#define __get_user_check(x,ptr,size) \ #define __get_user_check(x,ptr,size) \
({ \ ({ \
long __gu_err = -EFAULT; \ 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))) \ if (likely(access_ok(VERIFY_READ, __gu_ptr, size))) \
__get_user_common((x), size, __gu_ptr); \ __get_user_common((x), size, __gu_ptr); \
...@@ -258,7 +258,7 @@ do { \ ...@@ -258,7 +258,7 @@ do { \
: "=r" (__gu_err), "=r" (__gu_tmp) \ : "=r" (__gu_err), "=r" (__gu_tmp) \
: "0" (0), "o" (__m(addr)), "i" (-EFAULT)); \ : "0" (0), "o" (__m(addr)), "i" (-EFAULT)); \
\ \
(val) = (__typeof__(val)) __gu_tmp; \ (val) = (__typeof__(*(addr))) __gu_tmp; \
} }
/* /*
...@@ -284,7 +284,7 @@ do { \ ...@@ -284,7 +284,7 @@ do { \
" .previous \n" \ " .previous \n" \
: "=r" (__gu_err), "=&r" (__gu_tmp) \ : "=r" (__gu_err), "=&r" (__gu_tmp) \
: "0" (0), "r" (addr), "i" (-EFAULT)); \ : "0" (0), "r" (addr), "i" (-EFAULT)); \
(val) = __gu_tmp; \ (val) = (__typeof__(*(addr))) __gu_tmp; \
} }
/* /*
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册