[SeaBIOS] [PATCH v2 6/6] boot: add F11 shortcut for network boot

Paolo Bonzini pbonzini at redhat.com
Wed Oct 17 18:23:48 CEST 2012


This patch adds a shortcut for network boot, similar to what is present
on bare-metal machines.  F11 will prioritize BCV/BEV entries for network
devices over all the other items of the boot list.

Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>
---
 src/boot.c | 36 +++++++++++++++++++++++++++++++-----
 1 file modificato, 31 inserzioni(+), 5 rimozioni(-)

diff --git a/src/boot.c b/src/boot.c
index c136ad4..682f239 100644
--- a/src/boot.c
+++ b/src/boot.c
@@ -292,6 +292,7 @@ static struct bootentry_s *BootList;
 #define IPL_TYPE_BEV         0x50
 #define IPL_TYPE_BCV         0x60
 #define IPL_TYPE_MASK        0xF0
+#define IPL_TYPE_CLASS       0x0F
 
 static void
 bootentry_add(int type, int prio, u32 data, const char *desc)
@@ -406,26 +407,51 @@ interactive_bootmenu(void)
     while (get_keystroke(0) >= 0)
         ;
 
-    printf("Press F12 for boot menu.\n\n");
+    wait_threads();
+    struct bootentry_s *pos;
+    for (pos = BootList; pos; pos = pos->next) {
+        if ((pos->type & IPL_TYPE_CLASS) == PCI_BASE_CLASS_NETWORK)
+            break;
+    }
+
+    printf("Press %sF12 for boot menu.\n\n"
+           , pos ? "F11 for network boot, or " : "");
 
     u32 menutime = romfile_loadint("etc/boot-menu-wait", DEFAULT_BOOTMENU_WAIT);
     enable_bootsplash();
     int scan_code = get_keystroke(menutime);
     disable_bootsplash();
     switch (scan_code) {
+    case 0x85: { // F11
+        // Prioritize BEV/BCV entries
+        if (!pos)
+            return;
+
+        struct bootentry_s **pprev = &BootList, **pprev_new = &BootList;
+        while ((pos = *pprev) != NULL) {
+            if ((pos->type & IPL_TYPE_CLASS) == PCI_BASE_CLASS_NETWORK) {
+                *pprev = pos->next;
+                pos->next = *pprev_new;
+                *pprev_new = pos;
+                pos->priority = 0;
+                pprev_new = &pos->next;
+            } else {
+                pprev = &pos->next;
+            }
+        }
+        break;
+    }
+
     case 0x86: { // F12
         printf("Select boot device:\n\n");
-        wait_threads();
 
         // Show menu items
-        struct bootentry_s *pos = BootList;
         int maxmenu = 0;
-        while (pos) {
+        for (pos = BootList; pos; pos = pos->next) {
             char desc[60];
             maxmenu++;
             printf("%d. %s\n", maxmenu
                    , strtcpy(desc, pos->description, ARRAY_SIZE(desc)));
-            pos = pos->next;
         }
 
         // Get key press
-- 
1.7.12.1




More information about the SeaBIOS mailing list