aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2015-08-18 18:06:25 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2015-08-25 05:32:39 -0400
commitb64d1f66517a89b9b0f6bd0bca86b05a55a5e742 (patch)
treea5e09325b4f29ca7f7838ee99abe337b6c621ca2
parentd770e558e21961ad6cfdf0ff7df0eb5d7d4f0754 (diff)
ARM: uaccess: simplify user access assembly
The user assembly for byte and word accesses was virtually identical. Rather than duplicating this, use a macro instead. Acked-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
-rw-r--r--arch/arm/include/asm/uaccess.h47
1 files changed, 12 insertions, 35 deletions
diff --git a/arch/arm/include/asm/uaccess.h b/arch/arm/include/asm/uaccess.h
index 74b17d09ef7a..4cf54ebe408a 100644
--- a/arch/arm/include/asm/uaccess.h
+++ b/arch/arm/include/asm/uaccess.h
@@ -311,9 +311,9 @@ do { \
311 (x) = (__typeof__(*(ptr)))__gu_val; \ 311 (x) = (__typeof__(*(ptr)))__gu_val; \
312} while (0) 312} while (0)
313 313
314#define __get_user_asm_byte(x, addr, err) \ 314#define __get_user_asm(x, addr, err, instr) \
315 __asm__ __volatile__( \ 315 __asm__ __volatile__( \
316 "1: " TUSER(ldrb) " %1,[%2],#0\n" \ 316 "1: " TUSER(instr) " %1, [%2], #0\n" \
317 "2:\n" \ 317 "2:\n" \
318 " .pushsection .text.fixup,\"ax\"\n" \ 318 " .pushsection .text.fixup,\"ax\"\n" \
319 " .align 2\n" \ 319 " .align 2\n" \
@@ -329,6 +329,9 @@ do { \
329 : "r" (addr), "i" (-EFAULT) \ 329 : "r" (addr), "i" (-EFAULT) \
330 : "cc") 330 : "cc")
331 331
332#define __get_user_asm_byte(x, addr, err) \
333 __get_user_asm(x, addr, err, ldrb)
334
332#ifndef __ARMEB__ 335#ifndef __ARMEB__
333#define __get_user_asm_half(x, __gu_addr, err) \ 336#define __get_user_asm_half(x, __gu_addr, err) \
334({ \ 337({ \
@@ -348,22 +351,7 @@ do { \
348#endif 351#endif
349 352
350#define __get_user_asm_word(x, addr, err) \ 353#define __get_user_asm_word(x, addr, err) \
351 __asm__ __volatile__( \ 354 __get_user_asm(x, addr, err, ldr)
352 "1: " TUSER(ldr) " %1,[%2],#0\n" \
353 "2:\n" \
354 " .pushsection .text.fixup,\"ax\"\n" \
355 " .align 2\n" \
356 "3: mov %0, %3\n" \
357 " mov %1, #0\n" \
358 " b 2b\n" \
359 " .popsection\n" \
360 " .pushsection __ex_table,\"a\"\n" \
361 " .align 3\n" \
362 " .long 1b, 3b\n" \
363 " .popsection" \
364 : "+r" (err), "=&r" (x) \
365 : "r" (addr), "i" (-EFAULT) \
366 : "cc")
367 355
368#define __put_user(x, ptr) \ 356#define __put_user(x, ptr) \
369({ \ 357({ \
@@ -393,9 +381,9 @@ do { \
393 } \ 381 } \
394} while (0) 382} while (0)
395 383
396#define __put_user_asm_byte(x, __pu_addr, err) \ 384#define __put_user_asm(x, __pu_addr, err, instr) \
397 __asm__ __volatile__( \ 385 __asm__ __volatile__( \
398 "1: " TUSER(strb) " %1,[%2],#0\n" \ 386 "1: " TUSER(instr) " %1, [%2], #0\n" \
399 "2:\n" \ 387 "2:\n" \
400 " .pushsection .text.fixup,\"ax\"\n" \ 388 " .pushsection .text.fixup,\"ax\"\n" \
401 " .align 2\n" \ 389 " .align 2\n" \
@@ -410,6 +398,9 @@ do { \
410 : "r" (x), "r" (__pu_addr), "i" (-EFAULT) \ 398 : "r" (x), "r" (__pu_addr), "i" (-EFAULT) \
411 : "cc") 399 : "cc")
412 400
401#define __put_user_asm_byte(x, __pu_addr, err) \
402 __put_user_asm(x, __pu_addr, err, strb)
403
413#ifndef __ARMEB__ 404#ifndef __ARMEB__
414#define __put_user_asm_half(x, __pu_addr, err) \ 405#define __put_user_asm_half(x, __pu_addr, err) \
415({ \ 406({ \
@@ -427,21 +418,7 @@ do { \
427#endif 418#endif
428 419
429#define __put_user_asm_word(x, __pu_addr, err) \ 420#define __put_user_asm_word(x, __pu_addr, err) \
430 __asm__ __volatile__( \ 421 __put_user_asm(x, __pu_addr, err, str)
431 "1: " TUSER(str) " %1,[%2],#0\n" \
432 "2:\n" \
433 " .pushsection .text.fixup,\"ax\"\n" \
434 " .align 2\n" \
435 "3: mov %0, %3\n" \
436 " b 2b\n" \
437 " .popsection\n" \
438 " .pushsection __ex_table,\"a\"\n" \
439 " .align 3\n" \
440 " .long 1b, 3b\n" \
441 " .popsection" \
442 : "+r" (err) \
443 : "r" (x), "r" (__pu_addr), "i" (-EFAULT) \
444 : "cc")
445 422
446#ifndef __ARMEB__ 423#ifndef __ARMEB__
447#define __reg_oper0 "%R2" 424#define __reg_oper0 "%R2"