kdb: fix ctrl+e/a/f/b/d/p/n broken in keyboard mode
authorNir Lichtman <nir@lichtman.org>
Mon, 11 Nov 2024 21:56:22 +0000 (21:56 +0000)
committerDaniel Thompson <daniel.thompson@linaro.org>
Mon, 18 Nov 2024 15:20:22 +0000 (15:20 +0000)
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: Douglas Anderson <dianders@chromium.org>
Signed-off-by: Nir Lichtman <nir@lichtman.org>
Reviewed-by: Douglas Anderson <dianders@chromium.org>
Link: https://lore.kernel.org/r/20241111215622.GA161253@lichtman.org
Signed-off-by: Daniel Thompson <daniel.thompson@linaro.org>
kernel/debug/kdb/kdb_keyboard.c

index 3c2987f46f6e879bae58961424a740a1224d4710..3a74604fdb8a7fecd4f5eb0cf1ff70b2a5a217c3 100644 (file)
@@ -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;