When KDB prints the process regs and backtrace, every line is preceeded
with the character 'd'. This is the level argument to printk which
is not interpreted when KDB is printing. Skip over this possible
printk level in the outgoing string to fix this.
Here is a small sample:
dRIP: 0010:[<ffffffff814e96ca>] [<ffffffff814e96ca>] poll_idle+0x4a/0x90
dRSP: 0018:ffff88081d5eddd8 EFLAGS: 00000246
dRAX: 0000000400000000 RBX: 00000216ae7fbf5d RCX: 0000021658a8e600
dRDX: ffff88081d5ec010 RSI: ffffffff819a7d20 RDI: ffffffff8193c140
Cc: Tim Bird <[email protected]>
Reviewed-by: Dimitri Sivanich <[email protected]>
Signed-off-by: Mike Travis <[email protected]>
---
kernel/debug/kdb/kdb_io.c | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
--- linux.orig/kernel/debug/kdb/kdb_io.c
+++ linux/kernel/debug/kdb/kdb_io.c
@@ -559,6 +559,7 @@ int vkdb_printf(const char *fmt, va_list
int retlen = 0;
int fnd, len;
char *cp, *cp2, *cphold = NULL, replaced_byte = ' ';
+ const char *ostring;
char *moreprompt = "more> ";
struct console *c = console_drivers;
static DEFINE_SPINLOCK(kdb_printf_lock);
@@ -690,20 +691,21 @@ kdb_printit:
/*
* Write to all consoles.
*/
- retlen = strlen(kdb_buffer);
+ ostring = printk_skip_level(kdb_buffer);
+ retlen = strlen(ostring);
if (!dbg_kdb_mode && kgdb_connected) {
- gdbstub_msg_write(kdb_buffer, retlen);
+ gdbstub_msg_write(ostring, retlen);
} else {
if (dbg_io_ops && !dbg_io_ops->is_console) {
len = retlen;
- cp = kdb_buffer;
+ cp = (char *)ostring;
while (len--) {
dbg_io_ops->write_char(*cp);
cp++;
}
}
while (c) {
- c->write(c, kdb_buffer, retlen);
+ c->write(c, ostring, retlen);
touch_nmi_watchdog();
c = c->next;
}
@@ -711,7 +713,7 @@ kdb_printit:
if (logging) {
saved_loglevel = console_loglevel;
console_loglevel = 0;
- printk(KERN_INFO "%s", kdb_buffer);
+ pr_info("%s", ostring);
}
if (KDB_STATE(PAGER)) {
@@ -723,10 +725,10 @@ kdb_printit:
int got = 0;
len = retlen;
while (len--) {
- if (kdb_buffer[len] == '\n') {
+ if (ostring[len] == '\n') {
kdb_nextline++;
got = 0;
- } else if (kdb_buffer[len] == '\r') {
+ } else if (ostring[len] == '\r') {
got = 0;
} else {
got++;
--