summaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
authorPatrick Georgi <patrick@georgi-clan.de>2012-01-07 19:15:43 +0100
committerPatrick Georgi <patrick@georgi-clan.de>2012-03-17 12:07:39 +0100
commit06c04299c1420fa94a1a53cc36c9d91a5e31a22a (patch)
treecb3c316220a71680079cfc46f2d6a762d2425c50 /src/arch
parent7a39446ec236b9eeba7454790fc32fc4240d7e42 (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')
-rw-r--r--src/arch/x86/init/bootblock_normal.c18
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 */