summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/menu.c61
-rw-r--r--core/sboot.c12
2 files changed, 63 insertions, 10 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;
+}
diff --git a/core/sboot.c b/core/sboot.c
index 1649b7e..1a3d7d1 100644
--- a/core/sboot.c
+++ b/core/sboot.c
@@ -13,18 +13,9 @@ EFI_STATUS
EFIAPI
efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
- UINTN NrBootEntries;
- BOOT_PROTOCOL LastProtocol;
+ BOOT_ENTRY Entry;
InitializeLib(ImageHandle, SystemTable);
- NrBootEntries = NELEM(ConfigBootEntries);
-
- /* Ensure the list is terminated */
- LastProtocol = ConfigBootEntries[NrBootEntries - 1].Protocol;
- if (LastProtocol != PROTOCOL_END) {
- Print(L"fatal: boot entry list not terminated\n");
- Hcf();
- }
/* Disable the watchdog timer */
FwiSetWatchdogTimer(
@@ -40,5 +31,6 @@ efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
NELEM(ConfigBootEntries) - 1
);
+ SBootMenu(&Entry);
for (;;);
}