Commit cdca8d89 authored by Daniel Thompson's avatar Daniel Thompson

kdb: Improve handling of characters from different input sources

Currently if an escape timer is interrupted by a character from a
different input source then the new character is discarded and the
function returns '\e' (which will be discarded by the level above).
It is hard to see why this would ever be the desired behaviour.
Fix this to return the new character rather than the '\e'.

This is a bigger refactor than might be expected because the new
character needs to go through escape sequence detection.
Signed-off-by: default avatarDaniel Thompson <daniel.thompson@linaro.org>
Reviewed-by: default avatarDouglas Anderson <dianders@chromium.org>
Link: https://lore.kernel.org/r/20191025073328.643-5-daniel.thompson@linaro.org
parent 4f27e824
...@@ -127,10 +127,10 @@ char kdb_getchar(void) ...@@ -127,10 +127,10 @@ char kdb_getchar(void)
{ {
#define ESCAPE_UDELAY 1000 #define ESCAPE_UDELAY 1000
#define ESCAPE_DELAY (2*1000000/ESCAPE_UDELAY) /* 2 seconds worth of udelays */ #define ESCAPE_DELAY (2*1000000/ESCAPE_UDELAY) /* 2 seconds worth of udelays */
char escape_data[5]; /* longest vt100 escape sequence is 4 bytes */ char buf[4]; /* longest vt100 escape sequence is 4 bytes */
char *ped = escape_data; char *pbuf = buf;
int escape_delay = 0; int escape_delay = 0;
get_char_func *f, *f_escape = NULL; get_char_func *f, *f_prev = NULL;
int key; int key;
for (f = &kdb_poll_funcs[0]; ; ++f) { for (f = &kdb_poll_funcs[0]; ; ++f) {
...@@ -150,26 +150,26 @@ char kdb_getchar(void) ...@@ -150,26 +150,26 @@ char kdb_getchar(void)
continue; continue;
} }
if (escape_delay == 0 && key == '\e') { /*
* When the first character is received (or we get a change
* input source) we set ourselves up to handle an escape
* sequences (just in case).
*/
if (f_prev != f) {
f_prev = f;
pbuf = buf;
escape_delay = ESCAPE_DELAY; escape_delay = ESCAPE_DELAY;
ped = escape_data;
f_escape = f;
} }
if (escape_delay) {
if (f_escape != f)
return '\e';
*ped++ = key; *pbuf++ = key;
key = kdb_handle_escape(escape_data, ped - escape_data); key = kdb_handle_escape(buf, pbuf - buf);
if (key < 0) if (key < 0) /* no escape sequence; return first character */
return '\e'; return buf[0];
if (key == 0) if (key > 0)
continue; return key;
} }
break; /* A key to process */ unreachable();
}
return key;
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment