summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/include/program_loading.h3
-rw-r--r--src/lib/loaders/load_and_run_payload.c17
-rw-r--r--src/lib/loaders/load_and_run_ramstage.c19
-rw-r--r--src/lib/loaders/load_and_run_romstage.c17
4 files changed, 54 insertions, 2 deletions
diff --git a/src/include/program_loading.h b/src/include/program_loading.h
index 02e6f5fdbb..ca80b0e793 100644
--- a/src/include/program_loading.h
+++ b/src/include/program_loading.h
@@ -103,6 +103,9 @@ void platform_prog_run(struct prog *prog);
struct prog_loader_ops {
const char *name;
+ /* Determine if the loader is the active one. If so returns 1 else 0
+ * or < 0 on error. */
+ int (*is_loader_active)(struct prog *prog);
/* Returns < 0 on error or 0 on success. This function needs to do
* different things depending on the prog type. See definition
* of struct prog above. */
diff --git a/src/lib/loaders/load_and_run_payload.c b/src/lib/loaders/load_and_run_payload.c
index 0e08d8829d..7a08097884 100644
--- a/src/lib/loaders/load_and_run_payload.c
+++ b/src/lib/loaders/load_and_run_payload.c
@@ -54,7 +54,24 @@ void payload_load(void)
struct prog *payload = &global_payload;
for (i = 0; i < ARRAY_SIZE(payload_ops); i++) {
+ /* Default loader state is active. */
+ int ret = 1;
+
ops = payload_ops[i];
+
+ if (ops->is_loader_active != NULL)
+ ret = ops->is_loader_active(payload);
+
+ if (ret == 0) {
+ printk(BIOS_DEBUG, "%s payload loader inactive.\n",
+ ops->name);
+ continue;
+ } else if (ret < 0) {
+ printk(BIOS_DEBUG, "%s payload loader failure.\n",
+ ops->name);
+ continue;
+ }
+
if (ops->prepare(payload) < 0) {
printk(BIOS_DEBUG, "%s: could not locate payload.\n",
ops->name);
diff --git a/src/lib/loaders/load_and_run_ramstage.c b/src/lib/loaders/load_and_run_ramstage.c
index 153e38e11e..fddea4d55e 100644
--- a/src/lib/loaders/load_and_run_ramstage.c
+++ b/src/lib/loaders/load_and_run_ramstage.c
@@ -83,8 +83,25 @@ void run_ramstage(void)
run_ramstage_from_resume(romstage_handoff_find_or_add(), &ramstage);
for (i = 0; i < ARRAY_SIZE(loaders); i++) {
+ /* Default loader state is active. */
+ int ret = 1;
+
ops = loaders[i];
- printk(BIOS_DEBUG, "Trying %s ramstage loader.\n", ops->name);
+
+ if (ops->is_loader_active != NULL)
+ ret = ops->is_loader_active(&ramstage);
+
+ if (ret == 0) {
+ printk(BIOS_DEBUG, "%s ramstage loader inactive.\n",
+ ops->name);
+ continue;
+ } else if (ret < 0) {
+ printk(BIOS_DEBUG, "%s ramstage loader failure.\n",
+ ops->name);
+ continue;
+ }
+
+ printk(BIOS_DEBUG, "%s ramstage loader active.\n", ops->name);
load_ramstage(ops, &ramstage);
}
diff --git a/src/lib/loaders/load_and_run_romstage.c b/src/lib/loaders/load_and_run_romstage.c
index 1c2ed77abf..b54bfc7e5c 100644
--- a/src/lib/loaders/load_and_run_romstage.c
+++ b/src/lib/loaders/load_and_run_romstage.c
@@ -41,11 +41,26 @@ void run_romstage(void)
};
for (i = 0; i < ARRAY_SIZE(loaders); i++) {
+ /* Default loader state is active. */
+ int ret = 1;
const struct prog_loader_ops *ops;
ops = loaders[i];
- printk(BIOS_DEBUG, "Trying %s romstage loader.\n", ops->name);
+ if (ops->is_loader_active != NULL)
+ ret = ops->is_loader_active(&romstage);
+
+ if (ret == 0) {
+ printk(BIOS_DEBUG, "%s romstage loader inactive.\n",
+ ops->name);
+ continue;
+ } else if (ret < 0) {
+ printk(BIOS_DEBUG, "%s romstage loader failure.\n",
+ ops->name);
+ continue;
+ }
+
+ printk(BIOS_DEBUG, "%s romstage loader active.\n", ops->name);
timestamp_add_now(TS_START_COPYROM);