|
@@ -124,6 +124,11 @@ extern int __get_user_bad(void);
|
|
|
|
|
|
#define __uaccess_begin() stac()
|
|
#define __uaccess_begin() stac()
|
|
#define __uaccess_end() clac()
|
|
#define __uaccess_end() clac()
|
|
|
|
+#define __uaccess_begin_nospec() \
|
|
|
|
+({ \
|
|
|
|
+ stac(); \
|
|
|
|
+ barrier_nospec(); \
|
|
|
|
+})
|
|
|
|
|
|
/*
|
|
/*
|
|
* This is a type: either unsigned long, if the argument fits into
|
|
* This is a type: either unsigned long, if the argument fits into
|
|
@@ -487,6 +492,10 @@ struct __large_struct { unsigned long buf[100]; };
|
|
__uaccess_begin(); \
|
|
__uaccess_begin(); \
|
|
barrier();
|
|
barrier();
|
|
|
|
|
|
|
|
+#define uaccess_try_nospec do { \
|
|
|
|
+ current->thread.uaccess_err = 0; \
|
|
|
|
+ __uaccess_begin_nospec(); \
|
|
|
|
+
|
|
#define uaccess_catch(err) \
|
|
#define uaccess_catch(err) \
|
|
__uaccess_end(); \
|
|
__uaccess_end(); \
|
|
(err) |= (current->thread.uaccess_err ? -EFAULT : 0); \
|
|
(err) |= (current->thread.uaccess_err ? -EFAULT : 0); \
|