efi_loader: correct CTRL-A - CTRL-Z console input
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Sat, 6 Apr 2019 18:59:24 +0000 (20:59 +0200)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Sun, 7 Apr 2019 13:11:33 +0000 (15:11 +0200)
In the extended text input protocol CTRL-A - CTRL-Z have to be signaled as
Unicode characters a-z or A-Z depending on the shift state and not as 0x01
to 0x1a.

Update Python unit test.

This patch is required for using the EFI shell `edit` command.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
lib/efi_loader/efi_console.c
test/py/tests/test_efi_selftest.py

index 8e0965bfc8941465580900826f8e8bc8aeac137c..051fc1d339f7b929f3a34111c0a9ddd47c34c08e 100644 (file)
@@ -797,9 +797,26 @@ static efi_status_t EFIAPI efi_cin_read_key_stroke_ex(
                ret = EFI_NOT_READY;
                goto out;
        }
+       /*
+        * CTRL+A - CTRL+Z have to be signaled as a - z.
+        * SHIFT+CTRL+A - SHIFT+CTRL+Z have to be signaled as A - Z.
+        */
+       switch (next_key.key.unicode_char) {
+       case 0x01 ... 0x07:
+       case 0x0b ... 0x0c:
+       case 0x0e ... 0x1a:
+               if (!(next_key.key_state.key_toggle_state &
+                     EFI_CAPS_LOCK_ACTIVE) ^
+                   !(next_key.key_state.key_shift_state &
+                     (EFI_LEFT_SHIFT_PRESSED | EFI_RIGHT_SHIFT_PRESSED)))
+                       next_key.key.unicode_char += 0x40;
+               else
+                       next_key.key.unicode_char += 0x60;
+       }
        *key_data = next_key;
        key_available = false;
        efi_con_in.wait_for_key->is_signaled = false;
+
 out:
        return EFI_EXIT(ret);
 }
index 36b35ee536b1607dfe97a3c432ee763e6d2d8cea..bc226a8e6376a07c4c35850ea1ee78e6511cd1db 100644 (file)
@@ -141,7 +141,7 @@ def test_efi_selftest_text_input_ex(u_boot_console):
        u_boot_console.run_command(cmd=chr(4), wait_for_echo=False,
                                   send_nl=False, wait_for_prompt=False)
        m = u_boot_console.p.expect(
-               ['Unicode char 4 \(unknown\), scan code 0 \(CTRL\+Null\)'])
+               ['Unicode char 100 \\(\'d\'\\), scan code 0 \\(CTRL\\+Null\\)'])
        if m != 0:
                raise Exception('EOT failed in \'text input\' test')
        u_boot_console.drain_console()