From e2fd3362837b7259f18d4988efb36cdae8393347 Mon Sep 17 00:00:00 2001 From: Jason Wessel Date: Thu, 20 May 2010 21:04:26 -0500 Subject: [PATCH] --- yaml --- r: 196351 b: refs/heads/master c: efe2f29e324fd20e0449bcd6dc6dbe4734c2ba94 h: refs/heads/master i: 196349: 8676dd25085490a512ed9465406e85ff54f0d0f7 196347: 5b1c0c3a83b2da393031a888348d351832c8cbd5 196343: 6dabed7ab125638588b7df1c7182d374b751dbf4 196335: 4520f81bf85ac7924106a93c3b80152ceaa55aa2 196319: d87a94773b6a12ff609fd2a641044dcab30ee1a7 196287: 71541a3f7bd50b65dbcc8e0623751c7e42d23adb 196223: f31a9c280cf564054a647e3166525320aa7b9c78 196095: fb7d86b5042e4db8e2bebb991e10e0413092874d v: v3 --- [refs] | 2 +- trunk/drivers/serial/kgdboc.c | 14 ++++++++++++++ trunk/include/linux/kgdb.h | 3 +++ trunk/kernel/debug/kdb/kdb_io.c | 16 ++++++++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 35585c0e3ab9..b9b6c8093eac 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 1cee5e35f15d0893be1ba944f1aec8676e43ab76 +refs/heads/master: efe2f29e324fd20e0449bcd6dc6dbe4734c2ba94 diff --git a/trunk/drivers/serial/kgdboc.c b/trunk/drivers/serial/kgdboc.c index ecef6e1a599a..b765ab48dfe7 100644 --- a/trunk/drivers/serial/kgdboc.c +++ b/trunk/drivers/serial/kgdboc.c @@ -16,6 +16,7 @@ #include #include #include +#include #define MAX_CONFIG_LEN 40 @@ -93,12 +94,14 @@ static int configure_kgdboc(void) int tty_line = 0; int err; char *cptr = config; + struct console *cons; err = kgdboc_option_setup(config); if (err || !strlen(config) || isspace(config[0])) goto noconfig; err = -ENODEV; + kgdboc_io_ops.is_console = 0; kgdb_tty_driver = NULL; if (kgdboc_register_kbd(&cptr)) @@ -108,6 +111,17 @@ static int configure_kgdboc(void) if (!p) goto noconfig; + cons = console_drivers; + while (cons) { + int idx; + if (cons->device && cons->device(cons, &idx) == p && + idx == tty_line) { + kgdboc_io_ops.is_console = 1; + break; + } + cons = cons->next; + } + kgdb_tty_driver = p; kgdb_tty_line = tty_line; diff --git a/trunk/include/linux/kgdb.h b/trunk/include/linux/kgdb.h index ee007ea341b8..6c784ab6856a 100644 --- a/trunk/include/linux/kgdb.h +++ b/trunk/include/linux/kgdb.h @@ -247,6 +247,8 @@ struct kgdb_arch { * the I/O driver. * @post_exception: Pointer to a function that will do any cleanup work * for the I/O driver. + * @is_console: 1 if the end device is a console 0 if the I/O device is + * not a console */ struct kgdb_io { const char *name; @@ -256,6 +258,7 @@ struct kgdb_io { int (*init) (void); void (*pre_exception) (void); void (*post_exception) (void); + int is_console; }; extern struct kgdb_arch arch_kgdb_ops; diff --git a/trunk/kernel/debug/kdb/kdb_io.c b/trunk/kernel/debug/kdb/kdb_io.c index 8339b291e8bc..58be7e9c9e95 100644 --- a/trunk/kernel/debug/kdb/kdb_io.c +++ b/trunk/kernel/debug/kdb/kdb_io.c @@ -673,6 +673,14 @@ int kdb_printf(const char *fmt, ...) if (!dbg_kdb_mode && kgdb_connected) { gdbstub_msg_write(kdb_buffer, retlen); } else { + if (!dbg_io_ops->is_console) { + len = strlen(kdb_buffer); + cp = kdb_buffer; + while (len--) { + dbg_io_ops->write_char(*cp); + cp++; + } + } while (c) { c->write(c, kdb_buffer, retlen); touch_nmi_watchdog(); @@ -719,6 +727,14 @@ int kdb_printf(const char *fmt, ...) kdb_input_flush(); c = console_drivers; + if (!dbg_io_ops->is_console) { + len = strlen(moreprompt); + cp = moreprompt; + while (len--) { + dbg_io_ops->write_char(*cp); + cp++; + } + } while (c) { c->write(c, moreprompt, strlen(moreprompt)); touch_nmi_watchdog();