|
@@ -439,7 +439,7 @@ poll_again:
|
|
|
* substituted for %d, %x or %o in the prompt.
|
|
|
*/
|
|
|
|
|
|
-char *kdb_getstr(char *buffer, size_t bufsize, char *prompt)
|
|
|
+char *kdb_getstr(char *buffer, size_t bufsize, const char *prompt)
|
|
|
{
|
|
|
if (prompt && kdb_prompt_str != prompt)
|
|
|
strncpy(kdb_prompt_str, prompt, CMD_BUFLEN);
|
|
@@ -548,7 +548,7 @@ static int kdb_search_string(char *searched, char *searchfor)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-int vkdb_printf(const char *fmt, va_list ap)
|
|
|
+int vkdb_printf(enum kdb_msgsrc src, const char *fmt, va_list ap)
|
|
|
{
|
|
|
int diag;
|
|
|
int linecount;
|
|
@@ -680,6 +680,12 @@ int vkdb_printf(const char *fmt, va_list ap)
|
|
|
size_avail = sizeof(kdb_buffer) - len;
|
|
|
goto kdb_print_out;
|
|
|
}
|
|
|
+ if (kdb_grepping_flag >= KDB_GREPPING_FLAG_SEARCH)
|
|
|
+ /*
|
|
|
+ * This was a interactive search (using '/' at more
|
|
|
+ * prompt) and it has completed. Clear the flag.
|
|
|
+ */
|
|
|
+ kdb_grepping_flag = 0;
|
|
|
/*
|
|
|
* at this point the string is a full line and
|
|
|
* should be printed, up to the null.
|
|
@@ -691,19 +697,20 @@ kdb_printit:
|
|
|
* Write to all consoles.
|
|
|
*/
|
|
|
retlen = strlen(kdb_buffer);
|
|
|
+ cp = (char *) printk_skip_level(kdb_buffer);
|
|
|
if (!dbg_kdb_mode && kgdb_connected) {
|
|
|
- gdbstub_msg_write(kdb_buffer, retlen);
|
|
|
+ gdbstub_msg_write(cp, retlen - (cp - kdb_buffer));
|
|
|
} else {
|
|
|
if (dbg_io_ops && !dbg_io_ops->is_console) {
|
|
|
- len = retlen;
|
|
|
- cp = kdb_buffer;
|
|
|
+ len = retlen - (cp - kdb_buffer);
|
|
|
+ cp2 = cp;
|
|
|
while (len--) {
|
|
|
- dbg_io_ops->write_char(*cp);
|
|
|
- cp++;
|
|
|
+ dbg_io_ops->write_char(*cp2);
|
|
|
+ cp2++;
|
|
|
}
|
|
|
}
|
|
|
while (c) {
|
|
|
- c->write(c, kdb_buffer, retlen);
|
|
|
+ c->write(c, cp, retlen - (cp - kdb_buffer));
|
|
|
touch_nmi_watchdog();
|
|
|
c = c->next;
|
|
|
}
|
|
@@ -711,7 +718,10 @@ kdb_printit:
|
|
|
if (logging) {
|
|
|
saved_loglevel = console_loglevel;
|
|
|
console_loglevel = CONSOLE_LOGLEVEL_SILENT;
|
|
|
- printk(KERN_INFO "%s", kdb_buffer);
|
|
|
+ if (printk_get_level(kdb_buffer) || src == KDB_MSGSRC_PRINTK)
|
|
|
+ printk("%s", kdb_buffer);
|
|
|
+ else
|
|
|
+ pr_info("%s", kdb_buffer);
|
|
|
}
|
|
|
|
|
|
if (KDB_STATE(PAGER)) {
|
|
@@ -794,11 +804,23 @@ kdb_printit:
|
|
|
kdb_nextline = linecount - 1;
|
|
|
kdb_printf("\r");
|
|
|
suspend_grep = 1; /* for this recursion */
|
|
|
+ } else if (buf1[0] == '/' && !kdb_grepping_flag) {
|
|
|
+ kdb_printf("\r");
|
|
|
+ kdb_getstr(kdb_grep_string, KDB_GREP_STRLEN,
|
|
|
+ kdbgetenv("SEARCHPROMPT") ?: "search> ");
|
|
|
+ *strchrnul(kdb_grep_string, '\n') = '\0';
|
|
|
+ kdb_grepping_flag += KDB_GREPPING_FLAG_SEARCH;
|
|
|
+ suspend_grep = 1; /* for this recursion */
|
|
|
} else if (buf1[0] && buf1[0] != '\n') {
|
|
|
/* user hit something other than enter */
|
|
|
suspend_grep = 1; /* for this recursion */
|
|
|
- kdb_printf("\nOnly 'q' or 'Q' are processed at more "
|
|
|
- "prompt, input ignored\n");
|
|
|
+ if (buf1[0] != '/')
|
|
|
+ kdb_printf(
|
|
|
+ "\nOnly 'q', 'Q' or '/' are processed at "
|
|
|
+ "more prompt, input ignored\n");
|
|
|
+ else
|
|
|
+ kdb_printf("\n'/' cannot be used during | "
|
|
|
+ "grep filtering, input ignored\n");
|
|
|
} else if (kdb_grepping_flag) {
|
|
|
/* user hit enter */
|
|
|
suspend_grep = 1; /* for this recursion */
|
|
@@ -844,7 +866,7 @@ int kdb_printf(const char *fmt, ...)
|
|
|
int r;
|
|
|
|
|
|
va_start(ap, fmt);
|
|
|
- r = vkdb_printf(fmt, ap);
|
|
|
+ r = vkdb_printf(KDB_MSGSRC_INTERNAL, fmt, ap);
|
|
|
va_end(ap);
|
|
|
|
|
|
return r;
|