diff options
| -rw-r--r-- | arch/arm/kernel/entry-common.S | 11 | ||||
| -rw-r--r-- | arch/arm/kernel/signal.c | 7 |
2 files changed, 18 insertions, 0 deletions
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 0b60adf4a5d9..99c908226065 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include <asm/unistd.h> | 12 | #include <asm/unistd.h> |
| 13 | #include <asm/ftrace.h> | 13 | #include <asm/ftrace.h> |
| 14 | #include <asm/unwind.h> | 14 | #include <asm/unwind.h> |
| 15 | #include <asm/memory.h> | ||
| 15 | #ifdef CONFIG_AEABI | 16 | #ifdef CONFIG_AEABI |
| 16 | #include <asm/unistd-oabi.h> | 17 | #include <asm/unistd-oabi.h> |
| 17 | #endif | 18 | #endif |
| @@ -48,10 +49,14 @@ ret_fast_syscall: | |||
| 48 | UNWIND(.fnstart ) | 49 | UNWIND(.fnstart ) |
| 49 | UNWIND(.cantunwind ) | 50 | UNWIND(.cantunwind ) |
| 50 | disable_irq_notrace @ disable interrupts | 51 | disable_irq_notrace @ disable interrupts |
| 52 | ldr r2, [tsk, #TI_ADDR_LIMIT] | ||
| 53 | cmp r2, #TASK_SIZE | ||
| 54 | blne addr_limit_check_failed | ||
| 51 | ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing | 55 | ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing |
| 52 | tst r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK | 56 | tst r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK |
| 53 | bne fast_work_pending | 57 | bne fast_work_pending |
| 54 | 58 | ||
| 59 | |||
| 55 | /* perform architecture specific actions before user return */ | 60 | /* perform architecture specific actions before user return */ |
| 56 | arch_ret_to_user r1, lr | 61 | arch_ret_to_user r1, lr |
| 57 | 62 | ||
| @@ -74,6 +79,9 @@ ret_fast_syscall: | |||
| 74 | UNWIND(.cantunwind ) | 79 | UNWIND(.cantunwind ) |
| 75 | str r0, [sp, #S_R0 + S_OFF]! @ save returned r0 | 80 | str r0, [sp, #S_R0 + S_OFF]! @ save returned r0 |
| 76 | disable_irq_notrace @ disable interrupts | 81 | disable_irq_notrace @ disable interrupts |
| 82 | ldr r2, [tsk, #TI_ADDR_LIMIT] | ||
| 83 | cmp r2, #TASK_SIZE | ||
| 84 | blne addr_limit_check_failed | ||
| 77 | ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing | 85 | ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing |
| 78 | tst r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK | 86 | tst r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK |
| 79 | beq no_work_pending | 87 | beq no_work_pending |
| @@ -106,6 +114,9 @@ ENTRY(ret_to_user) | |||
| 106 | ret_slow_syscall: | 114 | ret_slow_syscall: |
| 107 | disable_irq_notrace @ disable interrupts | 115 | disable_irq_notrace @ disable interrupts |
| 108 | ENTRY(ret_to_user_from_irq) | 116 | ENTRY(ret_to_user_from_irq) |
| 117 | ldr r2, [tsk, #TI_ADDR_LIMIT] | ||
| 118 | cmp r2, #TASK_SIZE | ||
| 119 | blne addr_limit_check_failed | ||
| 109 | ldr r1, [tsk, #TI_FLAGS] | 120 | ldr r1, [tsk, #TI_FLAGS] |
| 110 | tst r1, #_TIF_WORK_MASK | 121 | tst r1, #_TIF_WORK_MASK |
| 111 | bne slow_work_pending | 122 | bne slow_work_pending |
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 5814298ef0b7..b67ae12503f3 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #include <linux/uaccess.h> | 14 | #include <linux/uaccess.h> |
| 15 | #include <linux/tracehook.h> | 15 | #include <linux/tracehook.h> |
| 16 | #include <linux/uprobes.h> | 16 | #include <linux/uprobes.h> |
| 17 | #include <linux/syscalls.h> | ||
| 17 | 18 | ||
| 18 | #include <asm/elf.h> | 19 | #include <asm/elf.h> |
| 19 | #include <asm/cacheflush.h> | 20 | #include <asm/cacheflush.h> |
| @@ -673,3 +674,9 @@ struct page *get_signal_page(void) | |||
| 673 | 674 | ||
| 674 | return page; | 675 | return page; |
| 675 | } | 676 | } |
| 677 | |||
| 678 | /* Defer to generic check */ | ||
| 679 | asmlinkage void addr_limit_check_failed(void) | ||
| 680 | { | ||
| 681 | addr_limit_user_check(); | ||
| 682 | } | ||
