diff options
| -rw-r--r-- | arch/arm/include/asm/unistd.h | 9 | ||||
| -rw-r--r-- | arch/arm/kernel/entry-armv.S | 7 | ||||
| -rw-r--r-- | arch/arm/kernel/traps.c | 2 |
3 files changed, 14 insertions, 4 deletions
diff --git a/arch/arm/include/asm/unistd.h b/arch/arm/include/asm/unistd.h index 7020217fc49f..4e506d09e5f9 100644 --- a/arch/arm/include/asm/unistd.h +++ b/arch/arm/include/asm/unistd.h | |||
| @@ -403,6 +403,15 @@ | |||
| 403 | #define __ARM_NR_set_tls (__ARM_NR_BASE+5) | 403 | #define __ARM_NR_set_tls (__ARM_NR_BASE+5) |
| 404 | 404 | ||
| 405 | /* | 405 | /* |
| 406 | * *NOTE*: This is a ghost syscall private to the kernel. Only the | ||
| 407 | * __kuser_cmpxchg code in entry-armv.S should be aware of its | ||
| 408 | * existence. Don't ever use this from user code. | ||
| 409 | */ | ||
| 410 | #ifdef __KERNEL__ | ||
| 411 | #define __ARM_NR_cmpxchg (__ARM_NR_BASE+0x00fff0) | ||
| 412 | #endif | ||
| 413 | |||
| 414 | /* | ||
| 406 | * The following syscalls are obsolete and no longer available for EABI. | 415 | * The following syscalls are obsolete and no longer available for EABI. |
| 407 | */ | 416 | */ |
| 408 | #if defined(__ARM_EABI__) && !defined(__KERNEL__) | 417 | #if defined(__ARM_EABI__) && !defined(__KERNEL__) |
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index 0022b4d57f8b..d2903e3bc861 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include <mach/entry-macro.S> | 21 | #include <mach/entry-macro.S> |
| 22 | #include <asm/thread_notify.h> | 22 | #include <asm/thread_notify.h> |
| 23 | #include <asm/unwind.h> | 23 | #include <asm/unwind.h> |
| 24 | #include <asm/unistd.h> | ||
| 24 | 25 | ||
| 25 | #include "entry-header.S" | 26 | #include "entry-header.S" |
| 26 | 27 | ||
| @@ -908,10 +909,10 @@ __kuser_cmpxchg: @ 0xffff0fc0 | |||
| 908 | * A special ghost syscall is used for that (see traps.c). | 909 | * A special ghost syscall is used for that (see traps.c). |
| 909 | */ | 910 | */ |
| 910 | stmfd sp!, {r7, lr} | 911 | stmfd sp!, {r7, lr} |
| 911 | mov r7, #0xff00 @ 0xfff0 into r7 for EABI | 912 | ldr r7, =1f @ it's 20 bits |
| 912 | orr r7, r7, #0xf0 | 913 | swi __ARM_NR_cmpxchg |
| 913 | swi #0x9ffff0 | ||
| 914 | ldmfd sp!, {r7, pc} | 914 | ldmfd sp!, {r7, pc} |
| 915 | 1: .word __ARM_NR_cmpxchg | ||
| 915 | 916 | ||
| 916 | #elif __LINUX_ARM_ARCH__ < 6 | 917 | #elif __LINUX_ARM_ARCH__ < 6 |
| 917 | 918 | ||
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 1bbda04a5380..3f361a783f43 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
| @@ -528,7 +528,7 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs) | |||
| 528 | * __kuser_cmpxchg code in entry-armv.S should be aware of its | 528 | * __kuser_cmpxchg code in entry-armv.S should be aware of its |
| 529 | * existence. Don't ever use this from user code. | 529 | * existence. Don't ever use this from user code. |
| 530 | */ | 530 | */ |
| 531 | case 0xfff0: | 531 | case NR(cmpxchg): |
| 532 | for (;;) { | 532 | for (;;) { |
| 533 | extern void do_DataAbort(unsigned long addr, unsigned int fsr, | 533 | extern void do_DataAbort(unsigned long addr, unsigned int fsr, |
| 534 | struct pt_regs *regs); | 534 | struct pt_regs *regs); |
