aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/kernel/entry-common.S11
-rw-r--r--arch/arm/kernel/signal.c7
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)
106ret_slow_syscall: 114ret_slow_syscall:
107 disable_irq_notrace @ disable interrupts 115 disable_irq_notrace @ disable interrupts
108ENTRY(ret_to_user_from_irq) 116ENTRY(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 */
679asmlinkage void addr_limit_check_failed(void)
680{
681 addr_limit_user_check();
682}