[SeaBIOS] [PATCH 2/3] Sort IPLs according to their boot priority.

Gleb Natapov gleb at redhat.com
Sun Dec 26 16:33:24 CET 2010


Signed-off-by: Gleb Natapov <gleb at redhat.com>
---
 src/boot.c |   77 +++++++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 63 insertions(+), 14 deletions(-)

diff --git a/src/boot.c b/src/boot.c
index 8a9246e..f93c1b3 100644
--- a/src/boot.c
+++ b/src/boot.c
@@ -375,6 +375,41 @@ run_bcv(struct ipl_entry_s *ie)
     }
 }
 
+/* Bubble sort! Should be good enough for 8 elements */
+static void sort_ipls(struct ipl_entry_s *ipls, int iplscount)
+{
+    int stop;
+
+    if (iplscount == 0)
+        return;
+
+    do {
+        int i;
+        stop = 1;
+        for (i = 0; i < iplscount - 1; i++) {
+            if (ipls[i].prio > ipls[i+1].prio) {
+                struct ipl_entry_s tmp;
+                tmp = ipls[i];
+                ipls[i] = ipls[i+1];
+                ipls[i+1] = tmp;
+                stop = 0;
+            }
+        }
+    } while (!stop);
+}
+
+static void order_boot_devices(void)
+{
+    if (IPL.fw_bootorder_count == 0)
+        return;
+
+    sort_ipls(IPL.bcv, IPL.bcvcount);
+    /* Hard disk IPL inherits priority of the bootable bcv */
+    IPL.bev[1].prio = IPL.bcv[0].prio;
+    sort_ipls(IPL.bev, IPL.bevcount);
+    IPL.bootorder = 0x87654321;
+}
+
 // Prepare for boot - show menu and run bcvs.
 void
 boot_prep(void)
@@ -386,24 +421,38 @@ boot_prep(void)
 
     // XXX - show available drives?
 
+    order_boot_devices();
+
     // Allow user to modify BCV/IPL order.
     interactive_bootmenu();
     wait_threads();
 
-    // Setup floppy boot order
-    int override = IPL.bev[0].subchoice;
-    struct drive_s *tmp = Drives.idmap[EXTTYPE_FLOPPY][0];
-    Drives.idmap[EXTTYPE_FLOPPY][0] = Drives.idmap[EXTTYPE_FLOPPY][override];
-    Drives.idmap[EXTTYPE_FLOPPY][override] = tmp;
-
-    // Run BCVs
-    override = IPL.bev[1].subchoice;
-    if (override < IPL.bcvcount)
-        run_bcv(&IPL.bcv[override]);
-    int i;
-    for (i=0; i<IPL.bcvcount; i++)
-        if (i != override)
-            run_bcv(&IPL.bcv[i]);
+    int j;
+    for (j = 0; j < IPL.bevcount; j++) {
+        int override;
+        switch (IPL.bev[j].type) {
+        case IPL_TYPE_FLOPPY:
+	    // Setup floppy boot order
+            override = IPL.bev[j].subchoice;
+            struct drive_s *tmp = Drives.idmap[EXTTYPE_FLOPPY][0];
+            Drives.idmap[EXTTYPE_FLOPPY][0] =
+                 Drives.idmap[EXTTYPE_FLOPPY][override];
+            Drives.idmap[EXTTYPE_FLOPPY][override] = tmp;
+            break;
+        case IPL_TYPE_HARDDISK:
+            // Run BCVs
+            override = IPL.bev[j].subchoice;
+            if (override < IPL.bcvcount)
+                run_bcv(&IPL.bcv[override]);
+            int i;
+            for (i=0; i<IPL.bcvcount; i++)
+               if (i != override)
+                   run_bcv(&IPL.bcv[i]);
+	    break;
+        default:
+            break;
+        }
+    }
 }
 
 
-- 
1.7.2.3




More information about the SeaBIOS mailing list