diff options
-rw-r--r-- | src/arch/x86/Kconfig | 3 | ||||
-rw-r--r-- | src/arch/x86/Makefile.inc | 2 | ||||
-rw-r--r-- | src/arch/x86/bootblock_normal.c | 45 | ||||
-rw-r--r-- | src/include/program_loading.h | 3 | ||||
-rw-r--r-- | src/lib/prog_loaders.c | 9 |
5 files changed, 57 insertions, 5 deletions
diff --git a/src/arch/x86/Kconfig b/src/arch/x86/Kconfig index f4c0dc9e82..212c9f9acc 100644 --- a/src/arch/x86/Kconfig +++ b/src/arch/x86/Kconfig @@ -232,11 +232,10 @@ config ROMSTAGE_DEBUG_SPINLOOP Add a spin (JMP .) in assembly_entry.S during early romstage to wait for a JTAG debugger to break into the execution sequence. -# Selecting a cbfs prefix from the bootblock is only implemented with romcc choice prompt "Bootblock behaviour" default BOOTBLOCK_SIMPLE - depends on ROMCC_BOOTBLOCK + depends on !VBOOT config BOOTBLOCK_SIMPLE bool "Always load fallback" diff --git a/src/arch/x86/Makefile.inc b/src/arch/x86/Makefile.inc index 3b13efc46e..7e150ff06d 100644 --- a/src/arch/x86/Makefile.inc +++ b/src/arch/x86/Makefile.inc @@ -112,7 +112,7 @@ bootblock-$(CONFIG_IDT_IN_EVERY_STAGE) += exception.c bootblock-$(CONFIG_IDT_IN_EVERY_STAGE) += idt.S bootblock-$(CONFIG_COLLECT_TIMESTAMPS_TSC) += timestamp.c bootblock-$(CONFIG_X86_TOP4G_BOOTMEDIA_MAP) += mmap_boot.c - +bootblock-$(CONFIG_BOOTBLOCK_NORMAL) += bootblock_normal.c bootblock-y += id.S $(call src-to-obj,bootblock,$(dir)/id.S): $(obj)/build.h diff --git a/src/arch/x86/bootblock_normal.c b/src/arch/x86/bootblock_normal.c new file mode 100644 index 0000000000..8001ed0641 --- /dev/null +++ b/src/arch/x86/bootblock_normal.c @@ -0,0 +1,45 @@ +/* + * This file is part of the coreboot project. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <cbfs.h> +#include <pc80/mc146818rtc.h> +#include <program_loading.h> +#include <stddef.h> +#include <string.h> + +static const char *get_fallback(const char *stagelist) +{ + while (*stagelist) + stagelist++; + return ++stagelist; +} + +int legacy_romstage_selector(struct prog *romstage) +{ + static const char *default_filenames = "normal/romstage\0fallback/romstage"; + const char *boot_candidate; + size_t stages_len; + + boot_candidate = cbfs_boot_map_with_leak("coreboot-stages", CBFS_TYPE_RAW, &stages_len); + if (!boot_candidate) + boot_candidate = default_filenames; + + if (do_normal_boot()) { + romstage->name = boot_candidate; + if (!prog_locate(romstage)) + return 0; + } + + romstage->name = get_fallback(boot_candidate); + return prog_locate(romstage); +} diff --git a/src/include/program_loading.h b/src/include/program_loading.h index 1b71fadb1b..320ff3cc1e 100644 --- a/src/include/program_loading.h +++ b/src/include/program_loading.h @@ -179,6 +179,9 @@ struct prog_loader_ops { /* Run romstage from bootblock. */ void run_romstage(void); +/* Runtime selector for CBFS_PREFIX of romstage. */ +int legacy_romstage_selector(struct prog *romstage); + /************************ * RAMSTAGE LOADING * ************************/ diff --git a/src/lib/prog_loaders.c b/src/lib/prog_loaders.c index 978ec16e6a..0319325841 100644 --- a/src/lib/prog_loaders.c +++ b/src/lib/prog_loaders.c @@ -60,8 +60,13 @@ void run_romstage(void) vboot_run_logic(); - if (prog_locate(&romstage)) - goto fail; + if (CONFIG(ARCH_X86) && CONFIG(BOOTBLOCK_NORMAL)) { + if (legacy_romstage_selector(&romstage)) + goto fail; + } else { + if (prog_locate(&romstage)) + goto fail; + } timestamp_add_now(TS_START_COPYROM); |