1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * GCC stack protector support. 4 * 5 */ 6 7 #ifndef _ASM_STACKPROTECTOR_H 8 #define _ASM_STACKPROTECTOR_H 9 10 #include <linux/random.h> 11 #include <linux/version.h> 12 #include <asm/reg.h> 13 #include <asm/current.h> 14 #include <asm/paca.h> 15 16 /* 17 * Initialize the stackprotector canary value. 18 * 19 * NOTE: this must only be called from functions that never return, 20 * and it must always be inlined. 21 */ 22 static __always_inline void boot_init_stack_canary(void) 23 { 24 unsigned long canary; 25 26 /* Try to get a semi random initial value. */ 27 canary = get_random_canary(); 28 canary ^= mftb(); 29 canary ^= LINUX_VERSION_CODE; 30 canary &= CANARY_MASK; 31 32 current->stack_canary = canary; 33 #ifdef CONFIG_PPC64 34 get_paca()->canary = canary; 35 #endif 36 } 37 38 #endif /* _ASM_STACKPROTECTOR_H */ 39