Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 2 : : /* 3 : : * GCC stack protector support. 4 : : * 5 : : * Stack protector works by putting predefined pattern at the start of 6 : : * the stack frame and verifying that it hasn't been overwritten when 7 : : * returning from the function. The pattern is called stack canary 8 : : * and gcc expects it to be defined by a global variable called 9 : : * "__stack_chk_guard" on ARM. This prevents SMP systems from using a 10 : : * different value for each task unless we enable a GCC plugin that 11 : : * replaces these symbol references with references to each task's own 12 : : * value. 13 : : */ 14 : : 15 : : #ifndef _ASM_STACKPROTECTOR_H 16 : : #define _ASM_STACKPROTECTOR_H 1 17 : : 18 : : #include <linux/random.h> 19 : : #include <linux/version.h> 20 : : 21 : : #include <asm/thread_info.h> 22 : : 23 : : extern unsigned long __stack_chk_guard; 24 : : 25 : : /* 26 : : * Initialize the stackprotector canary value. 27 : : * 28 : : * NOTE: this must only be called from functions that never return, 29 : : * and it must always be inlined. 30 : : */ 31 : : static __always_inline void boot_init_stack_canary(void) 32 : : { 33 : : unsigned long canary; 34 : : 35 : : /* Try to get a semi random initial value. */ 36 : 207 : get_random_bytes(&canary, sizeof(canary)); 37 : 207 : canary ^= LINUX_VERSION_CODE; 38 : : 39 : 207 : current->stack_canary = canary; 40 : : #ifndef CONFIG_STACKPROTECTOR_PER_TASK 41 : 207 : __stack_chk_guard = current->stack_canary; 42 : : #else 43 : : current_thread_info()->stack_canary = current->stack_canary; 44 : : #endif 45 : : } 46 : : 47 : : #endif /* _ASM_STACKPROTECTOR_H */