/** @file
This file include board specific boot manager callbacks
Copyright (c) 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
#include
#include
BOOLEAN mHotKeypressed = FALSE;
EFI_EVENT HotKeyEvent = NULL;
UINTN mBootMenuOptionNumber;
/**
This function is called each second during the boot manager waits timeout.
@param TimeoutRemain The remaining timeout.
**/
VOID
EFIAPI
BoardBootManagerWaitCallback (
UINT16 TimeoutRemain
)
{
EFI_STATUS Status;
EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *TxtInEx;
EFI_KEY_DATA KeyData;
BOOLEAN PausePressed;
//
// Pause on PAUSE key
//
Status = gBS->HandleProtocol (gST->ConsoleInHandle, &gEfiSimpleTextInputExProtocolGuid, (VOID **) &TxtInEx);
ASSERT_EFI_ERROR (Status);
PausePressed = FALSE;
while (TRUE) {
Status = TxtInEx->ReadKeyStrokeEx (TxtInEx, &KeyData);
if (EFI_ERROR (Status)) {
break;
}
if (KeyData.Key.ScanCode == SCAN_PAUSE) {
PausePressed = TRUE;
break;
}
}
//
// Loop until non-PAUSE key pressed
//
while (PausePressed) {
Status = TxtInEx->ReadKeyStrokeEx (TxtInEx, &KeyData);
if (!EFI_ERROR (Status)) {
DEBUG ((
DEBUG_INFO, "[PauseCallback] %x/%x %x/%x\n",
KeyData.Key.ScanCode, KeyData.Key.UnicodeChar,
KeyData.KeyState.KeyShiftState, KeyData.KeyState.KeyToggleState
));
PausePressed = (BOOLEAN) (KeyData.Key.ScanCode == SCAN_PAUSE);
}
}
}
/**
The function is called when no boot option could be launched,
including platform recovery options and options pointing to applications
built into firmware volumes.
If this function returns, BDS attempts to enter an infinite loop.
**/
VOID
EFIAPI
BoardBootManagerUnableToBoot (
VOID
)
{
EFI_STATUS Status;
EFI_BOOT_MANAGER_LOAD_OPTION BootDeviceList;
CHAR16 OptionName[sizeof ("Boot####")];
if (mBootMenuOptionNumber == LoadOptionNumberUnassigned) {
return;
}
UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", mBootMenuOptionNumber);
Status = EfiBootManagerVariableToLoadOption (OptionName, &BootDeviceList);
if (EFI_ERROR (Status)) {
return;
}
for (;;) {
EfiBootManagerBoot (&BootDeviceList);
}
}