Merge branch 'misc.namei' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[linux-2.6-microblaze.git] / kernel / debug / kdb / kdb_main.c
index d8ee564..fa6deda 100644 (file)
@@ -33,7 +33,6 @@
 #include <linux/kallsyms.h>
 #include <linux/kgdb.h>
 #include <linux/kdb.h>
-#include <linux/list.h>
 #include <linux/notifier.h>
 #include <linux/interrupt.h>
 #include <linux/delay.h>
@@ -654,16 +653,17 @@ static void kdb_cmderror(int diag)
  * Returns:
  *     zero for success, a kdb diagnostic if error
  */
-struct defcmd_set {
-       int count;
-       bool usable;
-       char *name;
-       char *usage;
-       char *help;
-       char **command;
+struct kdb_macro {
+       kdbtab_t cmd;                   /* Macro command */
+       struct list_head statements;    /* Associated statement list */
 };
-static struct defcmd_set *defcmd_set;
-static int defcmd_set_count;
+
+struct kdb_macro_statement {
+       char *statement;                /* Statement text */
+       struct list_head list_node;     /* Statement list node */
+};
+
+static struct kdb_macro *kdb_macro;
 static bool defcmd_in_progress;
 
 /* Forward references */
@@ -671,53 +671,55 @@ static int kdb_exec_defcmd(int argc, const char **argv);
 
 static int kdb_defcmd2(const char *cmdstr, const char *argv0)
 {
-       struct defcmd_set *s = defcmd_set + defcmd_set_count - 1;
-       char **save_command = s->command;
+       struct kdb_macro_statement *kms;
+
+       if (!kdb_macro)
+               return KDB_NOTIMP;
+
        if (strcmp(argv0, "endefcmd") == 0) {
                defcmd_in_progress = false;
-               if (!s->count)
-                       s->usable = false;
-               if (s->usable)
-                       /* macros are always safe because when executed each
-                        * internal command re-enters kdb_parse() and is
-                        * safety checked individually.
-                        */
-                       kdb_register_flags(s->name, kdb_exec_defcmd, s->usage,
-                                          s->help, 0,
-                                          KDB_ENABLE_ALWAYS_SAFE);
+               if (!list_empty(&kdb_macro->statements))
+                       kdb_register(&kdb_macro->cmd);
                return 0;
        }
-       if (!s->usable)
-               return KDB_NOTIMP;
-       s->command = kcalloc(s->count + 1, sizeof(*(s->command)), GFP_KDB);
-       if (!s->command) {
-               kdb_printf("Could not allocate new kdb_defcmd table for %s\n",
+
+       kms = kmalloc(sizeof(*kms), GFP_KDB);
+       if (!kms) {
+               kdb_printf("Could not allocate new kdb macro command: %s\n",
                           cmdstr);
-               s->usable = false;
                return KDB_NOTIMP;
        }
-       memcpy(s->command, save_command, s->count * sizeof(*(s->command)));
-       s->command[s->count++] = kdb_strdup(cmdstr, GFP_KDB);
-       kfree(save_command);
+
+       kms->statement = kdb_strdup(cmdstr, GFP_KDB);
+       list_add_tail(&kms->list_node, &kdb_macro->statements);
+
        return 0;
 }
 
 static int kdb_defcmd(int argc, const char **argv)
 {
-       struct defcmd_set *save_defcmd_set = defcmd_set, *s;
+       kdbtab_t *mp;
+
        if (defcmd_in_progress) {
                kdb_printf("kdb: nested defcmd detected, assuming missing "
                           "endefcmd\n");
                kdb_defcmd2("endefcmd", "endefcmd");
        }
        if (argc == 0) {
-               int i;
-               for (s = defcmd_set; s < defcmd_set + defcmd_set_count; ++s) {
-                       kdb_printf("defcmd %s \"%s\" \"%s\"\n", s->name,
-                                  s->usage, s->help);
-                       for (i = 0; i < s->count; ++i)
-                               kdb_printf("%s", s->command[i]);
-                       kdb_printf("endefcmd\n");
+               kdbtab_t *kp;
+               struct kdb_macro *kmp;
+               struct kdb_macro_statement *kms;
+
+               list_for_each_entry(kp, &kdb_cmds_head, list_node) {
+                       if (kp->func == kdb_exec_defcmd) {
+                               kdb_printf("defcmd %s \"%s\" \"%s\"\n",
+                                          kp->name, kp->usage, kp->help);
+                               kmp = container_of(kp, struct kdb_macro, cmd);
+                               list_for_each_entry(kms, &kmp->statements,
+                                                   list_node)
+                                       kdb_printf("%s", kms->statement);
+                               kdb_printf("endefcmd\n");
+                       }
                }
                return 0;
        }
@@ -727,45 +729,43 @@ static int kdb_defcmd(int argc, const char **argv)
                kdb_printf("Command only available during kdb_init()\n");
                return KDB_NOTIMP;
        }
-       defcmd_set = kmalloc_array(defcmd_set_count + 1, sizeof(*defcmd_set),
-                                  GFP_KDB);
-       if (!defcmd_set)
+       kdb_macro = kzalloc(sizeof(*kdb_macro), GFP_KDB);
+       if (!kdb_macro)
                goto fail_defcmd;
-       memcpy(defcmd_set, save_defcmd_set,
-              defcmd_set_count * sizeof(*defcmd_set));
-       s = defcmd_set + defcmd_set_count;
-       memset(s, 0, sizeof(*s));
-       s->usable = true;
-       s->name = kdb_strdup(argv[1], GFP_KDB);
-       if (!s->name)
+
+       mp = &kdb_macro->cmd;
+       mp->func = kdb_exec_defcmd;
+       mp->minlen = 0;
+       mp->flags = KDB_ENABLE_ALWAYS_SAFE;
+       mp->name = kdb_strdup(argv[1], GFP_KDB);
+       if (!mp->name)
                goto fail_name;
-       s->usage = kdb_strdup(argv[2], GFP_KDB);
-       if (!s->usage)
+       mp->usage = kdb_strdup(argv[2], GFP_KDB);
+       if (!mp->usage)
                goto fail_usage;
-       s->help = kdb_strdup(argv[3], GFP_KDB);
-       if (!s->help)
+       mp->help = kdb_strdup(argv[3], GFP_KDB);
+       if (!mp->help)
                goto fail_help;
-       if (s->usage[0] == '"') {
-               strcpy(s->usage, argv[2]+1);
-               s->usage[strlen(s->usage)-1] = '\0';
+       if (mp->usage[0] == '"') {
+               strcpy(mp->usage, argv[2]+1);
+               mp->usage[strlen(mp->usage)-1] = '\0';
        }
-       if (s->help[0] == '"') {
-               strcpy(s->help, argv[3]+1);
-               s->help[strlen(s->help)-1] = '\0';
+       if (mp->help[0] == '"') {
+               strcpy(mp->help, argv[3]+1);
+               mp->help[strlen(mp->help)-1] = '\0';
        }
-       ++defcmd_set_count;
+
+       INIT_LIST_HEAD(&kdb_macro->statements);
        defcmd_in_progress = true;
-       kfree(save_defcmd_set);
        return 0;
 fail_help:
-       kfree(s->usage);
+       kfree(mp->usage);
 fail_usage:
-       kfree(s->name);
+       kfree(mp->name);
 fail_name:
-       kfree(defcmd_set);
+       kfree(kdb_macro);
 fail_defcmd:
-       kdb_printf("Could not allocate new defcmd_set entry for %s\n", argv[1]);
-       defcmd_set = save_defcmd_set;
+       kdb_printf("Could not allocate new kdb_macro entry for %s\n", argv[1]);
        return KDB_NOTIMP;
 }
 
@@ -780,25 +780,31 @@ fail_defcmd:
  */
 static int kdb_exec_defcmd(int argc, const char **argv)
 {
-       int i, ret;
-       struct defcmd_set *s;
+       int ret;
+       kdbtab_t *kp;
+       struct kdb_macro *kmp;
+       struct kdb_macro_statement *kms;
+
        if (argc != 0)
                return KDB_ARGCOUNT;
-       for (s = defcmd_set, i = 0; i < defcmd_set_count; ++i, ++s) {
-               if (strcmp(s->name, argv[0]) == 0)
+
+       list_for_each_entry(kp, &kdb_cmds_head, list_node) {
+               if (strcmp(kp->name, argv[0]) == 0)
                        break;
        }
-       if (i == defcmd_set_count) {
+       if (list_entry_is_head(kp, &kdb_cmds_head, list_node)) {
                kdb_printf("kdb_exec_defcmd: could not find commands for %s\n",
                           argv[0]);
                return KDB_NOTIMP;
        }
-       for (i = 0; i < s->count; ++i) {
-               /* Recursive use of kdb_parse, do not use argv after
-                * this point */
+       kmp = container_of(kp, struct kdb_macro, cmd);
+       list_for_each_entry(kms, &kmp->statements, list_node) {
+               /*
+                * Recursive use of kdb_parse, do not use argv after this point.
+                */
                argv = NULL;
-               kdb_printf("[%s]kdb> %s\n", s->name, s->command[i]);
-               ret = kdb_parse(s->command[i]);
+               kdb_printf("[%s]kdb> %s\n", kmp->cmd.name, kms->statement);
+               ret = kdb_parse(kms->statement);
                if (ret)
                        return ret;
        }
@@ -1009,11 +1015,11 @@ int kdb_parse(const char *cmdstr)
                 * If this command is allowed to be abbreviated,
                 * check to see if this is it.
                 */
-               if (tp->cmd_minlen && (strlen(argv[0]) <= tp->cmd_minlen) &&
-                   (strncmp(argv[0], tp->cmd_name, tp->cmd_minlen) == 0))
+               if (tp->minlen && (strlen(argv[0]) <= tp->minlen) &&
+                   (strncmp(argv[0], tp->name, tp->minlen) == 0))
                        break;
 
-               if (strcmp(argv[0], tp->cmd_name) == 0)
+               if (strcmp(argv[0], tp->name) == 0)
                        break;
        }
 
@@ -1024,8 +1030,7 @@ int kdb_parse(const char *cmdstr)
         */
        if (list_entry_is_head(tp, &kdb_cmds_head, list_node)) {
                list_for_each_entry(tp, &kdb_cmds_head, list_node) {
-                       if (strncmp(argv[0], tp->cmd_name,
-                                   strlen(tp->cmd_name)) == 0)
+                       if (strncmp(argv[0], tp->name, strlen(tp->name)) == 0)
                                break;
                }
        }
@@ -1033,19 +1038,19 @@ int kdb_parse(const char *cmdstr)
        if (!list_entry_is_head(tp, &kdb_cmds_head, list_node)) {
                int result;
 
-               if (!kdb_check_flags(tp->cmd_flags, kdb_cmd_enabled, argc <= 1))
+               if (!kdb_check_flags(tp->flags, kdb_cmd_enabled, argc <= 1))
                        return KDB_NOPERM;
 
                KDB_STATE_SET(CMD);
-               result = (*tp->cmd_func)(argc-1, (const char **)argv);
+               result = (*tp->func)(argc-1, (const char **)argv);
                if (result && ignore_errors && result > KDB_CMD_GO)
                        result = 0;
                KDB_STATE_CLEAR(CMD);
 
-               if (tp->cmd_flags & KDB_REPEAT_WITH_ARGS)
+               if (tp->flags & KDB_REPEAT_WITH_ARGS)
                        return result;
 
-               argc = tp->cmd_flags & KDB_REPEAT_NO_ARGS ? 1 : 0;
+               argc = tp->flags & KDB_REPEAT_NO_ARGS ? 1 : 0;
                if (argv[argc])
                        *(argv[argc]) = '\0';
                return result;
@@ -2412,12 +2417,12 @@ static int kdb_help(int argc, const char **argv)
                char *space = "";
                if (KDB_FLAG(CMD_INTERRUPT))
                        return 0;
-               if (!kdb_check_flags(kt->cmd_flags, kdb_cmd_enabled, true))
+               if (!kdb_check_flags(kt->flags, kdb_cmd_enabled, true))
                        continue;
-               if (strlen(kt->cmd_usage) > 20)
+               if (strlen(kt->usage) > 20)
                        space = "\n                                    ";
-               kdb_printf("%-15.15s %-20s%s%s\n", kt->cmd_name,
-                          kt->cmd_usage, space, kt->cmd_help);
+               kdb_printf("%-15.15s %-20s%s%s\n", kt->name,
+                          kt->usage, space, kt->help);
        }
        return 0;
 }
@@ -2613,56 +2618,32 @@ static int kdb_grep_help(int argc, const char **argv)
        return 0;
 }
 
-/*
- * kdb_register_flags - This function is used to register a kernel
- *     debugger command.
- * Inputs:
- *     cmd     Command name
- *     func    Function to execute the command
- *     usage   A simple usage string showing arguments
- *     help    A simple help string describing command
- *     repeat  Does the command auto repeat on enter?
- * Returns:
- *     zero for success, one if a duplicate command.
+/**
+ * kdb_register() - This function is used to register a kernel debugger
+ *                  command.
+ * @cmd: pointer to kdb command
+ *
+ * Note that it's the job of the caller to keep the memory for the cmd
+ * allocated until unregister is called.
  */
-int kdb_register_flags(char *cmd,
-                      kdb_func_t func,
-                      char *usage,
-                      char *help,
-                      short minlen,
-                      kdb_cmdflags_t flags)
+int kdb_register(kdbtab_t *cmd)
 {
        kdbtab_t *kp;
 
        list_for_each_entry(kp, &kdb_cmds_head, list_node) {
-               if (strcmp(kp->cmd_name, cmd) == 0) {
-                       kdb_printf("Duplicate kdb command registered: "
-                               "%s, func %px help %s\n", cmd, func, help);
+               if (strcmp(kp->name, cmd->name) == 0) {
+                       kdb_printf("Duplicate kdb cmd: %s, func %p help %s\n",
+                                  cmd->name, cmd->func, cmd->help);
                        return 1;
                }
        }
 
-       kp = kmalloc(sizeof(*kp), GFP_KDB);
-       if (!kp) {
-               kdb_printf("Could not allocate new kdb_command table\n");
-               return 1;
-       }
-
-       kp->cmd_name   = cmd;
-       kp->cmd_func   = func;
-       kp->cmd_usage  = usage;
-       kp->cmd_help   = help;
-       kp->cmd_minlen = minlen;
-       kp->cmd_flags  = flags;
-       kp->is_dynamic = true;
-
-       list_add_tail(&kp->list_node, &kdb_cmds_head);
-
+       list_add_tail(&cmd->list_node, &kdb_cmds_head);
        return 0;
 }
-EXPORT_SYMBOL_GPL(kdb_register_flags);
+EXPORT_SYMBOL_GPL(kdb_register);
 
-/*
+/**
  * kdb_register_table() - This function is used to register a kdb command
  *                        table.
  * @kp: pointer to kdb command table
@@ -2676,266 +2657,231 @@ void kdb_register_table(kdbtab_t *kp, size_t len)
        }
 }
 
-/*
- * kdb_register - Compatibility register function for commands that do
- *     not need to specify a repeat state.  Equivalent to
- *     kdb_register_flags with flags set to 0.
- * Inputs:
- *     cmd     Command name
- *     func    Function to execute the command
- *     usage   A simple usage string showing arguments
- *     help    A simple help string describing command
- * Returns:
- *     zero for success, one if a duplicate command.
+/**
+ * kdb_unregister() - This function is used to unregister a kernel debugger
+ *                    command. It is generally called when a module which
+ *                    implements kdb command is unloaded.
+ * @cmd: pointer to kdb command
  */
-int kdb_register(char *cmd,
-            kdb_func_t func,
-            char *usage,
-            char *help,
-            short minlen)
+void kdb_unregister(kdbtab_t *cmd)
 {
-       return kdb_register_flags(cmd, func, usage, help, minlen, 0);
-}
-EXPORT_SYMBOL_GPL(kdb_register);
-
-/*
- * kdb_unregister - This function is used to unregister a kernel
- *     debugger command.  It is generally called when a module which
- *     implements kdb commands is unloaded.
- * Inputs:
- *     cmd     Command name
- * Returns:
- *     zero for success, one command not registered.
- */
-int kdb_unregister(char *cmd)
-{
-       kdbtab_t *kp;
-
-       /*
-        *  find the command.
-        */
-       list_for_each_entry(kp, &kdb_cmds_head, list_node) {
-               if (strcmp(kp->cmd_name, cmd) == 0) {
-                       list_del(&kp->list_node);
-                       if (kp->is_dynamic)
-                               kfree(kp);
-                       return 0;
-               }
-       }
-
-       /* Couldn't find it.  */
-       return 1;
+       list_del(&cmd->list_node);
 }
 EXPORT_SYMBOL_GPL(kdb_unregister);
 
 static kdbtab_t maintab[] = {
-       {       .cmd_name = "md",
-               .cmd_func = kdb_md,
-               .cmd_usage = "<vaddr>",
-               .cmd_help = "Display Memory Contents, also mdWcN, e.g. md8c1",
-               .cmd_minlen = 1,
-               .cmd_flags = KDB_ENABLE_MEM_READ | KDB_REPEAT_NO_ARGS,
+       {       .name = "md",
+               .func = kdb_md,
+               .usage = "<vaddr>",
+               .help = "Display Memory Contents, also mdWcN, e.g. md8c1",
+               .minlen = 1,
+               .flags = KDB_ENABLE_MEM_READ | KDB_REPEAT_NO_ARGS,
        },
-       {       .cmd_name = "mdr",
-               .cmd_func = kdb_md,
-               .cmd_usage = "<vaddr> <bytes>",
-               .cmd_help = "Display Raw Memory",
-               .cmd_flags = KDB_ENABLE_MEM_READ | KDB_REPEAT_NO_ARGS,
+       {       .name = "mdr",
+               .func = kdb_md,
+               .usage = "<vaddr> <bytes>",
+               .help = "Display Raw Memory",
+               .flags = KDB_ENABLE_MEM_READ | KDB_REPEAT_NO_ARGS,
        },
-       {       .cmd_name = "mdp",
-               .cmd_func = kdb_md,
-               .cmd_usage = "<paddr> <bytes>",
-               .cmd_help = "Display Physical Memory",
-               .cmd_flags = KDB_ENABLE_MEM_READ | KDB_REPEAT_NO_ARGS,
+       {       .name = "mdp",
+               .func = kdb_md,
+               .usage = "<paddr> <bytes>",
+               .help = "Display Physical Memory",
+               .flags = KDB_ENABLE_MEM_READ | KDB_REPEAT_NO_ARGS,
        },
-       {       .cmd_name = "mds",
-               .cmd_func = kdb_md,
-               .cmd_usage = "<vaddr>",
-               .cmd_help = "Display Memory Symbolically",
-               .cmd_flags = KDB_ENABLE_MEM_READ | KDB_REPEAT_NO_ARGS,
+       {       .name = "mds",
+               .func = kdb_md,
+               .usage = "<vaddr>",
+               .help = "Display Memory Symbolically",
+               .flags = KDB_ENABLE_MEM_READ | KDB_REPEAT_NO_ARGS,
        },
-       {       .cmd_name = "mm",
-               .cmd_func = kdb_mm,
-               .cmd_usage = "<vaddr> <contents>",
-               .cmd_help = "Modify Memory Contents",
-               .cmd_flags = KDB_ENABLE_MEM_WRITE | KDB_REPEAT_NO_ARGS,
+       {       .name = "mm",
+               .func = kdb_mm,
+               .usage = "<vaddr> <contents>",
+               .help = "Modify Memory Contents",
+               .flags = KDB_ENABLE_MEM_WRITE | KDB_REPEAT_NO_ARGS,
        },
-       {       .cmd_name = "go",
-               .cmd_func = kdb_go,
-               .cmd_usage = "[<vaddr>]",
-               .cmd_help = "Continue Execution",
-               .cmd_minlen = 1,
-               .cmd_flags = KDB_ENABLE_REG_WRITE |
+       {       .name = "go",
+               .func = kdb_go,
+               .usage = "[<vaddr>]",
+               .help = "Continue Execution",
+               .minlen = 1,
+               .flags = KDB_ENABLE_REG_WRITE |
                             KDB_ENABLE_ALWAYS_SAFE_NO_ARGS,
        },
-       {       .cmd_name = "rd",
-               .cmd_func = kdb_rd,
-               .cmd_usage = "",
-               .cmd_help = "Display Registers",
-               .cmd_flags = KDB_ENABLE_REG_READ,
+       {       .name = "rd",
+               .func = kdb_rd,
+               .usage = "",
+               .help = "Display Registers",
+               .flags = KDB_ENABLE_REG_READ,
        },
-       {       .cmd_name = "rm",
-               .cmd_func = kdb_rm,
-               .cmd_usage = "<reg> <contents>",
-               .cmd_help = "Modify Registers",
-               .cmd_flags = KDB_ENABLE_REG_WRITE,
+       {       .name = "rm",
+               .func = kdb_rm,
+               .usage = "<reg> <contents>",
+               .help = "Modify Registers",
+               .flags = KDB_ENABLE_REG_WRITE,
        },
-       {       .cmd_name = "ef",
-               .cmd_func = kdb_ef,
-               .cmd_usage = "<vaddr>",
-               .cmd_help = "Display exception frame",
-               .cmd_flags = KDB_ENABLE_MEM_READ,
+       {       .name = "ef",
+               .func = kdb_ef,
+               .usage = "<vaddr>",
+               .help = "Display exception frame",
+               .flags = KDB_ENABLE_MEM_READ,
        },
-       {       .cmd_name = "bt",
-               .cmd_func = kdb_bt,
-               .cmd_usage = "[<vaddr>]",
-               .cmd_help = "Stack traceback",
-               .cmd_minlen = 1,
-               .cmd_flags = KDB_ENABLE_MEM_READ | KDB_ENABLE_INSPECT_NO_ARGS,
+       {       .name = "bt",
+               .func = kdb_bt,
+               .usage = "[<vaddr>]",
+               .help = "Stack traceback",
+               .minlen = 1,
+               .flags = KDB_ENABLE_MEM_READ | KDB_ENABLE_INSPECT_NO_ARGS,
        },
-       {       .cmd_name = "btp",
-               .cmd_func = kdb_bt,
-               .cmd_usage = "<pid>",
-               .cmd_help = "Display stack for process <pid>",
-               .cmd_flags = KDB_ENABLE_INSPECT,
+       {       .name = "btp",
+               .func = kdb_bt,
+               .usage = "<pid>",
+               .help = "Display stack for process <pid>",
+               .flags = KDB_ENABLE_INSPECT,
        },
-       {       .cmd_name = "bta",
-               .cmd_func = kdb_bt,
-               .cmd_usage = "[D|R|S|T|C|Z|E|U|I|M|A]",
-               .cmd_help = "Backtrace all processes matching state flag",
-               .cmd_flags = KDB_ENABLE_INSPECT,
+       {       .name = "bta",
+               .func = kdb_bt,
+               .usage = "[D|R|S|T|C|Z|E|U|I|M|A]",
+               .help = "Backtrace all processes matching state flag",
+               .flags = KDB_ENABLE_INSPECT,
        },
-       {       .cmd_name = "btc",
-               .cmd_func = kdb_bt,
-               .cmd_usage = "",
-               .cmd_help = "Backtrace current process on each cpu",
-               .cmd_flags = KDB_ENABLE_INSPECT,
+       {       .name = "btc",
+               .func = kdb_bt,
+               .usage = "",
+               .help = "Backtrace current process on each cpu",
+               .flags = KDB_ENABLE_INSPECT,
        },
-       {       .cmd_name = "btt",
-               .cmd_func = kdb_bt,
-               .cmd_usage = "<vaddr>",
-               .cmd_help = "Backtrace process given its struct task address",
-               .cmd_flags = KDB_ENABLE_MEM_READ | KDB_ENABLE_INSPECT_NO_ARGS,
+       {       .name = "btt",
+               .func = kdb_bt,
+               .usage = "<vaddr>",
+               .help = "Backtrace process given its struct task address",
+               .flags = KDB_ENABLE_MEM_READ | KDB_ENABLE_INSPECT_NO_ARGS,
        },
-       {       .cmd_name = "env",
-               .cmd_func = kdb_env,
-               .cmd_usage = "",
-               .cmd_help = "Show environment variables",
-               .cmd_flags = KDB_ENABLE_ALWAYS_SAFE,
+       {       .name = "env",
+               .func = kdb_env,
+               .usage = "",
+               .help = "Show environment variables",
+               .flags = KDB_ENABLE_ALWAYS_SAFE,
        },
-       {       .cmd_name = "set",
-               .cmd_func = kdb_set,
-               .cmd_usage = "",
-               .cmd_help = "Set environment variables",
-               .cmd_flags = KDB_ENABLE_ALWAYS_SAFE,
+       {       .name = "set",
+               .func = kdb_set,
+               .usage = "",
+               .help = "Set environment variables",
+               .flags = KDB_ENABLE_ALWAYS_SAFE,
        },
-       {       .cmd_name = "help",
-               .cmd_func = kdb_help,
-               .cmd_usage = "",
-               .cmd_help = "Display Help Message",
-               .cmd_minlen = 1,
-               .cmd_flags = KDB_ENABLE_ALWAYS_SAFE,
+       {       .name = "help",
+               .func = kdb_help,
+               .usage = "",
+               .help = "Display Help Message",
+               .minlen = 1,
+               .flags = KDB_ENABLE_ALWAYS_SAFE,
        },
-       {       .cmd_name = "?",
-               .cmd_func = kdb_help,
-               .cmd_usage = "",
-               .cmd_help = "Display Help Message",
-               .cmd_flags = KDB_ENABLE_ALWAYS_SAFE,
+       {       .name = "?",
+               .func = kdb_help,
+               .usage = "",
+               .help = "Display Help Message",
+               .flags = KDB_ENABLE_ALWAYS_SAFE,
        },
-       {       .cmd_name = "cpu",
-               .cmd_func = kdb_cpu,
-               .cmd_usage = "<cpunum>",
-               .cmd_help = "Switch to new cpu",
-               .cmd_flags = KDB_ENABLE_ALWAYS_SAFE_NO_ARGS,
+       {       .name = "cpu",
+               .func = kdb_cpu,
+               .usage = "<cpunum>",
+               .help = "Switch to new cpu",
+               .flags = KDB_ENABLE_ALWAYS_SAFE_NO_ARGS,
        },
-       {       .cmd_name = "kgdb",
-               .cmd_func = kdb_kgdb,
-               .cmd_usage = "",
-               .cmd_help = "Enter kgdb mode",
-               .cmd_flags = 0,
+       {       .name = "kgdb",
+               .func = kdb_kgdb,
+               .usage = "",
+               .help = "Enter kgdb mode",
+               .flags = 0,
        },
-       {       .cmd_name = "ps",
-               .cmd_func = kdb_ps,
-               .cmd_usage = "[<flags>|A]",
-               .cmd_help = "Display active task list",
-               .cmd_flags = KDB_ENABLE_INSPECT,
+       {       .name = "ps",
+               .func = kdb_ps,
+               .usage = "[<flags>|A]",
+               .help = "Display active task list",
+               .flags = KDB_ENABLE_INSPECT,
        },
-       {       .cmd_name = "pid",
-               .cmd_func = kdb_pid,
-               .cmd_usage = "<pidnum>",
-               .cmd_help = "Switch to another task",
-               .cmd_flags = KDB_ENABLE_INSPECT,
+       {       .name = "pid",
+               .func = kdb_pid,
+               .usage = "<pidnum>",
+               .help = "Switch to another task",
+               .flags = KDB_ENABLE_INSPECT,
        },
-       {       .cmd_name = "reboot",
-               .cmd_func = kdb_reboot,
-               .cmd_usage = "",
-               .cmd_help = "Reboot the machine immediately",
-               .cmd_flags = KDB_ENABLE_REBOOT,
+       {       .name = "reboot",
+               .func = kdb_reboot,
+               .usage = "",
+               .help = "Reboot the machine immediately",
+               .flags = KDB_ENABLE_REBOOT,
        },
 #if defined(CONFIG_MODULES)
-       {       .cmd_name = "lsmod",
-               .cmd_func = kdb_lsmod,
-               .cmd_usage = "",
-               .cmd_help = "List loaded kernel modules",
-               .cmd_flags = KDB_ENABLE_INSPECT,
+       {       .name = "lsmod",
+               .func = kdb_lsmod,
+               .usage = "",
+               .help = "List loaded kernel modules",
+               .flags = KDB_ENABLE_INSPECT,
        },
 #endif
 #if defined(CONFIG_MAGIC_SYSRQ)
-       {       .cmd_name = "sr",
-               .cmd_func = kdb_sr,
-               .cmd_usage = "<key>",
-               .cmd_help = "Magic SysRq key",
-               .cmd_flags = KDB_ENABLE_ALWAYS_SAFE,
+       {       .name = "sr",
+               .func = kdb_sr,
+               .usage = "<key>",
+               .help = "Magic SysRq key",
+               .flags = KDB_ENABLE_ALWAYS_SAFE,
        },
 #endif
 #if defined(CONFIG_PRINTK)
-       {       .cmd_name = "dmesg",
-               .cmd_func = kdb_dmesg,
-               .cmd_usage = "[lines]",
-               .cmd_help = "Display syslog buffer",
-               .cmd_flags = KDB_ENABLE_ALWAYS_SAFE,
+       {       .name = "dmesg",
+               .func = kdb_dmesg,
+               .usage = "[lines]",
+               .help = "Display syslog buffer",
+               .flags = KDB_ENABLE_ALWAYS_SAFE,
        },
 #endif
-       {       .cmd_name = "defcmd",
-               .cmd_func = kdb_defcmd,
-               .cmd_usage = "name \"usage\" \"help\"",
-               .cmd_help = "Define a set of commands, down to endefcmd",
-               .cmd_flags = KDB_ENABLE_ALWAYS_SAFE,
+       {       .name = "defcmd",
+               .func = kdb_defcmd,
+               .usage = "name \"usage\" \"help\"",
+               .help = "Define a set of commands, down to endefcmd",
+               /*
+                * Macros are always safe because when executed each
+                * internal command re-enters kdb_parse() and is safety
+                * checked individually.
+                */
+               .flags = KDB_ENABLE_ALWAYS_SAFE,
        },
-       {       .cmd_name = "kill",
-               .cmd_func = kdb_kill,
-               .cmd_usage = "<-signal> <pid>",
-               .cmd_help = "Send a signal to a process",
-               .cmd_flags = KDB_ENABLE_SIGNAL,
+       {       .name = "kill",
+               .func = kdb_kill,
+               .usage = "<-signal> <pid>",
+               .help = "Send a signal to a process",
+               .flags = KDB_ENABLE_SIGNAL,
        },
-       {       .cmd_name = "summary",
-               .cmd_func = kdb_summary,
-               .cmd_usage = "",
-               .cmd_help = "Summarize the system",
-               .cmd_minlen = 4,
-               .cmd_flags = KDB_ENABLE_ALWAYS_SAFE,
+       {       .name = "summary",
+               .func = kdb_summary,
+               .usage = "",
+               .help = "Summarize the system",
+               .minlen = 4,
+               .flags = KDB_ENABLE_ALWAYS_SAFE,
        },
-       {       .cmd_name = "per_cpu",
-               .cmd_func = kdb_per_cpu,
-               .cmd_usage = "<sym> [<bytes>] [<cpu>]",
-               .cmd_help = "Display per_cpu variables",
-               .cmd_minlen = 3,
-               .cmd_flags = KDB_ENABLE_MEM_READ,
+       {       .name = "per_cpu",
+               .func = kdb_per_cpu,
+               .usage = "<sym> [<bytes>] [<cpu>]",
+               .help = "Display per_cpu variables",
+               .minlen = 3,
+               .flags = KDB_ENABLE_MEM_READ,
        },
-       {       .cmd_name = "grephelp",
-               .cmd_func = kdb_grep_help,
-               .cmd_usage = "",
-               .cmd_help = "Display help on | grep",
-               .cmd_flags = KDB_ENABLE_ALWAYS_SAFE,
+       {       .name = "grephelp",
+               .func = kdb_grep_help,
+               .usage = "",
+               .help = "Display help on | grep",
+               .flags = KDB_ENABLE_ALWAYS_SAFE,
        },
 };
 
 static kdbtab_t nmicmd = {
-       .cmd_name = "disable_nmi",
-       .cmd_func = kdb_disable_nmi,
-       .cmd_usage = "",
-       .cmd_help = "Disable NMI entry to KDB",
-       .cmd_flags = KDB_ENABLE_ALWAYS_SAFE,
+       .name = "disable_nmi",
+       .func = kdb_disable_nmi,
+       .usage = "",
+       .help = "Disable NMI entry to KDB",
+       .flags = KDB_ENABLE_ALWAYS_SAFE,
 };
 
 /* Initialize the kdb command table. */