On 09/13/2012 10:03 AM, Anton Vorontsov wrote:
> This command disables NMI-entry. If NMI source has been previously shared
> with a serial console ("debug port"), this effectively releases the port
> from KDB exclusive use, and makes the console available for normal use.
> 
> Of course, NMI can be reenabled, enable_nmi modparam is used for that:
> 
>       echo 1 > /sys/module/kdb/parameters/enable_nmi
> 
> Signed-off-by: Anton Vorontsov <[email protected]>
> ---
>  kernel/debug/kdb/kdb_main.c | 29 +++++++++++++++++++++++++++++
>  1 file changed, 29 insertions(+)
> 
> diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c
> index 31df170..9fadff1 100644
> --- a/kernel/debug/kdb/kdb_main.c
> +++ b/kernel/debug/kdb/kdb_main.c
> @@ -21,6 +21,7 @@
>  #include <linux/smp.h>
>  #include <linux/utsname.h>
>  #include <linux/vmalloc.h>
> +#include <linux/atomic.h>
>  #include <linux/module.h>
>  #include <linux/mm.h>
>  #include <linux/init.h>
> @@ -2107,6 +2108,32 @@ static int kdb_dmesg(int argc, const char **argv)
>       return 0;
>  }
>  #endif /* CONFIG_PRINTK */
> +
> +/* Make sure we balance enable/disable calls, must disable first. */
> +static atomic_t kdb_nmi_disabled;
> +
> +static int kdb_disable_nmi(int argc, const char *argv[])
> +{
> +     if (atomic_read(&kdb_nmi_disabled))
> +             return 0;
> +     atomic_set(&kdb_nmi_disabled, 1);
> +     kgdb_enable_nmi(0);
> +     return 0;
> +}
> +
> +static int kdb_param_enable_nmi(const char *val, const struct kernel_param 
> *kp)
> +{
> +     if (!atomic_add_unless(&kdb_nmi_disabled, -1, 0))
> +             return -EINVAL;
> +     kgdb_enable_nmi(1);
> +     return 0;
> +}
> +
> +static const struct kernel_param_ops kdb_param_ops_enable_nmi = {
> +     .set = kdb_param_enable_nmi,
> +};
> +module_param_cb(enable_nmi, &kdb_param_ops_enable_nmi, NULL, 0600);
> +
>  /*
>   * kdb_cpu - This function implements the 'cpu' command.
>   *   cpu     [<cpunum>]
> @@ -2851,6 +2878,8 @@ static void __init kdb_inittab(void)
>       kdb_register_repeat("dmesg", kdb_dmesg, "[lines]",
>         "Display syslog buffer", 0, KDB_REPEAT_NONE);
>  #endif


Based on what I commented in the 01/11 patch, we don't want to register a 
command if the architecture doesn't actually have it, because it just leads to 
confusion.

It needs to have an "if"

if (arch_kgdb_ops->enable_nmi) {


> +     kdb_register_repeat("disable_nmi", kdb_disable_nmi, "",
> +       "Disable NMI entry to KDB", 0, KDB_REPEAT_NONE);

}

>       kdb_register_repeat("defcmd", kdb_defcmd, "name \"usage\" \"help\"",
>         "Define a set of commands, down to endefcmd", 0, KDB_REPEAT_NONE);
>       kdb_register_repeat("kill", kdb_kill, "<-signal> <pid>",
> 


------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Kgdb-bugreport mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/kgdb-bugreport

Reply via email to