diff options
author | Patrick Georgi <patrick@georgi-clan.de> | 2012-01-07 19:15:43 +0100 |
---|---|---|
committer | Patrick Georgi <patrick@georgi-clan.de> | 2012-03-17 12:07:39 +0100 |
commit | 06c04299c1420fa94a1a53cc36c9d91a5e31a22a (patch) | |
tree | cb3c316220a71680079cfc46f2d6a762d2425c50 /src/arch/x86/init | |
parent | 7a39446ec236b9eeba7454790fc32fc4240d7e42 (diff) |
Another indirection for normal/fallback bootblock
Provide a way to redefine the names of normal and fallback via CBFS.
This way updates can use some more expressive naming scheme (numbers,
dates, version numbers) and replace the coreboot-stages file to
point to the new version (with the current version as new "old").
If coreboot-stages doesn't exist, the default behaviour remains to
use "normal" and "fallback".
Change-Id: I77c134d79ed95831ad5098b7663c15e95d3b5a2a
Signed-off-by: Patrick Georgi <patrick@georgi-clan.de>
Reviewed-on: http://review.coreboot.org/589
Tested-by: build bot (Jenkins)
Reviewed-by: Marc Jones <marcj303@gmail.com>
Diffstat (limited to 'src/arch/x86/init')
-rw-r--r-- | src/arch/x86/init/bootblock_normal.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/arch/x86/init/bootblock_normal.c b/src/arch/x86/init/bootblock_normal.c index f8ae13b9dd..19b3d5ad5f 100644 --- a/src/arch/x86/init/bootblock_normal.c +++ b/src/arch/x86/init/bootblock_normal.c @@ -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 */ |