aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/nds32/include/asm/uaccess.h80
1 files changed, 41 insertions, 39 deletions
diff --git a/arch/nds32/include/asm/uaccess.h b/arch/nds32/include/asm/uaccess.h
index e1a2b5b749b9..362a32d9bd16 100644
--- a/arch/nds32/include/asm/uaccess.h
+++ b/arch/nds32/include/asm/uaccess.h
@@ -75,54 +75,54 @@ static inline void set_fs(mm_segment_t fs)
75 * versions are void (ie, don't return a value as such). 75 * versions are void (ie, don't return a value as such).
76 */ 76 */
77 77
78#define get_user(x, ptr) \ 78#define get_user __get_user \
79({ \
80 long __e = -EFAULT; \
81 const __typeof__(*(ptr)) __user *__p = (ptr); \
82 if (likely(access_ok(VERIFY_READ, __p, sizeof(*__p)))) { \
83 __e = __get_user(x, __p); \
84 } else { \
85 (x) = 0; \
86 } \
87 __e; \
88})
89 79
90#define __get_user(x, ptr) \ 80#define __get_user(x, ptr) \
91({ \ 81({ \
92 long __gu_err = 0; \ 82 long __gu_err = 0; \
93 __get_user_err((x), (ptr), __gu_err); \ 83 __get_user_check((x), (ptr), __gu_err); \
94 __gu_err; \ 84 __gu_err; \
95}) 85})
96 86
97#define __get_user_error(x, ptr, err) \ 87#define __get_user_error(x, ptr, err) \
98({ \ 88({ \
99 __get_user_err((x), (ptr), err); \ 89 __get_user_check((x), (ptr), (err)); \
100 (void)0; \ 90 (void)0; \
101}) 91})
102 92
93#define __get_user_check(x, ptr, err) \
94({ \
95 const __typeof__(*(ptr)) __user *__p = (ptr); \
96 might_fault(); \
97 if (access_ok(VERIFY_READ, __p, sizeof(*__p))) { \
98 __get_user_err((x), __p, (err)); \
99 } else { \
100 (x) = 0; (err) = -EFAULT; \
101 } \
102})
103
103#define __get_user_err(x, ptr, err) \ 104#define __get_user_err(x, ptr, err) \
104do { \ 105do { \
105 const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \
106 unsigned long __gu_val; \ 106 unsigned long __gu_val; \
107 __chk_user_ptr(__gu_addr); \ 107 __chk_user_ptr(ptr); \
108 switch (sizeof(*(__gu_addr))) { \ 108 switch (sizeof(*(ptr))) { \
109 case 1: \ 109 case 1: \
110 __get_user_asm("lbi", __gu_val, __gu_addr, (err)); \ 110 __get_user_asm("lbi", __gu_val, (ptr), (err)); \
111 break; \ 111 break; \
112 case 2: \ 112 case 2: \
113 __get_user_asm("lhi", __gu_val, __gu_addr, (err)); \ 113 __get_user_asm("lhi", __gu_val, (ptr), (err)); \
114 break; \ 114 break; \
115 case 4: \ 115 case 4: \
116 __get_user_asm("lwi", __gu_val, __gu_addr, (err)); \ 116 __get_user_asm("lwi", __gu_val, (ptr), (err)); \
117 break; \ 117 break; \
118 case 8: \ 118 case 8: \
119 __get_user_asm_dword(__gu_val, __gu_addr, (err)); \ 119 __get_user_asm_dword(__gu_val, (ptr), (err)); \
120 break; \ 120 break; \
121 default: \ 121 default: \
122 BUILD_BUG(); \ 122 BUILD_BUG(); \
123 break; \ 123 break; \
124 } \ 124 } \
125 (x) = (__typeof__(*(__gu_addr)))__gu_val; \ 125 (x) = (__force __typeof__(*(ptr)))__gu_val; \
126} while (0) 126} while (0)
127 127
128#define __get_user_asm(inst, x, addr, err) \ 128#define __get_user_asm(inst, x, addr, err) \
@@ -170,15 +170,7 @@ do { \
170 : "r"(addr), "i"(-EFAULT) \ 170 : "r"(addr), "i"(-EFAULT) \
171 : "cc") 171 : "cc")
172 172
173#define put_user(x, ptr) \ 173#define put_user __put_user \
174({ \
175 long __e = -EFAULT; \
176 __typeof__(*(ptr)) __user *__p = (ptr); \
177 if (likely(access_ok(VERIFY_WRITE, __p, sizeof(*__p)))) { \
178 __e = __put_user(x, __p); \
179 } \
180 __e; \
181})
182 174
183#define __put_user(x, ptr) \ 175#define __put_user(x, ptr) \
184({ \ 176({ \
@@ -189,27 +181,37 @@ do { \
189 181
190#define __put_user_error(x, ptr, err) \ 182#define __put_user_error(x, ptr, err) \
191({ \ 183({ \
192 __put_user_err((x), (ptr), err); \ 184 __put_user_err((x), (ptr), (err)); \
193 (void)0; \ 185 (void)0; \
194}) 186})
195 187
188#define __put_user_check(x, ptr, err) \
189({ \
190 __typeof__(*(ptr)) __user *__p = (ptr); \
191 might_fault(); \
192 if (access_ok(VERIFY_WRITE, __p, sizeof(*__p))) { \
193 __put_user_err((x), __p, (err)); \
194 } else { \
195 (err) = -EFAULT; \
196 } \
197})
198
196#define __put_user_err(x, ptr, err) \ 199#define __put_user_err(x, ptr, err) \
197do { \ 200do { \
198 __typeof__(*(ptr)) __user *__pu_addr = (ptr); \ 201 __typeof__(*(ptr)) __pu_val = (x); \
199 __typeof__(*(__pu_addr)) __pu_val = (x); \ 202 __chk_user_ptr(ptr); \
200 __chk_user_ptr(__pu_addr); \ 203 switch (sizeof(*(ptr))) { \
201 switch (sizeof(*(__pu_addr))) { \
202 case 1: \ 204 case 1: \
203 __put_user_asm("sbi", __pu_val, __pu_addr, (err)); \ 205 __put_user_asm("sbi", __pu_val, (ptr), (err)); \
204 break; \ 206 break; \
205 case 2: \ 207 case 2: \
206 __put_user_asm("shi", __pu_val, __pu_addr, (err)); \ 208 __put_user_asm("shi", __pu_val, (ptr), (err)); \
207 break; \ 209 break; \
208 case 4: \ 210 case 4: \
209 __put_user_asm("swi", __pu_val, __pu_addr, (err)); \ 211 __put_user_asm("swi", __pu_val, (ptr), (err)); \
210 break; \ 212 break; \
211 case 8: \ 213 case 8: \
212 __put_user_asm_dword(__pu_val, __pu_addr, (err)); \ 214 __put_user_asm_dword(__pu_val, (ptr), (err)); \
213 break; \ 215 break; \
214 default: \ 216 default: \
215 BUILD_BUG(); \ 217 BUILD_BUG(); \