Skip to content

Commit

Permalink
kdb,vt_console: Fix missed data due to pager overruns
Browse files Browse the repository at this point in the history
It is possible to miss data when using the kdb pager.  The kdb pager
does not pay attention to the maximum column constraint of the screen
or serial terminal.  This result is not incrementing the shown lines
correctly and the pager will print more lines that fit on the screen.
Obviously that is less than useful when using a VGA console where you
cannot scroll back.

The pager will now look at the kdb_buffer string to see how many
characters are printed.  It might not be perfect considering you can
output ASCII that might move the cursor position, but it is a
substantially better approximation for viewing dmesg and trace logs.

This also means that the vt screen needs to set the kdb COLUMNS
variable.

Cc: <stable@vger.kernel.org>
Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
  • Loading branch information
Jason Wessel committed Oct 12, 2012
1 parent d1871b3 commit 17b572e
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 5 deletions.
13 changes: 13 additions & 0 deletions drivers/tty/vt/vt.c
Original file line number Diff line number Diff line change
Expand Up @@ -3475,6 +3475,19 @@ int con_debug_enter(struct vc_data *vc)
kdb_set(2, setargs);
}
}
if (vc->vc_cols < 999) {
int colcount;
char cols[4];
const char *setargs[3] = {
"set",
"COLUMNS",
cols,
};
if (kdbgetintenv(setargs[0], &colcount)) {
snprintf(cols, 4, "%i", vc->vc_cols);
kdb_set(2, setargs);
}
}
#endif /* CONFIG_KGDB_KDB */
return ret;
}
Expand Down
33 changes: 28 additions & 5 deletions kernel/debug/kdb/kdb_io.c
Original file line number Diff line number Diff line change
Expand Up @@ -552,6 +552,7 @@ int vkdb_printf(const char *fmt, va_list ap)
{
int diag;
int linecount;
int colcount;
int logging, saved_loglevel = 0;
int saved_trap_printk;
int got_printf_lock = 0;
Expand Down Expand Up @@ -584,6 +585,10 @@ int vkdb_printf(const char *fmt, va_list ap)
if (diag || linecount <= 1)
linecount = 24;

diag = kdbgetintenv("COLUMNS", &colcount);
if (diag || colcount <= 1)
colcount = 80;

diag = kdbgetintenv("LOGGING", &logging);
if (diag)
logging = 0;
Expand Down Expand Up @@ -690,7 +695,7 @@ int vkdb_printf(const char *fmt, va_list ap)
gdbstub_msg_write(kdb_buffer, retlen);
} else {
if (dbg_io_ops && !dbg_io_ops->is_console) {
len = strlen(kdb_buffer);
len = retlen;
cp = kdb_buffer;
while (len--) {
dbg_io_ops->write_char(*cp);
Expand All @@ -709,11 +714,29 @@ int vkdb_printf(const char *fmt, va_list ap)
printk(KERN_INFO "%s", kdb_buffer);
}

if (KDB_STATE(PAGER) && strchr(kdb_buffer, '\n'))
kdb_nextline++;
if (KDB_STATE(PAGER)) {
/*
* Check printed string to decide how to bump the
* kdb_nextline to control when the more prompt should
* show up.
*/
int got = 0;
len = retlen;
while (len--) {
if (kdb_buffer[len] == '\n') {
kdb_nextline++;
got = 0;
} else if (kdb_buffer[len] == '\r') {
got = 0;
} else {
got++;
}
}
kdb_nextline += got / (colcount + 1);
}

/* check for having reached the LINES number of printed lines */
if (kdb_nextline == linecount) {
if (kdb_nextline >= linecount) {
char buf1[16] = "";

/* Watch out for recursion here. Any routine that calls
Expand Down Expand Up @@ -765,7 +788,7 @@ int vkdb_printf(const char *fmt, va_list ap)
kdb_grepping_flag = 0;
kdb_printf("\n");
} else if (buf1[0] == ' ') {
kdb_printf("\n");
kdb_printf("\r");
suspend_grep = 1; /* for this recursion */
} else if (buf1[0] == '\n') {
kdb_nextline = linecount - 1;
Expand Down

0 comments on commit 17b572e

Please sign in to comment.