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

process.c (1741B)


      1// SPDX-License-Identifier: GPL-2.0
      2#include <linux/mm.h>
      3#include <linux/kernel.h>
      4#include <linux/slab.h>
      5#include <linux/sched/signal.h>
      6#include <linux/sched/task_stack.h>
      7#include <linux/export.h>
      8#include <linux/stackprotector.h>
      9#include <asm/fpu.h>
     10#include <asm/ptrace.h>
     11
     12struct kmem_cache *task_xstate_cachep = NULL;
     13unsigned int xstate_size;
     14
     15#ifdef CONFIG_STACKPROTECTOR
     16unsigned long __stack_chk_guard __read_mostly;
     17EXPORT_SYMBOL(__stack_chk_guard);
     18#endif
     19
     20/*
     21 * this gets called so that we can store lazy state into memory and copy the
     22 * current task into the new thread.
     23 */
     24int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
     25{
     26	unlazy_fpu(src, task_pt_regs(src));
     27	*dst = *src;
     28
     29	if (src->thread.xstate) {
     30		dst->thread.xstate = kmem_cache_alloc(task_xstate_cachep,
     31						      GFP_KERNEL);
     32		if (!dst->thread.xstate)
     33			return -ENOMEM;
     34		memcpy(dst->thread.xstate, src->thread.xstate, xstate_size);
     35	}
     36
     37	return 0;
     38}
     39
     40void free_thread_xstate(struct task_struct *tsk)
     41{
     42	if (tsk->thread.xstate) {
     43		kmem_cache_free(task_xstate_cachep, tsk->thread.xstate);
     44		tsk->thread.xstate = NULL;
     45	}
     46}
     47
     48void arch_release_task_struct(struct task_struct *tsk)
     49{
     50	free_thread_xstate(tsk);
     51}
     52
     53void arch_task_cache_init(void)
     54{
     55	if (!xstate_size)
     56		return;
     57
     58	task_xstate_cachep = kmem_cache_create("task_xstate", xstate_size,
     59					       __alignof__(union thread_xstate),
     60					       SLAB_PANIC, NULL);
     61}
     62
     63#ifdef CONFIG_SH_FPU_EMU
     64# define HAVE_SOFTFP	1
     65#else
     66# define HAVE_SOFTFP	0
     67#endif
     68
     69void init_thread_xstate(void)
     70{
     71	if (boot_cpu_data.flags & CPU_HAS_FPU)
     72		xstate_size = sizeof(struct sh_fpu_hard_struct);
     73	else if (HAVE_SOFTFP)
     74		xstate_size = sizeof(struct sh_fpu_soft_struct);
     75	else
     76		xstate_size = 0;
     77}