Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/stand/efiboot Some U-Boot implementations (notably U-Boo...



details:   https://anonhg.NetBSD.org/src/rev/4c567b7f6008
branches:  trunk
changeset: 835893:4c567b7f6008
user:      jmcneill <jmcneill%NetBSD.org@localhost>
date:      Sat Sep 15 16:44:15 2018 +0000

description:
Some U-Boot implementations (notably U-Boot) do not implement WaitForKey. Do the same as FreeBSD EFI loader here (I wrote the original patch there as well).

diffstat:

 sys/stand/efiboot/console.c |  34 +++++++++++++++++++++++++++-------
 1 files changed, 27 insertions(+), 7 deletions(-)

diffs (62 lines):

diff -r bf82ba0e7115 -r 4c567b7f6008 sys/stand/efiboot/console.c
--- a/sys/stand/efiboot/console.c       Sat Sep 15 16:41:57 2018 +0000
+++ b/sys/stand/efiboot/console.c       Sat Sep 15 16:44:15 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: console.c,v 1.1 2018/08/24 02:01:06 jmcneill Exp $ */
+/* $NetBSD: console.c,v 1.2 2018/09/15 16:44:15 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2018 Jared McNeill <jmcneill%invisible.ca@localhost>
@@ -28,16 +28,25 @@
 
 #include "efiboot.h"
 
+static EFI_INPUT_KEY key_cur;
+static int key_pending;
+
 int
 getchar(void)
 {
        EFI_STATUS status;
        EFI_INPUT_KEY key;
 
-       status = uefi_call_wrapper(ST->ConIn->ReadKeyStroke, 2, ST->ConIn, &key);
-       while (status == EFI_NOT_READY) {
-               WaitForSingleEvent(ST->ConIn->WaitForKey, 0);
+       if (key_pending) {
+               key = key_cur;
+               key_pending = 0;
+       } else {
                status = uefi_call_wrapper(ST->ConIn->ReadKeyStroke, 2, ST->ConIn, &key);
+               while (status == EFI_NOT_READY) {
+                       if (ST->ConIn->WaitForKey != NULL)
+                               WaitForSingleEvent(ST->ConIn->WaitForKey, 0);
+                       status = uefi_call_wrapper(ST->ConIn->ReadKeyStroke, 2, ST->ConIn, &key);
+               }
        }
 
        return key.UnicodeChar;
@@ -55,9 +64,20 @@
 int
 ischar(void)
 {
+       EFI_INPUT_KEY key;
        EFI_STATUS status;
 
-       status = uefi_call_wrapper(BS->CheckEvent, 1, ST->ConIn->WaitForKey);
-
-       return status == EFI_SUCCESS;
+       if (ST->ConIn->WaitForKey == NULL) {
+               if (key_pending)
+                       return 1;
+               status = uefi_call_wrapper(ST->ConIn->ReadKeyStroke, 2, ST->ConIn, &key);
+               if (status == EFI_SUCCESS) {
+                       key_cur = key;
+                       key_pending = 1;
+               }
+               return key_pending;
+       } else {
+               status = uefi_call_wrapper(BS->CheckEvent, 1, ST->ConIn->WaitForKey);
+               return status == EFI_SUCCESS;
+       }
 }



Home | Main Index | Thread Index | Old Index