浏览代码

sh: Proper __put_user_asm() size mismatch fix.

This fixes up the workaround in 2b4b2bb42137c779ef0084de5df66ff21b4cd86e
and cleans up __put_user_asm() to get the sizing right from the onset.

Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
OGAWA Hirofumi 17 年之前
父节点
当前提交
6de9c6481d
共有 2 个文件被更改,包括 5 次插入4 次删除
  1. 4 2
      arch/sh/include/asm/uaccess.h
  2. 1 2
      arch/sh/include/asm/uaccess_32.h

+ 4 - 2
arch/sh/include/asm/uaccess.h

@@ -77,8 +77,9 @@ struct __large_struct { unsigned long buf[100]; };
 ({								\
 	long __pu_err;						\
 	__typeof__(*(ptr)) __user *__pu_addr = (ptr);		\
+	__typeof__(*(ptr)) __pu_val = x;			\
 	__chk_user_ptr(ptr);					\
-	__put_user_size((x), __pu_addr, (size), __pu_err);	\
+	__put_user_size(__pu_val, __pu_addr, (size), __pu_err);	\
 	__pu_err;						\
 })
 
@@ -86,8 +87,9 @@ struct __large_struct { unsigned long buf[100]; };
 ({								\
 	long __pu_err = -EFAULT;				\
 	__typeof__(*(ptr)) __user *__pu_addr = (ptr);		\
+	__typeof__(*(ptr)) __pu_val = x;			\
 	if (likely(access_ok(VERIFY_WRITE, __pu_addr, size)))	\
-		__put_user_size((x), __pu_addr, (size),		\
+		__put_user_size(__pu_val, __pu_addr, (size),	\
 				__pu_err);			\
 	__pu_err;						\
 })

+ 1 - 2
arch/sh/include/asm/uaccess_32.h

@@ -76,8 +76,7 @@ do {							\
 		__put_user_asm(x, ptr, retval, "w");	\
 		break;					\
 	case 4:						\
-		__put_user_asm((u32)x, ptr,		\
-			       retval, "l");		\
+		__put_user_asm(x, ptr, retval, "l");	\
 		break;					\
 	case 8:						\
 		__put_user_u64(x, ptr, retval);		\