summaryrefslogtreecommitdiffstats
path: root/src/arch/x86/bootblock_normal.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/x86/bootblock_normal.c')
-rw-r--r--src/arch/x86/bootblock_normal.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/arch/x86/bootblock_normal.c b/src/arch/x86/bootblock_normal.c
new file mode 100644
index 0000000..bde2535
--- /dev/null
+++ b/src/arch/x86/bootblock_normal.c
@@ -0,0 +1,52 @@
+#include <smp/node.h>
+#include <bootblock_common.h>
+#include <pc80/mc146818rtc.h>
+#include <halt.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_mainboard_init();
+
+#if CONFIG_USE_OPTION_TABLE
+ sanitize_cmos();
+#endif
+ boot_mode = do_normal_boot();
+ } else {
+
+ /* Questionable single byte read from CMOS.
+ * Do not add any other CMOS access in the
+ * bootblock for AP CPUs.
+ */
+ 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_candidate);
+ else
+ entry = findstage(get_fallback(normal_candidate));
+
+ if (entry) call(entry, bist);
+
+ /* run fallback if normal can't be found */
+ entry = findstage(get_fallback(normal_candidate));
+ if (entry) call(entry, bist);
+
+ /* duh. we're stuck */
+ halt();
+}
OpenPOWER on IntegriCloud