printk,kdb: capture printk() when in kdb shell

Certain calls from the kdb shell will call out to printk(), and any of
these calls should get vectored back to the kdb_printf() so that the
kdb pager and processing can be used, as well as to properly channel
I/O to the polled I/O devices.

CC: Randy Dunlap <rdunlap@xenotime.net>
Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
Acked-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
Jason Wessel
2010-05-20 21:04:27 -05:00
parent efe2f29e32
commit d37d39ae3b
5 changed files with 38 additions and 4 deletions

View File

@@ -29,6 +29,7 @@
#define CMD_BUFLEN 256
char kdb_prompt_str[CMD_BUFLEN];
int kdb_trap_printk;
static void kgdb_transition_check(char *buffer)
{
@@ -533,12 +534,12 @@ static int kdb_search_string(char *searched, char *searchfor)
return 0;
}
int kdb_printf(const char *fmt, ...)
int vkdb_printf(const char *fmt, va_list ap)
{
va_list ap;
int diag;
int linecount;
int logging, saved_loglevel = 0;
int saved_trap_printk;
int got_printf_lock = 0;
int retlen = 0;
int fnd, len;
@@ -549,6 +550,9 @@ int kdb_printf(const char *fmt, ...)
unsigned long uninitialized_var(flags);
preempt_disable();
saved_trap_printk = kdb_trap_printk;
kdb_trap_printk = 0;
/* Serialize kdb_printf if multiple cpus try to write at once.
* But if any cpu goes recursive in kdb, just print the output,
* even if it is interleaved with any other text.
@@ -575,9 +579,7 @@ int kdb_printf(const char *fmt, ...)
next_avail = kdb_buffer;
size_avail = sizeof(kdb_buffer);
}
va_start(ap, fmt);
vsnprintf(next_avail, size_avail, fmt, ap);
va_end(ap);
/*
* If kdb_parse() found that the command was cmd xxx | grep yyy
@@ -805,6 +807,20 @@ kdb_print_out:
} else {
__release(kdb_printf_lock);
}
kdb_trap_printk = saved_trap_printk;
preempt_enable();
return retlen;
}
int kdb_printf(const char *fmt, ...)
{
va_list ap;
int r;
va_start(ap, fmt);
r = vkdb_printf(fmt, ap);
va_end(ap);
return r;
}