efi_selftest: use WaitForKey to test text input
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Tue, 11 Sep 2018 20:38:06 +0000 (22:38 +0200)
committerAlexander Graf <agraf@suse.de>
Sun, 23 Sep 2018 19:55:30 +0000 (21:55 +0200)
We should test the WaitForKey event.
Testing for EFI_NOT_READY can be done after resetting the console.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Signed-off-by: Alexander Graf <agraf@suse.de>
lib/efi_selftest/efi_selftest_textinput.c

index 40b0a8b25cf06ae8a8fa351c607b47f6584b7243..164fbffe6c2462cfc0f991a81daee6f01e9f7b36 100644 (file)
@@ -40,15 +40,36 @@ static int execute(void)
 {
        struct efi_input_key input_key = {0};
        efi_status_t ret;
+       efi_uintn_t index;
+
+       /* Drain the console input */
+       ret = con_in->reset(con_in, true);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Reset failed\n");
+               return EFI_ST_FAILURE;
+       }
+       ret = con_in->read_key_stroke(con_in, &input_key);
+       if (ret != EFI_NOT_READY) {
+               efi_st_error("Empty buffer not reported\n");
+               return EFI_ST_FAILURE;
+       }
 
        efi_st_printf("Waiting for your input\n");
        efi_st_printf("To terminate type 'x'\n");
 
        for (;;) {
                /* Wait for next key */
-               do {
-                       ret = con_in->read_key_stroke(con_in, &input_key);
-               } while (ret == EFI_NOT_READY);
+               ret = boottime->wait_for_event(1, &con_in->wait_for_key,
+                                              &index);
+               if (ret != EFI_ST_SUCCESS) {
+                       efi_st_error("WaitForEvent failed\n");
+                       return EFI_ST_FAILURE;
+               }
+               ret = con_in->read_key_stroke(con_in, &input_key);
+               if (ret != EFI_SUCCESS) {
+                       efi_st_error("ReadKeyStroke failed\n");
+                       return EFI_ST_FAILURE;
+               }
 
                /* Allow 5 minutes until time out */
                boottime->set_watchdog_timer(300, 0, 0, NULL);