Commit 24b2455f authored by Nir Lichtman's avatar Nir Lichtman Committed by Daniel Thompson
Browse files

kdb: fix ctrl+e/a/f/b/d/p/n broken in keyboard mode



Problem: When using kdb via keyboard it does not react to control
characters which are supported in serial mode.

Example: Chords such as ctrl+a/e/d/p do not work in keyboard mode

Solution: Before disregarding non-printable key characters, check if they
are one of the supported control characters, I have took the control
characters from the switch case upwards in this function that translates
scan codes of arrow keys/backspace/home/.. to the control characters.

Suggested-by: default avatarDouglas Anderson <dianders@chromium.org>
Signed-off-by: default avatarNir Lichtman <nir@lichtman.org>
Reviewed-by: default avatarDouglas Anderson <dianders@chromium.org>
Link: https://lore.kernel.org/r/20241111215622.GA161253@lichtman.org


Signed-off-by: default avatarDaniel Thompson <daniel.thompson@linaro.org>
parent 9c98750e
Loading
Loading
Loading
Loading
+24 −9
Original line number Diff line number Diff line
@@ -25,6 +25,8 @@
#define KBD_STAT_OBF 		0x01	/* Keyboard output buffer full */
#define KBD_STAT_MOUSE_OBF	0x20	/* Mouse output buffer full */

#define CTRL(c) ((c) - 64)

static int kbd_exists;
static int kbd_last_ret;

@@ -123,24 +125,24 @@ int kdb_get_kbd_char(void)
		return 8;
	}

	/* Special Key */
	/* Translate special keys to equivalent CTRL control characters */
	switch (scancode) {
	case 0xF: /* Tab */
		return 9;
		return CTRL('I');
	case 0x53: /* Del */
		return 4;
		return CTRL('D');
	case 0x47: /* Home */
		return 1;
		return CTRL('A');
	case 0x4F: /* End */
		return 5;
		return CTRL('E');
	case 0x4B: /* Left */
		return 2;
		return CTRL('B');
	case 0x48: /* Up */
		return 16;
		return CTRL('P');
	case 0x50: /* Down */
		return 14;
		return CTRL('N');
	case 0x4D: /* Right */
		return 6;
		return CTRL('F');
	}

	if (scancode == 0xe0)
@@ -172,6 +174,19 @@ int kdb_get_kbd_char(void)
	switch (KTYP(keychar)) {
	case KT_LETTER:
	case KT_LATIN:
		switch (keychar) {
		/* non-printable supported control characters */
		case CTRL('A'): /* Home */
		case CTRL('B'): /* Left */
		case CTRL('D'): /* Del */
		case CTRL('E'): /* End */
		case CTRL('F'): /* Right */
		case CTRL('I'): /* Tab */
		case CTRL('N'): /* Down */
		case CTRL('P'): /* Up */
			return keychar;
		}

		if (isprint(keychar))
			break;		/* printable characters */
		fallthrough;