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

cpu.c (1293B)


      1/*
      2 * This file is subject to the terms and conditions of the GNU General Public
      3 * License.  See the file "COPYING" in the main directory of this archive
      4 * for more details.
      5 *
      6 * Copyright (C) 2009 Wind River Systems,
      7 *   written by Ralf Baechle <ralf@linux-mips.org>
      8 */
      9#include <linux/init.h>
     10#include <linux/irqflags.h>
     11#include <linux/notifier.h>
     12#include <linux/prefetch.h>
     13#include <linux/ptrace.h>
     14#include <linux/sched.h>
     15#include <linux/sched/task_stack.h>
     16
     17#include <asm/cop2.h>
     18#include <asm/current.h>
     19#include <asm/mipsregs.h>
     20#include <asm/page.h>
     21#include <asm/octeon/octeon.h>
     22
     23static int cnmips_cu2_call(struct notifier_block *nfb, unsigned long action,
     24	void *data)
     25{
     26	unsigned long flags;
     27	unsigned int status;
     28
     29	switch (action) {
     30	case CU2_EXCEPTION:
     31		prefetch(&current->thread.cp2);
     32		local_irq_save(flags);
     33		KSTK_STATUS(current) |= ST0_CU2;
     34		status = read_c0_status();
     35		write_c0_status(status | ST0_CU2);
     36		octeon_cop2_restore(&(current->thread.cp2));
     37		write_c0_status(status & ~ST0_CU2);
     38		local_irq_restore(flags);
     39
     40		return NOTIFY_BAD;	/* Don't call default notifier */
     41	}
     42
     43	return NOTIFY_OK;		/* Let default notifier send signals */
     44}
     45
     46static int __init cnmips_cu2_setup(void)
     47{
     48	return cu2_notifier(cnmips_cu2_call, 0);
     49}
     50early_initcall(cnmips_cu2_setup);