diff options
Diffstat (limited to 'core/menu.c')
| -rw-r--r-- | core/menu.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/core/menu.c b/core/menu.c new file mode 100644 index 0000000..955b750 --- /dev/null +++ b/core/menu.c @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2026, Apollo Telephone Laboratories. + * Provided under the BSD-3 clause. + */ + +#include <sboot/sboot.h> +#include <sboot/fwi.h> +#include <sboot/config.h> + +#define MENU_CLEAR() \ + Print(L"\r\t\t\t\t\t\t\r") +#define MENU_WRITE(ENTRY) \ + Print(L"<-- %s -->", (ENTRY)->Name); + +VOID +SBootMenu(OUT BOOT_ENTRY *Entry) +{ + EFI_INPUT_KEY Key; + UINTN CurrentEntryIndex; + BOOT_ENTRY *CurrentEntry; + EFI_STATUS Status; + BOOLEAN Run = TRUE; + + Print(L" ===== USE LEFT/RIGHT ARROW KEYS TO SELECT ====\n\n"); + CurrentEntryIndex = 0; + CurrentEntry = &ConfigBootEntries[CurrentEntryIndex]; + MENU_WRITE(CurrentEntry); + + while (Run) { + Status = uefi_call_wrapper(gST->ConIn->ReadKeyStroke, 2, gST->ConIn, &Key); + if (EFI_ERROR(Status)) { + continue; + } + + switch (Key.ScanCode) { + case 0x0: + Run = FALSE; + continue; + case SCAN_RIGHT: + if (CurrentEntryIndex < NELEM(ConfigBootEntries) - 2) { + ++CurrentEntryIndex; + CurrentEntry = &ConfigBootEntries[CurrentEntryIndex]; + MENU_CLEAR(); + MENU_WRITE(CurrentEntry); + } + break; + case SCAN_LEFT: + if (CurrentEntryIndex == 0) + continue; + + --CurrentEntryIndex; + CurrentEntry = &ConfigBootEntries[CurrentEntryIndex]; + MENU_CLEAR(); + MENU_WRITE(CurrentEntry); + break; + } + } + + Print(L"\nBooting %s (%s)\n", CurrentEntry->Name, CurrentEntry->BootPath); + *Entry = *CurrentEntry; +} |
