aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/debug/kdb/kdb_main.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c
index 31df1706b9a9..1261dc7eaeb9 100644
--- a/kernel/debug/kdb/kdb_main.c
+++ b/kernel/debug/kdb/kdb_main.c
@@ -21,6 +21,7 @@
21#include <linux/smp.h> 21#include <linux/smp.h>
22#include <linux/utsname.h> 22#include <linux/utsname.h>
23#include <linux/vmalloc.h> 23#include <linux/vmalloc.h>
24#include <linux/atomic.h>
24#include <linux/module.h> 25#include <linux/module.h>
25#include <linux/mm.h> 26#include <linux/mm.h>
26#include <linux/init.h> 27#include <linux/init.h>
@@ -2107,6 +2108,32 @@ static int kdb_dmesg(int argc, const char **argv)
2107 return 0; 2108 return 0;
2108} 2109}
2109#endif /* CONFIG_PRINTK */ 2110#endif /* CONFIG_PRINTK */
2111
2112/* Make sure we balance enable/disable calls, must disable first. */
2113static atomic_t kdb_nmi_disabled;
2114
2115static int kdb_disable_nmi(int argc, const char *argv[])
2116{
2117 if (atomic_read(&kdb_nmi_disabled))
2118 return 0;
2119 atomic_set(&kdb_nmi_disabled, 1);
2120 arch_kgdb_ops.enable_nmi(0);
2121 return 0;
2122}
2123
2124static int kdb_param_enable_nmi(const char *val, const struct kernel_param *kp)
2125{
2126 if (!atomic_add_unless(&kdb_nmi_disabled, -1, 0))
2127 return -EINVAL;
2128 arch_kgdb_ops.enable_nmi(1);
2129 return 0;
2130}
2131
2132static const struct kernel_param_ops kdb_param_ops_enable_nmi = {
2133 .set = kdb_param_enable_nmi,
2134};
2135module_param_cb(enable_nmi, &kdb_param_ops_enable_nmi, NULL, 0600);
2136
2110/* 2137/*
2111 * kdb_cpu - This function implements the 'cpu' command. 2138 * kdb_cpu - This function implements the 'cpu' command.
2112 * cpu [<cpunum>] 2139 * cpu [<cpunum>]
@@ -2851,6 +2878,10 @@ static void __init kdb_inittab(void)
2851 kdb_register_repeat("dmesg", kdb_dmesg, "[lines]", 2878 kdb_register_repeat("dmesg", kdb_dmesg, "[lines]",
2852 "Display syslog buffer", 0, KDB_REPEAT_NONE); 2879 "Display syslog buffer", 0, KDB_REPEAT_NONE);
2853#endif 2880#endif
2881 if (arch_kgdb_ops.enable_nmi) {
2882 kdb_register_repeat("disable_nmi", kdb_disable_nmi, "",
2883 "Disable NMI entry to KDB", 0, KDB_REPEAT_NONE);
2884 }
2854 kdb_register_repeat("defcmd", kdb_defcmd, "name \"usage\" \"help\"", 2885 kdb_register_repeat("defcmd", kdb_defcmd, "name \"usage\" \"help\"",
2855 "Define a set of commands, down to endefcmd", 0, KDB_REPEAT_NONE); 2886 "Define a set of commands, down to endefcmd", 0, KDB_REPEAT_NONE);
2856 kdb_register_repeat("kill", kdb_kill, "<-signal> <pid>", 2887 kdb_register_repeat("kill", kdb_kill, "<-signal> <pid>",