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

nmi_debug.c (1526B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Copyright (C) 2007 Atmel Corporation
      4 */
      5#include <linux/delay.h>
      6#include <linux/kdebug.h>
      7#include <linux/notifier.h>
      8#include <linux/sched.h>
      9#include <linux/sched/debug.h>
     10#include <linux/hardirq.h>
     11
     12enum nmi_action {
     13	NMI_SHOW_STATE	= 1 << 0,
     14	NMI_SHOW_REGS	= 1 << 1,
     15	NMI_DIE		= 1 << 2,
     16	NMI_DEBOUNCE	= 1 << 3,
     17};
     18
     19static unsigned long nmi_actions;
     20
     21static int nmi_debug_notify(struct notifier_block *self,
     22		unsigned long val, void *data)
     23{
     24	struct die_args *args = data;
     25
     26	if (likely(val != DIE_NMI))
     27		return NOTIFY_DONE;
     28
     29	if (nmi_actions & NMI_SHOW_STATE)
     30		show_state();
     31	if (nmi_actions & NMI_SHOW_REGS)
     32		show_regs(args->regs);
     33	if (nmi_actions & NMI_DEBOUNCE)
     34		mdelay(10);
     35	if (nmi_actions & NMI_DIE)
     36		return NOTIFY_BAD;
     37
     38	return NOTIFY_OK;
     39}
     40
     41static struct notifier_block nmi_debug_nb = {
     42	.notifier_call = nmi_debug_notify,
     43};
     44
     45static int __init nmi_debug_setup(char *str)
     46{
     47	char *p, *sep;
     48
     49	register_die_notifier(&nmi_debug_nb);
     50
     51	if (*str != '=')
     52		return 0;
     53
     54	for (p = str + 1; *p; p = sep + 1) {
     55		sep = strchr(p, ',');
     56		if (sep)
     57			*sep = 0;
     58		if (strcmp(p, "state") == 0)
     59			nmi_actions |= NMI_SHOW_STATE;
     60		else if (strcmp(p, "regs") == 0)
     61			nmi_actions |= NMI_SHOW_REGS;
     62		else if (strcmp(p, "debounce") == 0)
     63			nmi_actions |= NMI_DEBOUNCE;
     64		else if (strcmp(p, "die") == 0)
     65			nmi_actions |= NMI_DIE;
     66		else
     67			printk(KERN_WARNING "NMI: Unrecognized action `%s'\n",
     68				p);
     69		if (!sep)
     70			break;
     71	}
     72
     73	return 0;
     74}
     75__setup("nmi_debug", nmi_debug_setup);