@@ -107,7 +107,6 @@ static inline int __access_ok(unsigned long addr, unsigned long size)
107107do { \
108108 uintptr_t __tmp; \
109109 __typeof__(x) __x; \
110- __enable_user_access(); \
111110 __asm__ __volatile__ ( \
112111 "1:\n" \
113112 " " insn " %1, %3\n" \
@@ -125,7 +124,6 @@ do { \
125124 " .previous" \
126125 : "+r" (err), "=&r" (__x), "=r" (__tmp) \
127126 : "m" (*(ptr)), "i" (-EFAULT)); \
128- __disable_user_access(); \
129127 (x) = __x; \
130128} while (0)
131129
@@ -138,7 +136,6 @@ do { \
138136 u32 __user *__ptr = (u32 __user *)(ptr); \
139137 u32 __lo, __hi; \
140138 uintptr_t __tmp; \
141- __enable_user_access(); \
142139 __asm__ __volatile__ ( \
143140 "1:\n" \
144141 " lw %1, %4\n" \
@@ -162,12 +159,30 @@ do { \
162159 "=r" (__tmp) \
163160 : "m" (__ptr[__LSW]), "m" (__ptr[__MSW]), \
164161 "i" (-EFAULT)); \
165- __disable_user_access(); \
166162 (x) = (__typeof__(x))((__typeof__((x)-(x)))( \
167163 (((u64)__hi << 32) | __lo))); \
168164} while (0)
169165#endif /* CONFIG_64BIT */
170166
167+ #define __get_user_nocheck (x , __gu_ptr , __gu_err ) \
168+ do { \
169+ switch (sizeof(*__gu_ptr)) { \
170+ case 1: \
171+ __get_user_asm("lb", (x), __gu_ptr, __gu_err); \
172+ break; \
173+ case 2: \
174+ __get_user_asm("lh", (x), __gu_ptr, __gu_err); \
175+ break; \
176+ case 4: \
177+ __get_user_asm("lw", (x), __gu_ptr, __gu_err); \
178+ break; \
179+ case 8: \
180+ __get_user_8((x), __gu_ptr, __gu_err); \
181+ break; \
182+ default: \
183+ BUILD_BUG(); \
184+ } \
185+ } while (0)
171186
172187/**
173188 * __get_user: - Get a simple variable from user space, with less checking.
@@ -191,25 +206,15 @@ do { \
191206 */
192207#define __get_user (x , ptr ) \
193208({ \
194- register long __gu_err = 0; \
195209 const __typeof__(*(ptr)) __user *__gu_ptr = (ptr); \
210+ long __gu_err = 0; \
211+ \
196212 __chk_user_ptr(__gu_ptr); \
197- switch (sizeof(*__gu_ptr)) { \
198- case 1: \
199- __get_user_asm("lb", (x), __gu_ptr, __gu_err); \
200- break; \
201- case 2: \
202- __get_user_asm("lh", (x), __gu_ptr, __gu_err); \
203- break; \
204- case 4: \
205- __get_user_asm("lw", (x), __gu_ptr, __gu_err); \
206- break; \
207- case 8: \
208- __get_user_8((x), __gu_ptr, __gu_err); \
209- break; \
210- default: \
211- BUILD_BUG(); \
212- } \
213+ \
214+ __enable_user_access(); \
215+ __get_user_nocheck(x, __gu_ptr, __gu_err); \
216+ __disable_user_access(); \
217+ \
213218 __gu_err; \
214219})
215220
@@ -243,7 +248,6 @@ do { \
243248do { \
244249 uintptr_t __tmp; \
245250 __typeof__(*(ptr)) __x = x; \
246- __enable_user_access(); \
247251 __asm__ __volatile__ ( \
248252 "1:\n" \
249253 " " insn " %z3, %2\n" \
@@ -260,7 +264,6 @@ do { \
260264 " .previous" \
261265 : "+r" (err), "=r" (__tmp), "=m" (*(ptr)) \
262266 : "rJ" (__x), "i" (-EFAULT)); \
263- __disable_user_access(); \
264267} while (0)
265268
266269#ifdef CONFIG_64BIT
@@ -272,7 +275,6 @@ do { \
272275 u32 __user *__ptr = (u32 __user *)(ptr); \
273276 u64 __x = (__typeof__((x)-(x)))(x); \
274277 uintptr_t __tmp; \
275- __enable_user_access(); \
276278 __asm__ __volatile__ ( \
277279 "1:\n" \
278280 " sw %z4, %2\n" \
@@ -294,10 +296,28 @@ do { \
294296 "=m" (__ptr[__LSW]), \
295297 "=m" (__ptr[__MSW]) \
296298 : "rJ" (__x), "rJ" (__x >> 32), "i" (-EFAULT)); \
297- __disable_user_access(); \
298299} while (0)
299300#endif /* CONFIG_64BIT */
300301
302+ #define __put_user_nocheck (x , __gu_ptr , __pu_err ) \
303+ do { \
304+ switch (sizeof(*__gu_ptr)) { \
305+ case 1: \
306+ __put_user_asm("sb", (x), __gu_ptr, __pu_err); \
307+ break; \
308+ case 2: \
309+ __put_user_asm("sh", (x), __gu_ptr, __pu_err); \
310+ break; \
311+ case 4: \
312+ __put_user_asm("sw", (x), __gu_ptr, __pu_err); \
313+ break; \
314+ case 8: \
315+ __put_user_8((x), __gu_ptr, __pu_err); \
316+ break; \
317+ default: \
318+ BUILD_BUG(); \
319+ } \
320+ } while (0)
301321
302322/**
303323 * __put_user: - Write a simple value into user space, with less checking.
@@ -320,25 +340,15 @@ do { \
320340 */
321341#define __put_user (x , ptr ) \
322342({ \
323- register long __pu_err = 0; \
324343 __typeof__(*(ptr)) __user *__gu_ptr = (ptr); \
344+ long __pu_err = 0; \
345+ \
325346 __chk_user_ptr(__gu_ptr); \
326- switch (sizeof(*__gu_ptr)) { \
327- case 1: \
328- __put_user_asm("sb", (x), __gu_ptr, __pu_err); \
329- break; \
330- case 2: \
331- __put_user_asm("sh", (x), __gu_ptr, __pu_err); \
332- break; \
333- case 4: \
334- __put_user_asm("sw", (x), __gu_ptr, __pu_err); \
335- break; \
336- case 8: \
337- __put_user_8((x), __gu_ptr, __pu_err); \
338- break; \
339- default: \
340- BUILD_BUG(); \
341- } \
347+ \
348+ __enable_user_access(); \
349+ __put_user_nocheck(x, __gu_ptr, __pu_err); \
350+ __disable_user_access(); \
351+ \
342352 __pu_err; \
343353})
344354
0 commit comments