aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2010-06-30 06:00:01 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2010-06-30 06:00:01 -0400
commitfc4978b796e5e52ab3a709495a968199afe0a108 (patch)
tree102c74707940214f3c9810dadaf62d0d378a7a8c /arch/arm/kernel
parent3260e5293727f16ffdce9a6a6203fd9a6b149e58 (diff)
parentdf0698be14c6683606d5df2d83e3ae40f85ed0d9 (diff)
Merge git://git.linaro.org/nico/arm_security into devel-stable
Diffstat (limited to 'arch/arm/kernel')
-rw-r--r--arch/arm/kernel/asm-offsets.c3
-rw-r--r--arch/arm/kernel/entry-armv.S8
-rw-r--r--arch/arm/kernel/process.c13
3 files changed, 24 insertions, 0 deletions
diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c
index 883511522fca..85f2a019f77b 100644
--- a/arch/arm/kernel/asm-offsets.c
+++ b/arch/arm/kernel/asm-offsets.c
@@ -40,6 +40,9 @@
40int main(void) 40int main(void)
41{ 41{
42 DEFINE(TSK_ACTIVE_MM, offsetof(struct task_struct, active_mm)); 42 DEFINE(TSK_ACTIVE_MM, offsetof(struct task_struct, active_mm));
43#ifdef CONFIG_CC_STACKPROTECTOR
44 DEFINE(TSK_STACK_CANARY, offsetof(struct task_struct, stack_canary));
45#endif
43 BLANK(); 46 BLANK();
44 DEFINE(TI_FLAGS, offsetof(struct thread_info, flags)); 47 DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
45 DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count)); 48 DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count));
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
index 7ee48e7f8f31..2d14081b26b1 100644
--- a/arch/arm/kernel/entry-armv.S
+++ b/arch/arm/kernel/entry-armv.S
@@ -745,6 +745,11 @@ ENTRY(__switch_to)
745 mov r4, #0xffff0fff 745 mov r4, #0xffff0fff
746 str r3, [r4, #-15] @ TLS val at 0xffff0ff0 746 str r3, [r4, #-15] @ TLS val at 0xffff0ff0
747#endif 747#endif
748#if defined(CONFIG_CC_STACKPROTECTOR) && !defined(CONFIG_SMP)
749 ldr r7, [r2, #TI_TASK]
750 ldr r8, =__stack_chk_guard
751 ldr r7, [r7, #TSK_STACK_CANARY]
752#endif
748#ifdef CONFIG_MMU 753#ifdef CONFIG_MMU
749 mcr p15, 0, r6, c3, c0, 0 @ Set domain register 754 mcr p15, 0, r6, c3, c0, 0 @ Set domain register
750#endif 755#endif
@@ -753,6 +758,9 @@ ENTRY(__switch_to)
753 ldr r0, =thread_notify_head 758 ldr r0, =thread_notify_head
754 mov r1, #THREAD_NOTIFY_SWITCH 759 mov r1, #THREAD_NOTIFY_SWITCH
755 bl atomic_notifier_call_chain 760 bl atomic_notifier_call_chain
761#if defined(CONFIG_CC_STACKPROTECTOR) && !defined(CONFIG_SMP)
762 str r7, [r8]
763#endif
756 THUMB( mov ip, r4 ) 764 THUMB( mov ip, r4 )
757 mov r0, r5 765 mov r0, r5
758 ARM( ldmia r4, {r4 - sl, fp, sp, pc} ) @ Load all regs saved previously 766 ARM( ldmia r4, {r4 - sl, fp, sp, pc} ) @ Load all regs saved previously
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
index acf5e6fdb6dc..090ac9459da1 100644
--- a/arch/arm/kernel/process.c
+++ b/arch/arm/kernel/process.c
@@ -28,6 +28,7 @@
28#include <linux/tick.h> 28#include <linux/tick.h>
29#include <linux/utsname.h> 29#include <linux/utsname.h>
30#include <linux/uaccess.h> 30#include <linux/uaccess.h>
31#include <linux/random.h>
31 32
32#include <asm/leds.h> 33#include <asm/leds.h>
33#include <asm/processor.h> 34#include <asm/processor.h>
@@ -36,6 +37,12 @@
36#include <asm/stacktrace.h> 37#include <asm/stacktrace.h>
37#include <asm/mach/time.h> 38#include <asm/mach/time.h>
38 39
40#ifdef CONFIG_CC_STACKPROTECTOR
41#include <linux/stackprotector.h>
42unsigned long __stack_chk_guard __read_mostly;
43EXPORT_SYMBOL(__stack_chk_guard);
44#endif
45
39static const char *processor_modes[] = { 46static const char *processor_modes[] = {
40 "USER_26", "FIQ_26" , "IRQ_26" , "SVC_26" , "UK4_26" , "UK5_26" , "UK6_26" , "UK7_26" , 47 "USER_26", "FIQ_26" , "IRQ_26" , "SVC_26" , "UK4_26" , "UK5_26" , "UK6_26" , "UK7_26" ,
41 "UK8_26" , "UK9_26" , "UK10_26", "UK11_26", "UK12_26", "UK13_26", "UK14_26", "UK15_26", 48 "UK8_26" , "UK9_26" , "UK10_26", "UK11_26", "UK12_26", "UK13_26", "UK14_26", "UK15_26",
@@ -421,3 +428,9 @@ unsigned long get_wchan(struct task_struct *p)
421 } while (count ++ < 16); 428 } while (count ++ < 16);
422 return 0; 429 return 0;
423} 430}
431
432unsigned long arch_randomize_brk(struct mm_struct *mm)
433{
434 unsigned long range_end = mm->brk + 0x02000000;
435 return randomize_range(mm->brk, range_end, 0) ? : mm->brk;
436}