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