diff options
| -rw-r--r-- | arch/arm/kernel/sigreturn_codes.S | 40 |
1 files changed, 31 insertions, 9 deletions
diff --git a/arch/arm/kernel/sigreturn_codes.S b/arch/arm/kernel/sigreturn_codes.S index 3c5d0f2170fd..b84d0cb13682 100644 --- a/arch/arm/kernel/sigreturn_codes.S +++ b/arch/arm/kernel/sigreturn_codes.S | |||
| @@ -30,6 +30,27 @@ | |||
| 30 | * snippets. | 30 | * snippets. |
| 31 | */ | 31 | */ |
| 32 | 32 | ||
| 33 | /* | ||
| 34 | * In CPU_THUMBONLY case kernel arm opcodes are not allowed. | ||
| 35 | * Note in this case codes skips those instructions but it uses .org | ||
| 36 | * directive to keep correct layout of sigreturn_codes array. | ||
| 37 | */ | ||
| 38 | #ifndef CONFIG_CPU_THUMBONLY | ||
| 39 | #define ARM_OK(code...) code | ||
| 40 | #else | ||
| 41 | #define ARM_OK(code...) | ||
| 42 | #endif | ||
| 43 | |||
| 44 | .macro arm_slot n | ||
| 45 | .org sigreturn_codes + 12 * (\n) | ||
| 46 | ARM_OK( .arm ) | ||
| 47 | .endm | ||
| 48 | |||
| 49 | .macro thumb_slot n | ||
| 50 | .org sigreturn_codes + 12 * (\n) + 8 | ||
| 51 | .thumb | ||
| 52 | .endm | ||
| 53 | |||
| 33 | #if __LINUX_ARM_ARCH__ <= 4 | 54 | #if __LINUX_ARM_ARCH__ <= 4 |
| 34 | /* | 55 | /* |
| 35 | * Note we manually set minimally required arch that supports | 56 | * Note we manually set minimally required arch that supports |
| @@ -45,26 +66,27 @@ | |||
| 45 | .global sigreturn_codes | 66 | .global sigreturn_codes |
| 46 | .type sigreturn_codes, #object | 67 | .type sigreturn_codes, #object |
| 47 | 68 | ||
| 48 | .arm | 69 | .align |
| 49 | 70 | ||
| 50 | sigreturn_codes: | 71 | sigreturn_codes: |
| 51 | 72 | ||
| 52 | /* ARM sigreturn syscall code snippet */ | 73 | /* ARM sigreturn syscall code snippet */ |
| 53 | mov r7, #(__NR_sigreturn - __NR_SYSCALL_BASE) | 74 | arm_slot 0 |
| 54 | swi #(__NR_sigreturn)|(__NR_OABI_SYSCALL_BASE) | 75 | ARM_OK( mov r7, #(__NR_sigreturn - __NR_SYSCALL_BASE) ) |
| 76 | ARM_OK( swi #(__NR_sigreturn)|(__NR_OABI_SYSCALL_BASE) ) | ||
| 55 | 77 | ||
| 56 | /* Thumb sigreturn syscall code snippet */ | 78 | /* Thumb sigreturn syscall code snippet */ |
| 57 | .thumb | 79 | thumb_slot 0 |
| 58 | movs r7, #(__NR_sigreturn - __NR_SYSCALL_BASE) | 80 | movs r7, #(__NR_sigreturn - __NR_SYSCALL_BASE) |
| 59 | swi #0 | 81 | swi #0 |
| 60 | 82 | ||
| 61 | /* ARM sigreturn_rt syscall code snippet */ | 83 | /* ARM sigreturn_rt syscall code snippet */ |
| 62 | .arm | 84 | arm_slot 1 |
| 63 | mov r7, #(__NR_rt_sigreturn - __NR_SYSCALL_BASE) | 85 | ARM_OK( mov r7, #(__NR_rt_sigreturn - __NR_SYSCALL_BASE) ) |
| 64 | swi #(__NR_rt_sigreturn)|(__NR_OABI_SYSCALL_BASE) | 86 | ARM_OK( swi #(__NR_rt_sigreturn)|(__NR_OABI_SYSCALL_BASE) ) |
| 65 | 87 | ||
| 66 | /* Thumb sigreturn_rt syscall code snippet */ | 88 | /* Thumb sigreturn_rt syscall code snippet */ |
| 67 | .thumb | 89 | thumb_slot 1 |
| 68 | movs r7, #(__NR_rt_sigreturn - __NR_SYSCALL_BASE) | 90 | movs r7, #(__NR_rt_sigreturn - __NR_SYSCALL_BASE) |
| 69 | swi #0 | 91 | swi #0 |
| 70 | 92 | ||
| @@ -74,7 +96,7 @@ sigreturn_codes: | |||
| 74 | * it is thumb case or not, so we need additional | 96 | * it is thumb case or not, so we need additional |
| 75 | * word after real last entry. | 97 | * word after real last entry. |
| 76 | */ | 98 | */ |
| 77 | .arm | 99 | arm_slot 2 |
| 78 | .space 4 | 100 | .space 4 |
| 79 | 101 | ||
| 80 | .size sigreturn_codes, . - sigreturn_codes | 102 | .size sigreturn_codes, . - sigreturn_codes |
