/* * Copyright (c) 2026, Apollo Telephone Laboratories. * Provided under the BSD-3 clause. */ #include #include #include #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; }