cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

stackprotector.h (1289B)


      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
     23extern 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 */
     31static __always_inline void boot_init_stack_canary(void)
     32{
     33	unsigned long canary;
     34
     35	/* Try to get a semi random initial value. */
     36	get_random_bytes(&canary, sizeof(canary));
     37	canary ^= LINUX_VERSION_CODE;
     38
     39	current->stack_canary = canary;
     40#ifndef CONFIG_STACKPROTECTOR_PER_TASK
     41	__stack_chk_guard = current->stack_canary;
     42#endif
     43}
     44
     45#endif	/* _ASM_STACKPROTECTOR_H */