OSDN Git Service

ARM: smp: add support for per-task stack canaries
[android-x86/kernel.git] / arch / arm / include / asm / stackprotector.h
index ef5f7b6..72a20c3 100644 (file)
@@ -6,8 +6,10 @@
  * the stack frame and verifying that it hasn't been overwritten when
  * returning from the function.  The pattern is called stack canary
  * and gcc expects it to be defined by a global variable called
- * "__stack_chk_guard" on ARM.  This unfortunately means that on SMP
- * we cannot have a different canary value per task.
+ * "__stack_chk_guard" on ARM.  This prevents SMP systems from using a
+ * different value for each task unless we enable a GCC plugin that
+ * replaces these symbol references with references to each task's own
+ * value.
  */
 
 #ifndef _ASM_STACKPROTECTOR_H
@@ -16,6 +18,8 @@
 #include <linux/random.h>
 #include <linux/version.h>
 
+#include <asm/thread_info.h>
+
 extern unsigned long __stack_chk_guard;
 
 /*
@@ -33,7 +37,11 @@ static __always_inline void boot_init_stack_canary(void)
        canary ^= LINUX_VERSION_CODE;
 
        current->stack_canary = canary;
+#ifndef CONFIG_STACKPROTECTOR_PER_TASK
        __stack_chk_guard = current->stack_canary;
+#else
+       current_thread_info()->stack_canary = current->stack_canary;
+#endif
 }
 
 #endif /* _ASM_STACKPROTECTOR_H */