18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * GCC stack protector support.
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci */
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#ifndef _ASM_STACKPROTECTOR_H
88c2ecf20Sopenharmony_ci#define _ASM_STACKPROTECTOR_H
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#include <linux/random.h>
118c2ecf20Sopenharmony_ci#include <linux/version.h>
128c2ecf20Sopenharmony_ci#include <asm/reg.h>
138c2ecf20Sopenharmony_ci#include <asm/current.h>
148c2ecf20Sopenharmony_ci#include <asm/paca.h>
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci/*
178c2ecf20Sopenharmony_ci * Initialize the stackprotector canary value.
188c2ecf20Sopenharmony_ci *
198c2ecf20Sopenharmony_ci * NOTE: this must only be called from functions that never return,
208c2ecf20Sopenharmony_ci * and it must always be inlined.
218c2ecf20Sopenharmony_ci */
228c2ecf20Sopenharmony_cistatic __always_inline void boot_init_stack_canary(void)
238c2ecf20Sopenharmony_ci{
248c2ecf20Sopenharmony_ci	unsigned long canary;
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci	/* Try to get a semi random initial value. */
278c2ecf20Sopenharmony_ci	canary = get_random_canary();
288c2ecf20Sopenharmony_ci	canary ^= mftb();
298c2ecf20Sopenharmony_ci	canary ^= LINUX_VERSION_CODE;
308c2ecf20Sopenharmony_ci	canary &= CANARY_MASK;
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci	current->stack_canary = canary;
338c2ecf20Sopenharmony_ci#ifdef CONFIG_PPC64
348c2ecf20Sopenharmony_ci	get_paca()->canary = canary;
358c2ecf20Sopenharmony_ci#endif
368c2ecf20Sopenharmony_ci}
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci#endif	/* _ASM_STACKPROTECTOR_H */
39