diff options
author | Daniel Thompson <daniel.thompson@linaro.org> | 2014-09-11 05:37:10 -0400 |
---|---|---|
committer | Jason Wessel <jason.wessel@windriver.com> | 2015-02-19 13:39:03 -0500 |
commit | fb6daa7520f9d17a97e84a3d5a947819e0313f28 (patch) | |
tree | 3495ac88045d5a21c72a2a43517980afa47774ca /kernel | |
parent | ab08e464a2cd8242fdc6e4f87f3480808364a97a (diff) |
kdb: Provide forward search at more prompt
Currently kdb allows the output of comamnds to be filtered using the
| grep feature. This is useful but does not permit the output emitted
shortly after a string match to be examined without wading through the
entire unfiltered output of the command. Such a feature is particularly
useful to navigate function traces because these traces often have a
useful trigger string *before* the point of interest.
This patch reuses the existing filtering logic to introduce a simple
forward search to kdb that can be triggered from the more prompt.
Signed-off-by: Daniel Thompson <daniel.thompson@linaro.org>
Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/debug/kdb/kdb_io.c | 22 | ||||
-rw-r--r-- | kernel/debug/kdb/kdb_main.c | 7 | ||||
-rw-r--r-- | kernel/debug/kdb/kdb_private.h | 2 |
3 files changed, 26 insertions, 5 deletions
diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c index a550afb99ebe..ca13e6215537 100644 --- a/kernel/debug/kdb/kdb_io.c +++ b/kernel/debug/kdb/kdb_io.c | |||
@@ -680,6 +680,12 @@ int vkdb_printf(enum kdb_msgsrc src, const char *fmt, va_list ap) | |||
680 | size_avail = sizeof(kdb_buffer) - len; | 680 | size_avail = sizeof(kdb_buffer) - len; |
681 | goto kdb_print_out; | 681 | goto kdb_print_out; |
682 | } | 682 | } |
683 | if (kdb_grepping_flag >= KDB_GREPPING_FLAG_SEARCH) | ||
684 | /* | ||
685 | * This was a interactive search (using '/' at more | ||
686 | * prompt) and it has completed. Clear the flag. | ||
687 | */ | ||
688 | kdb_grepping_flag = 0; | ||
683 | /* | 689 | /* |
684 | * at this point the string is a full line and | 690 | * at this point the string is a full line and |
685 | * should be printed, up to the null. | 691 | * should be printed, up to the null. |
@@ -798,11 +804,23 @@ kdb_printit: | |||
798 | kdb_nextline = linecount - 1; | 804 | kdb_nextline = linecount - 1; |
799 | kdb_printf("\r"); | 805 | kdb_printf("\r"); |
800 | suspend_grep = 1; /* for this recursion */ | 806 | suspend_grep = 1; /* for this recursion */ |
807 | } else if (buf1[0] == '/' && !kdb_grepping_flag) { | ||
808 | kdb_printf("\r"); | ||
809 | kdb_getstr(kdb_grep_string, KDB_GREP_STRLEN, | ||
810 | kdbgetenv("SEARCHPROMPT") ?: "search> "); | ||
811 | *strchrnul(kdb_grep_string, '\n') = '\0'; | ||
812 | kdb_grepping_flag += KDB_GREPPING_FLAG_SEARCH; | ||
813 | suspend_grep = 1; /* for this recursion */ | ||
801 | } else if (buf1[0] && buf1[0] != '\n') { | 814 | } else if (buf1[0] && buf1[0] != '\n') { |
802 | /* user hit something other than enter */ | 815 | /* user hit something other than enter */ |
803 | suspend_grep = 1; /* for this recursion */ | 816 | suspend_grep = 1; /* for this recursion */ |
804 | kdb_printf("\nOnly 'q' or 'Q' are processed at more " | 817 | if (buf1[0] != '/') |
805 | "prompt, input ignored\n"); | 818 | kdb_printf( |
819 | "\nOnly 'q', 'Q' or '/' are processed at " | ||
820 | "more prompt, input ignored\n"); | ||
821 | else | ||
822 | kdb_printf("\n'/' cannot be used during | " | ||
823 | "grep filtering, input ignored\n"); | ||
806 | } else if (kdb_grepping_flag) { | 824 | } else if (kdb_grepping_flag) { |
807 | /* user hit enter */ | 825 | /* user hit enter */ |
808 | suspend_grep = 1; /* for this recursion */ | 826 | suspend_grep = 1; /* for this recursion */ |
diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c index 420418360b81..4121345498e0 100644 --- a/kernel/debug/kdb/kdb_main.c +++ b/kernel/debug/kdb/kdb_main.c | |||
@@ -50,8 +50,7 @@ | |||
50 | static int kdb_cmd_enabled = CONFIG_KDB_DEFAULT_ENABLE; | 50 | static int kdb_cmd_enabled = CONFIG_KDB_DEFAULT_ENABLE; |
51 | module_param_named(cmd_enable, kdb_cmd_enabled, int, 0600); | 51 | module_param_named(cmd_enable, kdb_cmd_enabled, int, 0600); |
52 | 52 | ||
53 | #define GREP_LEN 256 | 53 | char kdb_grep_string[KDB_GREP_STRLEN]; |
54 | char kdb_grep_string[GREP_LEN]; | ||
55 | int kdb_grepping_flag; | 54 | int kdb_grepping_flag; |
56 | EXPORT_SYMBOL(kdb_grepping_flag); | 55 | EXPORT_SYMBOL(kdb_grepping_flag); |
57 | int kdb_grep_leading; | 56 | int kdb_grep_leading; |
@@ -870,7 +869,7 @@ static void parse_grep(const char *str) | |||
870 | len = strlen(cp); | 869 | len = strlen(cp); |
871 | if (!len) | 870 | if (!len) |
872 | return; | 871 | return; |
873 | if (len >= GREP_LEN) { | 872 | if (len >= KDB_GREP_STRLEN) { |
874 | kdb_printf("search string too long\n"); | 873 | kdb_printf("search string too long\n"); |
875 | return; | 874 | return; |
876 | } | 875 | } |
@@ -1280,6 +1279,8 @@ static int kdb_local(kdb_reason_t reason, int error, struct pt_regs *regs, | |||
1280 | kdb_nextline = 1; | 1279 | kdb_nextline = 1; |
1281 | KDB_STATE_CLEAR(SUPPRESS); | 1280 | KDB_STATE_CLEAR(SUPPRESS); |
1282 | kdb_grepping_flag = 0; | 1281 | kdb_grepping_flag = 0; |
1282 | /* ensure the old search does not leak into '/' commands */ | ||
1283 | kdb_grep_string[0] = '\0'; | ||
1283 | 1284 | ||
1284 | cmdbuf = cmd_cur; | 1285 | cmdbuf = cmd_cur; |
1285 | *cmdbuf = '\0'; | 1286 | *cmdbuf = '\0'; |
diff --git a/kernel/debug/kdb/kdb_private.h b/kernel/debug/kdb/kdb_private.h index eaacd1693954..da93894db7ba 100644 --- a/kernel/debug/kdb/kdb_private.h +++ b/kernel/debug/kdb/kdb_private.h | |||
@@ -196,7 +196,9 @@ extern int kdb_main_loop(kdb_reason_t, kdb_reason_t, | |||
196 | 196 | ||
197 | /* Miscellaneous functions and data areas */ | 197 | /* Miscellaneous functions and data areas */ |
198 | extern int kdb_grepping_flag; | 198 | extern int kdb_grepping_flag; |
199 | #define KDB_GREPPING_FLAG_SEARCH 0x8000 | ||
199 | extern char kdb_grep_string[]; | 200 | extern char kdb_grep_string[]; |
201 | #define KDB_GREP_STRLEN 256 | ||
200 | extern int kdb_grep_leading; | 202 | extern int kdb_grep_leading; |
201 | extern int kdb_grep_trailing; | 203 | extern int kdb_grep_trailing; |
202 | extern char *kdb_cmds[]; | 204 | extern char *kdb_cmds[]; |