Patrick Georgi | 11f0079 | 2020-03-04 15:10:45 +0100 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
Kyösti Mälkki | b8d575c | 2019-12-16 16:00:49 +0200 | [diff] [blame] | 2 | |
| 3 | #include <cbfs.h> |
Kyösti Mälkki | a581166 | 2020-01-04 22:07:37 +0200 | [diff] [blame] | 4 | #include <fallback.h> |
Kyösti Mälkki | b8d575c | 2019-12-16 16:00:49 +0200 | [diff] [blame] | 5 | #include <program_loading.h> |
| 6 | #include <stddef.h> |
Kyösti Mälkki | b8d575c | 2019-12-16 16:00:49 +0200 | [diff] [blame] | 7 | |
| 8 | static const char *get_fallback(const char *stagelist) |
| 9 | { |
| 10 | while (*stagelist) |
| 11 | stagelist++; |
| 12 | return ++stagelist; |
| 13 | } |
| 14 | |
| 15 | int legacy_romstage_selector(struct prog *romstage) |
| 16 | { |
| 17 | static const char *default_filenames = "normal/romstage\0fallback/romstage"; |
| 18 | const char *boot_candidate; |
| 19 | size_t stages_len; |
| 20 | |
Julius Werner | 834b3ec | 2020-03-04 16:52:08 -0800 | [diff] [blame^] | 21 | boot_candidate = cbfs_map("coreboot-stages", &stages_len); |
Kyösti Mälkki | b8d575c | 2019-12-16 16:00:49 +0200 | [diff] [blame] | 22 | if (!boot_candidate) |
| 23 | boot_candidate = default_filenames; |
| 24 | |
| 25 | if (do_normal_boot()) { |
| 26 | romstage->name = boot_candidate; |
| 27 | if (!prog_locate(romstage)) |
| 28 | return 0; |
| 29 | } |
| 30 | |
| 31 | romstage->name = get_fallback(boot_candidate); |
| 32 | return prog_locate(romstage); |
| 33 | } |