Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/sh/kernel/nmi_debug.c
26424 views
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
12
enum 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
19
static unsigned long nmi_actions;
20
21
static 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
41
static struct notifier_block nmi_debug_nb = {
42
.notifier_call = nmi_debug_notify,
43
};
44
45
static 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 1;
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 1;
74
}
75
__setup("nmi_debug", nmi_debug_setup);
76
77