Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jwessel...
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 1 Aug 2011 23:39:40 +0000 (13:39 -1000)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 1 Aug 2011 23:39:40 +0000 (13:39 -1000)
* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jwessel/linux-2.6-kgdb:
  kdb,kgdb: Allow arbitrary kgdb magic knock sequences
  kdb: Remove all references to DOING_KGDB2
  kdb,kgdb: Implement switch and pass buffer from kdb -> gdb
  kdb: cleanup unused variables missed in the original kdb merge

kernel/debug/gdbstub.c
kernel/debug/kdb/kdb_bt.c
kernel/debug/kdb/kdb_cmds
kernel/debug/kdb/kdb_debugger.c
kernel/debug/kdb/kdb_io.c
kernel/debug/kdb/kdb_main.c
kernel/debug/kdb/kdb_private.h

index a11db956dd62c4c5a5fa22699ccd3662a88f00bc..34872482315e28eade2a7a1d92bfcb0e6cdd5813 100644 (file)
@@ -42,6 +42,8 @@
 /* Our I/O buffers. */
 static char                    remcom_in_buffer[BUFMAX];
 static char                    remcom_out_buffer[BUFMAX];
+static int                     gdbstub_use_prev_in_buf;
+static int                     gdbstub_prev_in_buf_pos;
 
 /* Storage for the registers, in GDB format. */
 static unsigned long           gdb_regs[(NUMREGBYTES +
@@ -58,6 +60,13 @@ static int gdbstub_read_wait(void)
        int ret = -1;
        int i;
 
+       if (unlikely(gdbstub_use_prev_in_buf)) {
+               if (gdbstub_prev_in_buf_pos < gdbstub_use_prev_in_buf)
+                       return remcom_in_buffer[gdbstub_prev_in_buf_pos++];
+               else
+                       gdbstub_use_prev_in_buf = 0;
+       }
+
        /* poll any additional I/O interfaces that are defined */
        while (ret < 0)
                for (i = 0; kdb_poll_funcs[i] != NULL; i++) {
@@ -109,7 +118,6 @@ static void get_packet(char *buffer)
                        buffer[count] = ch;
                        count = count + 1;
                }
-               buffer[count] = 0;
 
                if (ch == '#') {
                        xmitcsum = hex_to_bin(gdbstub_read_wait()) << 4;
@@ -124,6 +132,7 @@ static void get_packet(char *buffer)
                        if (dbg_io_ops->flush)
                                dbg_io_ops->flush();
                }
+               buffer[count] = 0;
        } while (checksum != xmitcsum);
 }
 
@@ -1082,12 +1091,11 @@ int gdbstub_state(struct kgdb_state *ks, char *cmd)
        case 'c':
                strcpy(remcom_in_buffer, cmd);
                return 0;
-       case '?':
-               gdb_cmd_status(ks);
-               break;
-       case '\0':
-               strcpy(remcom_out_buffer, "");
-               break;
+       case '$':
+               strcpy(remcom_in_buffer, cmd);
+               gdbstub_use_prev_in_buf = strlen(remcom_in_buffer);
+               gdbstub_prev_in_buf_pos = 0;
+               return 0;
        }
        dbg_io_ops->write_char('+');
        put_packet(remcom_out_buffer);
index 2f62fe85f16a87e2094df61f63f6e774d8ea1518..7179eac7b41cbf6e8d43f423d8a9ac0e8018efc9 100644 (file)
@@ -112,9 +112,8 @@ kdb_bt(int argc, const char **argv)
        unsigned long addr;
        long offset;
 
