kdb: Setup basic kdb state before invoking commands via kgdb
authorMatt Klein <mklein@twitter.com>
Wed, 2 Jan 2013 21:20:49 +0000 (13:20 -0800)
committerJason Wessel <jason.wessel@windriver.com>
Sat, 2 Mar 2013 14:52:17 +0000 (08:52 -0600)
Although invasive kdb commands are not supported via kgdb, some useful
non-invasive commands like bt* require basic kdb state to be setup before
calling into the kdb code. Factor out some of this code and call it before
and after executing kdb commands via kgdb.

Signed-off-by: Matt Klein <mklein@twitter.com>
Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
kernel/debug/debug_core.h
kernel/debug/gdbstub.c
kernel/debug/kdb/kdb_debugger.c

index 3494c28a7e7ab85ce0fed8b9e46417df8e050833..2235967e78b0c8c6c181295269b2d7cc61e40232 100644 (file)
@@ -72,6 +72,8 @@ extern int dbg_kdb_mode;
 #ifdef CONFIG_KGDB_KDB
 extern int kdb_stub(struct kgdb_state *ks);
 extern int kdb_parse(const char *cmdstr);
+extern int kdb_common_init_state(struct kgdb_state *ks);
+extern int kdb_common_deinit_state(void);
 #else /* ! CONFIG_KGDB_KDB */
 static inline int kdb_stub(struct kgdb_state *ks)
 {
index ce615e064482c00fcfb6c98cd4b3f4fa98435ba6..ea5e3edb69150f535aafd5a00caf221e8ded0e75 100644 (file)
@@ -782,7 +782,10 @@ static void gdb_cmd_query(struct kgdb_state *ks)
                        len = len / 2;
                        remcom_out_buffer[len++] = 0;
 
+                       kdb_common_init_state(ks);
                        kdb_parse(remcom_out_buffer);
+                       kdb_common_deinit_state();
+
                        strcpy(remcom_out_buffer, "OK");
                }
                break;
index be7b33b73d3001eef1b676ad1efde4f318824902..d04a6ce2d3b7f71ee10d20deb800b0ce44a62008 100644 (file)
@@ -34,6 +34,22 @@ EXPORT_SYMBOL_GPL(kdb_poll_idx);
 
 static struct kgdb_state *kdb_ks;
 
+int kdb_common_init_state(struct kgdb_state *ks)
+{
+       kdb_initial_cpu = atomic_read(&kgdb_active);
+       kdb_current_task = kgdb_info[ks->cpu].task;
+       kdb_current_regs = kgdb_info[ks->cpu].debuggerinfo;
+       return 0;
+}
+
+int kdb_common_deinit_state(void)
+{
+       kdb_initial_cpu = -1;
+       kdb_current_task = NULL;
+       kdb_current_regs = NULL;
+       return 0;
+}
+
 int kdb_stub(struct kgdb_state *ks)
 {
        int error = 0;
@@ -94,9 +110,7 @@ int kdb_stub(struct kgdb_state *ks)
        }
        /* Set initial kdb state variables */
        KDB_STATE_CLEAR(KGDB_TRANS);
-       kdb_initial_cpu = atomic_read(&kgdb_active);
-       kdb_current_task = kgdb_info[ks->cpu].task;
-       kdb_current_regs = kgdb_info[ks->cpu].debuggerinfo;
+       kdb_common_init_state(ks);
        /* Remove any breakpoints as needed by kdb and clear single step */
        kdb_bp_remove();
        KDB_STATE_CLEAR(DOING_SS);
@@ -125,9 +139,7 @@ int kdb_stub(struct kgdb_state *ks)
         * Upon exit from the kdb main loop setup break points and restart
         * the system based on the requested continue state
         */
-       kdb_initial_cpu = -1;
-       kdb_current_task = NULL;
-       kdb_current_regs = NULL;
+       kdb_common_deinit_state();
        KDB_STATE_CLEAR(PAGER);
        kdbnearsym_cleanup();
        if (error == KDB_CMD_KGDB) {