diff options
| author | Russell King <rmk+kernel@arm.linux.org.uk> | 2015-08-18 18:06:25 -0400 |
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2015-08-25 05:32:39 -0400 |
| commit | b64d1f66517a89b9b0f6bd0bca86b05a55a5e742 (patch) | |
| tree | a5e09325b4f29ca7f7838ee99abe337b6c621ca2 /arch/arm | |
| parent | d770e558e21961ad6cfdf0ff7df0eb5d7d4f0754 (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>
Diffstat (limited to 'arch/arm')
| -rw-r--r-- | arch/arm/include/asm/uaccess.h | 47 |
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" |