-       kdbgetintenv("BTARGS", &argcount);      /* Arguments to print */
-       kdbgetintenv("BTAPROMPT", &btaprompt);  /* Prompt after each
-                                                * proc in bta */
+       /* Prompt after each proc in bta */
+       kdbgetintenv("BTAPROMPT", &btaprompt);
 
        if (strcmp(argv[0], "bta") == 0) {
                struct task_struct *g, *p;
index 56c88e4db309e4972fc7ec1609d629f78b752b33..9834ad303ab6f4e4df59c884bb8cc7ac42a72180 100644 (file)
@@ -18,16 +18,12 @@ defcmd dumpcommon "" "Common kdb debugging"
 endefcmd
 
 defcmd dumpall "" "First line debugging"
-  set BTSYMARG 1
-  set BTARGS 9
   pid R
   -dumpcommon
   -bta
 endefcmd
 
 defcmd dumpcpu "" "Same as dumpall but only tasks on cpus"
-  set BTSYMARG 1
-  set BTARGS 9
   pid R
   -dumpcommon
   -btc
index dd0b1b7dd02c9bb5d8d32b84c39f0a62a4db9c56..d9ca9aa481ecec52edc5a7b41ef000cabe6c5af6 100644 (file)
@@ -30,6 +30,8 @@ EXPORT_SYMBOL_GPL(kdb_poll_funcs);
 int kdb_poll_idx = 1;
 EXPORT_SYMBOL_GPL(kdb_poll_idx);
 
+static struct kgdb_state *kdb_ks;
+
 int kdb_stub(struct kgdb_state *ks)
 {
        int error = 0;
@@ -39,6 +41,7 @@ int kdb_stub(struct kgdb_state *ks)
        kdb_dbtrap_t db_result = KDB_DB_NOBPT;
        int i;
 
+       kdb_ks = ks;
        if (KDB_STATE(REENTRY)) {
                reason = KDB_REASON_SWITCH;
                KDB_STATE_CLEAR(REENTRY);
@@ -123,20 +126,8 @@ int kdb_stub(struct kgdb_state *ks)
        KDB_STATE_CLEAR(PAGER);
        kdbnearsym_cleanup();
        if (error == KDB_CMD_KGDB) {
-               if (KDB_STATE(DOING_KGDB) || KDB_STATE(DOING_KGDB2)) {
-       /*
-        * This inteface glue which allows kdb to transition in into
-        * the gdb stub.  In order to do this the '?' or '' gdb serial
-        * packet response is processed here.  And then control is
-        * passed to the gdbstub.
-        */
-                       if (KDB_STATE(DOING_KGDB))
-                               gdbstub_state(ks, "?");
-                       else
-                               gdbstub_state(ks, "");
+               if (KDB_STATE(DOING_KGDB))
                        KDB_STATE_CLEAR(DOING_KGDB);
-                       KDB_STATE_CLEAR(DOING_KGDB2);
-               }
                return DBG_PASS_EVENT;
        }
        kdb_bp_install(ks->linux_regs);
@@ -166,3 +157,7 @@ int kdb_stub(struct kgdb_state *ks)
        return kgdb_info[ks->cpu].ret_state;
 }
 
+void kdb_gdb_state_pass(char *buf)
+{
+       gdbstub_state(kdb_ks, buf);
+}
index 96fdaac46a80b03c41e79b95a8c7e521ad437021..4802eb5840e1a138057444fbb7e1a7953a507d96 100644 (file)
@@ -31,15 +31,21 @@ char kdb_prompt_str[CMD_BUFLEN];
 
 int kdb_trap_printk;
 
-static void kgdb_transition_check(char *buffer)
+static int kgdb_transition_check(char *buffer)
 {
-       int slen = strlen(buffer);
-       if (strncmp(buffer, "$?#3f", slen) != 0 &&
-           strncmp(buffer, "$qSupported#37", slen) != 0 &&
-           strncmp(buffer, "+$qSupported#37", slen) != 0) {
+       if (buffer[0] != '+' && buffer[0] != '$') {
                KDB_STATE_SET(KGDB_TRANS);
                kdb_printf("%s", buffer);
+       } else {
+               int slen = strlen(buffer);
+               if (slen > 3 && buffer[slen - 3] == '#') {
+                       kdb_gdb_state_pass(buffer);
+                       strcpy(buffer, "kgdb");
+                       KDB_STATE_SET(DOING_KGDB);
+                       return 1;
+               }
        }
+       return 0;
 }
 
 static int kdb_read_get_key(char *buffer, size_t bufsize)
@@ -251,6 +257,10 @@ poll_again:
        case 13: /* enter */
                *lastchar++ = '\n';
                *lastchar++ = '\0';
+               if (!KDB_STATE(KGDB_TRANS)) {
+                       KDB_STATE_SET(KGDB_TRANS);
+                       kdb_printf("%s", buffer);
+               }
                kdb_printf("\n");
                return buffer;
        case 4: /* Del */
@@ -382,22 +392,26 @@ poll_again:
                                 * printed characters if we think that
                                 * kgdb is connecting, until the check
                                 * fails */
-                               if (!KDB_STATE(KGDB_TRANS))
-                                       kgdb_transition_check(buffer);
-                               else
+                               if (!KDB_STATE(KGDB_TRANS)) {
+                                       if (kgdb_transition_check(buffer))
+                                               return buffer;
+                               } else {
                                        kdb_printf("%c", key);
+                               }
                        }
                        /* Special escape to kgdb */
                        if (lastchar - buffer >= 5 &&
                            strcmp(lastchar - 5, "$?#3f") == 0) {
+                               kdb_gdb_state_pass(lastchar - 5);
                                strcpy(buffer, "kgdb");
                                KDB_STATE_SET(DOING_KGDB);
                                return buffer;
                        }
-                       if (lastchar - buffer >= 14 &&
-                           strcmp(lastchar - 14, "$qSupported#37") == 0) {
+                       if (lastchar - buffer >= 11 &&
+                           strcmp(lastchar - 11, "$qSupported") == 0) {
+                               kdb_gdb_state_pass(lastchar - 11);
                                strcpy(buffer, "kgdb");
-                               KDB_STATE_SET(DOING_KGDB2);
+                               KDB_STATE_SET(DOING_KGDB);
                                return buffer;
                        }
                }
index be14779bcef66751bbbacc020c166f90ab38ff59..63786e71a3cd9e1003a7a2bb6f399170f773756d 100644 (file)
@@ -145,7 +145,6 @@ static char *__env[] = {
 #endif
  "RADIX=16",
  "MDCOUNT=8",                  /* lines of md output */
- "BTARGS=9",                   /* 9 possible args in bt */
  KDB_PLATFORM_ENV,
  "DTABCOUNT=30",
  "NOSECT=1",
@@ -172,6 +171,7 @@ static char *__env[] = {
  (char *)0,
  (char *)0,
  (char *)0,
+ (char *)0,
 };
 
 static const int __nenv = (sizeof(__env) / sizeof(char *));
@@ -1386,7 +1386,7 @@ int kdb_main_loop(kdb_reason_t reason, kdb_reason_t reason2, int error,
                }
 
                if (result == KDB_CMD_KGDB) {
-                       if (!(KDB_STATE(DOING_KGDB) || KDB_STATE(DOING_KGDB2)))
+                       if (!KDB_STATE(DOING_KGDB))
                                kdb_printf("Entering please attach debugger "
                                           "or use $D#44+ or $3#33\n");
                        break;
index 35d69ed1dfb58e388dcd8717776631aa4473802d..e381d105b40b827c71660d6f5265d197dba18c9f 100644 (file)
@@ -21,7 +21,6 @@
 #define KDB_CMD_SS     (-1003)
 #define KDB_CMD_SSB    (-1004)
 #define KDB_CMD_KGDB (-1005)
-#define KDB_CMD_KGDB2 (-1006)
 
 /* Internal debug flags */
 #define KDB_DEBUG_FLAG_BP      0x0002  /* Breakpoint subsystem debug */
@@ -146,7 +145,6 @@ extern int kdb_state;
                                                 * keyboard on this cpu */
 #define KDB_STATE_KEXEC                0x00040000      /* kexec issued */
 #define KDB_STATE_DOING_KGDB   0x00080000      /* kgdb enter now issued */
-#define KDB_STATE_DOING_KGDB2  0x00100000      /* kgdb enter now issued */
 #define KDB_STATE_KGDB_TRANS   0x00200000      /* Transition to kgdb */
 #define KDB_STATE_ARCH         0xff000000      /* Reserved for arch
                                                 * specific use */
@@ -218,6 +216,7 @@ extern void kdb_print_nameval(const char *name, unsigned long val);
 extern void kdb_send_sig_info(struct task_struct *p, struct siginfo *info);
 extern void kdb_meminfo_proc_show(void);
 extern char *kdb_getstr(char *, size_t, char *);
+extern void kdb_gdb_state_pass(char *buf);
 
 /* Defines for kdb_symbol_print */
 #define KDB_SP_SPACEB  0x0001          /* Space before string */