@@ -253,7 +253,7 @@ static inline void __user *__uaccess_mask_ptr(const void __user *ptr)
253
253
* The "__xxx_error" versions set the third argument to -EFAULT if an error
254
254
* occurs, and leave it unchanged on success.
255
255
*/
256
- #define __get_user_asm (instr , alt_instr , reg , x , addr , err , feature ) \
256
+ #define __get_mem_asm (instr , alt_instr , reg , x , addr , err , feature ) \
257
257
asm volatile( \
258
258
"1:"ALTERNATIVE(instr " " reg "1, [%2]\n", \
259
259
alt_instr " " reg "1, [%2]\n", feature) \
@@ -268,35 +268,40 @@ static inline void __user *__uaccess_mask_ptr(const void __user *ptr)
268
268
: "+r" (err), "=&r" (x) \
269
269
: "r" (addr), "i" (-EFAULT))
270
270
271
- #define __raw_get_user (x , ptr , err ) \
271
+ #define __raw_get_mem (x , ptr , err ) \
272
272
do { \
273
273
unsigned long __gu_val; \
274
- __chk_user_ptr(ptr); \
275
- uaccess_enable_not_uao(); \
276
274
switch (sizeof(*(ptr))) { \
277
275
case 1: \
278
- __get_user_asm ("ldrb", "ldtrb", "%w", __gu_val, (ptr), \
276
+ __get_mem_asm ("ldrb", "ldtrb", "%w", __gu_val, (ptr), \
279
277
(err), ARM64_HAS_UAO); \
280
278
break; \
281
279
case 2: \
282
- __get_user_asm ("ldrh", "ldtrh", "%w", __gu_val, (ptr), \
280
+ __get_mem_asm ("ldrh", "ldtrh", "%w", __gu_val, (ptr), \
283
281
(err), ARM64_HAS_UAO); \
284
282
break; \
285
283
case 4: \
286
- __get_user_asm ("ldr", "ldtr", "%w", __gu_val, (ptr), \
284
+ __get_mem_asm ("ldr", "ldtr", "%w", __gu_val, (ptr), \
287
285
(err), ARM64_HAS_UAO); \
288
286
break; \
289
287
case 8: \
290
- __get_user_asm ("ldr", "ldtr", "%x", __gu_val, (ptr), \
288
+ __get_mem_asm ("ldr", "ldtr", "%x", __gu_val, (ptr), \
291
289
(err), ARM64_HAS_UAO); \
292
290
break; \
293
291
default: \
294
292
BUILD_BUG(); \
295
293
} \
296
- uaccess_disable_not_uao(); \
297
294
(x) = (__force __typeof__(*(ptr)))__gu_val; \
298
295
} while (0)
299
296
297
+ #define __raw_get_user (x , ptr , err ) \
298
+ do { \
299
+ __chk_user_ptr(ptr); \
300
+ uaccess_enable_not_uao(); \
301
+ __raw_get_mem(x, ptr, err); \
302
+ uaccess_disable_not_uao(); \
303
+ } while (0)
304
+
300
305
#define __get_user_error (x , ptr , err ) \
301
306
do { \
302
307
__typeof__(*(ptr)) __user *__p = (ptr); \
@@ -318,7 +323,7 @@ do { \
318
323
319
324
#define get_user __get_user
320
325
321
- #define __put_user_asm (instr , alt_instr , reg , x , addr , err , feature ) \
326
+ #define __put_mem_asm (instr , alt_instr , reg , x , addr , err , feature ) \
322
327
asm volatile( \
323
328
"1:"ALTERNATIVE(instr " " reg "1, [%2]\n", \
324
329
alt_instr " " reg "1, [%2]\n", feature) \
@@ -332,31 +337,36 @@ do { \
332
337
: "+r" (err) \
333
338
: "r" (x), "r" (addr), "i" (-EFAULT))
334
339
335
- #define __raw_put_user (x , ptr , err ) \
340
+ #define __raw_put_mem (x , ptr , err ) \
336
341
do { \
337
342
__typeof__(*(ptr)) __pu_val = (x); \
338
- __chk_user_ptr(ptr); \
339
- uaccess_enable_not_uao(); \
340
343
switch (sizeof(*(ptr))) { \
341
344
case 1: \
342
- __put_user_asm ("strb", "sttrb", "%w", __pu_val, (ptr), \
345
+ __put_mem_asm ("strb", "sttrb", "%w", __pu_val, (ptr), \
343
346
(err), ARM64_HAS_UAO); \
344
347
break; \
345
348
case 2: \
346
- __put_user_asm ("strh", "sttrh", "%w", __pu_val, (ptr), \
349
+ __put_mem_asm ("strh", "sttrh", "%w", __pu_val, (ptr), \
347
350
(err), ARM64_HAS_UAO); \
348
351
break; \
349
352
case 4: \
350
- __put_user_asm ("str", "sttr", "%w", __pu_val, (ptr), \
353
+ __put_mem_asm ("str", "sttr", "%w", __pu_val, (ptr), \
351
354
(err), ARM64_HAS_UAO); \
352
355
break; \
353
356
case 8: \
354
- __put_user_asm ("str", "sttr", "%x", __pu_val, (ptr), \
357
+ __put_mem_asm ("str", "sttr", "%x", __pu_val, (ptr), \
355
358
(err), ARM64_HAS_UAO); \
356
359
break; \
357
360
default: \
358
361
BUILD_BUG(); \
359
362
} \
363
+ } while (0)
364
+
365
+ #define __raw_put_user (x , ptr , err ) \
366
+ do { \
367
+ __chk_user_ptr(ptr); \
368
+ uaccess_enable_not_uao(); \
369
+ __raw_put_mem(x, ptr, err); \
360
370
uaccess_disable_not_uao(); \
361
371
} while (0)
362
372
0 commit comments