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 (2459B)


      1// SPDX-License-Identifier: GPL-2.0
      2// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
      3
      4#include <linux/module.h>
      5#include <linux/sched.h>
      6#include <linux/sched/task_stack.h>
      7#include <linux/sched/debug.h>
      8#include <linux/delay.h>
      9#include <linux/kallsyms.h>
     10#include <linux/uaccess.h>
     11#include <linux/ptrace.h>
     12
     13#include <asm/elf.h>
     14#include <abi/reg_ops.h>
     15
     16struct cpuinfo_csky cpu_data[NR_CPUS];
     17
     18#ifdef CONFIG_STACKPROTECTOR
     19#include <linux/stackprotector.h>
     20unsigned long __stack_chk_guard __read_mostly;
     21EXPORT_SYMBOL(__stack_chk_guard);
     22#endif
     23
     24asmlinkage void ret_from_fork(void);
     25asmlinkage void ret_from_kernel_thread(void);
     26
     27/*
     28 * Some archs flush debug and FPU info here
     29 */
     30void flush_thread(void){}
     31
     32int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
     33{
     34	unsigned long clone_flags = args->flags;
     35	unsigned long usp = args->stack;
     36	unsigned long tls = args->tls;
     37	struct switch_stack *childstack;
     38	struct pt_regs *childregs = task_pt_regs(p);
     39
     40#ifdef CONFIG_CPU_HAS_FPU
     41	save_to_user_fp(&p->thread.user_fp);
     42#endif
     43
     44	childstack = ((struct switch_stack *) childregs) - 1;
     45	memset(childstack, 0, sizeof(struct switch_stack));
     46
     47	/* setup thread.sp for switch_to !!! */
     48	p->thread.sp = (unsigned long)childstack;
     49
     50	if (unlikely(args->fn)) {
     51		memset(childregs, 0, sizeof(struct pt_regs));
     52		childstack->r15 = (unsigned long) ret_from_kernel_thread;
     53		childstack->r10 = (unsigned long) args->fn_arg;
     54		childstack->r9 = (unsigned long) args->fn;
     55		childregs->sr = mfcr("psr");
     56	} else {
     57		*childregs = *(current_pt_regs());
     58		if (usp)
     59			childregs->usp = usp;
     60		if (clone_flags & CLONE_SETTLS)
     61			task_thread_info(p)->tp_value = childregs->tls
     62						      = tls;
     63
     64		childregs->a0 = 0;
     65		childstack->r15 = (unsigned long) ret_from_fork;
     66	}
     67
     68	return 0;
     69}
     70
     71/* Fill in the fpu structure for a core dump.  */
     72int dump_fpu(struct pt_regs *regs, struct user_fp *fpu)
     73{
     74	memcpy(fpu, &current->thread.user_fp, sizeof(*fpu));
     75	return 1;
     76}
     77EXPORT_SYMBOL(dump_fpu);
     78
     79int dump_task_regs(struct task_struct *tsk, elf_gregset_t *pr_regs)
     80{
     81	struct pt_regs *regs = task_pt_regs(tsk);
     82
     83	/* NOTE: usp is error value. */
     84	ELF_CORE_COPY_REGS((*pr_regs), regs)
     85
     86	return 1;
     87}
     88
     89#ifndef CONFIG_CPU_PM_NONE
     90void arch_cpu_idle(void)
     91{
     92#ifdef CONFIG_CPU_PM_WAIT
     93	asm volatile("wait\n");
     94#endif
     95
     96#ifdef CONFIG_CPU_PM_DOZE
     97	asm volatile("doze\n");
     98#endif
     99
    100#ifdef CONFIG_CPU_PM_STOP
    101	asm volatile("stop\n");
    102#endif
    103	raw_local_irq_enable();
    104}
    105#endif