loader.efi: use and prefer coninex interface
Add support for EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL.
This commit is contained in:
parent
591d5f0ef5
commit
05b24e8617
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=351696
@ -32,8 +32,10 @@ __FBSDID("$FreeBSD$");
|
|||||||
|
|
||||||
#include "bootstrap.h"
|
#include "bootstrap.h"
|
||||||
|
|
||||||
|
static EFI_GUID simple_input_ex_guid = EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL_GUID;
|
||||||
static SIMPLE_TEXT_OUTPUT_INTERFACE *conout;
|
static SIMPLE_TEXT_OUTPUT_INTERFACE *conout;
|
||||||
static SIMPLE_INPUT_INTERFACE *conin;
|
static SIMPLE_INPUT_INTERFACE *conin;
|
||||||
|
static EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *coninex;
|
||||||
|
|
||||||
#ifdef TERM_EMU
|
#ifdef TERM_EMU
|
||||||
#define DEFAULT_FGCOLOR EFI_LIGHTGRAY
|
#define DEFAULT_FGCOLOR EFI_LIGHTGRAY
|
||||||
@ -115,6 +117,8 @@ efi_cons_probe(struct console *cp)
|
|||||||
static int
|
static int
|
||||||
efi_cons_init(int arg)
|
efi_cons_init(int arg)
|
||||||
{
|
{
|
||||||
|
EFI_STATUS status;
|
||||||
|
|
||||||
#ifdef TERM_EMU
|
#ifdef TERM_EMU
|
||||||
conout->SetAttribute(conout, EFI_TEXT_ATTR(DEFAULT_FGCOLOR,
|
conout->SetAttribute(conout, EFI_TEXT_ATTR(DEFAULT_FGCOLOR,
|
||||||
DEFAULT_BGCOLOR));
|
DEFAULT_BGCOLOR));
|
||||||
@ -125,7 +129,11 @@ efi_cons_init(int arg)
|
|||||||
bg_c = DEFAULT_BGCOLOR;
|
bg_c = DEFAULT_BGCOLOR;
|
||||||
#endif
|
#endif
|
||||||
conout->EnableCursor(conout, TRUE);
|
conout->EnableCursor(conout, TRUE);
|
||||||
return 0;
|
status = BS->OpenProtocol(ST->ConsoleInHandle, &simple_input_ex_guid,
|
||||||
|
(void **)&coninex, IH, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);
|
||||||
|
if (status != EFI_SUCCESS)
|
||||||
|
coninex = NULL;
|
||||||
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -524,6 +532,40 @@ efi_readkey(void)
|
|||||||
return (false);
|
return (false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
efi_readkey_ex(void)
|
||||||
|
{
|
||||||
|
EFI_STATUS status;
|
||||||
|
EFI_INPUT_KEY *kp;
|
||||||
|
EFI_KEY_DATA key_data;
|
||||||
|
uint32_t kss;
|
||||||
|
|
||||||
|
status = coninex->ReadKeyStrokeEx(coninex, &key_data);
|
||||||
|
if (status == EFI_SUCCESS) {
|
||||||
|
kss = key_data.KeyState.KeyShiftState;
|
||||||
|
kp = &key_data.Key;
|
||||||
|
if (kss & EFI_SHIFT_STATE_VALID) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* quick mapping to control chars, replace with
|
||||||
|
* map lookup later.
|
||||||
|
*/
|
||||||
|
if (kss & EFI_RIGHT_CONTROL_PRESSED ||
|
||||||
|
kss & EFI_LEFT_CONTROL_PRESSED) {
|
||||||
|
if (kp->UnicodeChar >= 'a' &&
|
||||||
|
kp->UnicodeChar <= 'z') {
|
||||||
|
kp->UnicodeChar -= 'a';
|
||||||
|
kp->UnicodeChar++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
keybuf_inschar(kp);
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
return (false);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
efi_cons_getchar(void)
|
efi_cons_getchar(void)
|
||||||
{
|
{
|
||||||
@ -534,8 +576,13 @@ efi_cons_getchar(void)
|
|||||||
|
|
||||||
key_pending = 0;
|
key_pending = 0;
|
||||||
|
|
||||||
if (efi_readkey())
|
if (coninex == NULL) {
|
||||||
return (keybuf_getchar());
|
if (efi_readkey())
|
||||||
|
return (keybuf_getchar());
|
||||||
|
} else {
|
||||||
|
if (efi_readkey_ex())
|
||||||
|
return (keybuf_getchar());
|
||||||
|
}
|
||||||
|
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
@ -543,6 +590,7 @@ efi_cons_getchar(void)
|
|||||||
int
|
int
|
||||||
efi_cons_poll(void)
|
efi_cons_poll(void)
|
||||||
{
|
{
|
||||||
|
EFI_STATUS status;
|
||||||
|
|
||||||
if (keybuf_ischar() || key_pending)
|
if (keybuf_ischar() || key_pending)
|
||||||
return (1);
|
return (1);
|
||||||
@ -552,10 +600,21 @@ efi_cons_poll(void)
|
|||||||
* WaitForKey().
|
* WaitForKey().
|
||||||
* CheckEvent() can clear the signaled state.
|
* CheckEvent() can clear the signaled state.
|
||||||
*/
|
*/
|
||||||
if (conin->WaitForKey == NULL)
|
if (coninex != NULL) {
|
||||||
key_pending = efi_readkey();
|
if (coninex->WaitForKeyEx == NULL) {
|
||||||
else
|
key_pending = efi_readkey_ex();
|
||||||
key_pending = BS->CheckEvent(conin->WaitForKey) == EFI_SUCCESS;
|
} else {
|
||||||
|
status = BS->CheckEvent(coninex->WaitForKeyEx);
|
||||||
|
key_pending = status == EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (conin->WaitForKey == NULL) {
|
||||||
|
key_pending = efi_readkey();
|
||||||
|
} else {
|
||||||
|
status = BS->CheckEvent(conin->WaitForKey);
|
||||||
|
key_pending = status == EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return (key_pending);
|
return (key_pending);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user