2020-03-04 15:10:45 +01:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
2019-12-16 15:00:49 +01:00
|
|
|
|
|
|
|
#include <cbfs.h>
|
2020-01-04 21:07:37 +01:00
|
|
|
#include <fallback.h>
|
2019-12-16 15:00:49 +01:00
|
|
|
#include <program_loading.h>
|
|
|
|
#include <stddef.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);
|
|
|
|
}
|