|
|
@@ -525,8 +525,6 @@ struct __large_struct { unsigned long buf[100]; };
|
|
|
*/
|
|
|
#define get_user_try uaccess_try
|
|
|
#define get_user_catch(err) uaccess_catch(err)
|
|
|
-#define put_user_try uaccess_try
|
|
|
-#define put_user_catch(err) uaccess_catch(err)
|
|
|
|
|
|
#define get_user_ex(x, ptr) do { \
|
|
|
unsigned long __gue_val; \
|
|
|
@@ -534,9 +532,29 @@ struct __large_struct { unsigned long buf[100]; };
|
|
|
(x) = (__force __typeof__(*(ptr)))__gue_val; \
|
|
|
} while (0)
|
|
|
|
|
|
+#ifdef CONFIG_X86_WP_WORKS_OK
|
|
|
+
|
|
|
+#define put_user_try uaccess_try
|
|
|
+#define put_user_catch(err) uaccess_catch(err)
|
|
|
+
|
|
|
#define put_user_ex(x, ptr) \
|
|
|
__put_user_size_ex((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr)))
|
|
|
|
|
|
+#else /* !CONFIG_X86_WP_WORKS_OK */
|
|
|
+
|
|
|
+#define put_user_try do { \
|
|
|
+ int __uaccess_err = 0;
|
|
|
+
|
|
|
+#define put_user_catch(err) \
|
|
|
+ (err) |= __uaccess_err; \
|
|
|
+} while (0)
|
|
|
+
|
|
|
+#define put_user_ex(x, ptr) do { \
|
|
|
+ __uaccess_err |= __put_user(x, ptr); \
|
|
|
+} while (0)
|
|
|
+
|
|
|
+#endif /* CONFIG_X86_WP_WORKS_OK */
|
|
|
+
|
|
|
/*
|
|
|
* movsl can be slow when source and dest are not both 8-byte aligned
|
|
|
*/
|