summaryrefslogtreecommitdiff
path: root/core/menu.c
diff options
context:
space:
mode:
authorIan M. <ian@aptel.org>2026-09-11 05:00:24 +0000
committerIan M. <ian@aptel.org>2026-09-11 05:00:24 +0000
commitf8636711a0ce0431d7917dc6751b4762e6441b41 (patch)
tree060ba113ff656b14c83fd84bb210db6e93e8e6c8 /core/menu.c
parent09a38cfa889fda6bd63063b0516950d18e5e2110 (diff)
core: sboot: Add menu
Signed-off-by: Ian M. <ian@aptel.org>
Diffstat (limited to 'core/menu.c')
-rw-r--r--core/menu.c61
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;
+}