Another indirection for normal/fallback bootblock
[coreboot.git] / src / arch / x86 / init / bootblock_normal.c
index f8ae13b9dddad253f0e2a79c79f8a99fe1f42d3d..19b3d5ad5fedce4a2fe1017c4181430b2ca2f4a0 100644 (file)
@@ -1,10 +1,16 @@
 #include <bootblock_common.h>
 #include <pc80/mc146818rtc.h>
 
+static const char *get_fallback(const char *stagelist) {
+       while (*stagelist) stagelist++;
+       return ++stagelist;
+}
+
 static void main(unsigned long bist)
 {
        unsigned long entry;
        int boot_mode;
+       const char *default_filenames = "normal/romstage\0fallback/romstage";
 
        if (boot_cpu()) {
                bootblock_northbridge_init();
@@ -24,15 +30,21 @@ static void main(unsigned long bist)
                boot_mode = last_boot_normal();
        }
 
+       char *filenames = (char *)walkcbfs("coreboot-stages");
+       if (!filenames) {
+               filenames = default_filenames;
+       }
+       char *normal_candidate = filenames;
+
        if (boot_mode)
-               entry = findstage("normal/romstage");
+               entry = findstage(normal_candidate);
        else
-               entry = findstage("fallback/romstage");
+               entry = findstage(get_fallback(normal_candidate));
 
        if (entry) call(entry, bist);
 
        /* run fallback if normal can't be found */
-       entry = findstage("fallback/romstage");
+       entry = findstage(get_fallback(normal_candidate));
        if (entry) call(entry, bist);
 
        /* duh. we're stuck */