program loading: add optional is_loader_active() callback
Add a way for a loader to indicate if it is active. Such users of this callback would be vboot which can indicate to the rest of the system that it isn't active. is_loader_active() also gives vboot a chance to perform the necessary work to make said decision. Change-Id: I6679ac75b19bb1bfff9c2b709da5591986f752ff Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: http://review.coreboot.org/10022 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi <pgeorgi@google.com>
This commit is contained in:
parent
16110e7ffa
commit
5e8286bed6
|
@ -103,6 +103,9 @@ void platform_prog_run(struct prog *prog);
|
||||||
|
|
||||||
struct prog_loader_ops {
|
struct prog_loader_ops {
|
||||||
const char *name;
|
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
|
/* Returns < 0 on error or 0 on success. This function needs to do
|
||||||
* different things depending on the prog type. See definition
|
* different things depending on the prog type. See definition
|
||||||
* of struct prog above. */
|
* of struct prog above. */
|
||||||
|
|
|
@ -54,7 +54,24 @@ void payload_load(void)
|
||||||
struct prog *payload = &global_payload;
|
struct prog *payload = &global_payload;
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(payload_ops); i++) {
|
for (i = 0; i < ARRAY_SIZE(payload_ops); i++) {
|
||||||
|
/* Default loader state is active. */
|
||||||
|
int ret = 1;
|
||||||
|
|
||||||
ops = payload_ops[i];
|
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) {
|
if (ops->prepare(payload) < 0) {
|
||||||
printk(BIOS_DEBUG, "%s: could not locate payload.\n",
|
printk(BIOS_DEBUG, "%s: could not locate payload.\n",
|
||||||
ops->name);
|
ops->name);
|
||||||
|
|
|
@ -83,8 +83,25 @@ void run_ramstage(void)
|
||||||
run_ramstage_from_resume(romstage_handoff_find_or_add(), &ramstage);
|
run_ramstage_from_resume(romstage_handoff_find_or_add(), &ramstage);
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(loaders); i++) {
|
for (i = 0; i < ARRAY_SIZE(loaders); i++) {
|
||||||
|
/* Default loader state is active. */
|
||||||
|
int ret = 1;
|
||||||
|
|
||||||
ops = loaders[i];
|
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);
|
load_ramstage(ops, &ramstage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,11 +41,26 @@ void run_romstage(void)
|
||||||
};
|
};
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(loaders); i++) {
|
for (i = 0; i < ARRAY_SIZE(loaders); i++) {
|
||||||
|
/* Default loader state is active. */
|
||||||
|
int ret = 1;
|
||||||
const struct prog_loader_ops *ops;
|
const struct prog_loader_ops *ops;
|
||||||
|
|
||||||
ops = loaders[i];
|
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);
|
timestamp_add_now(TS_START_COPYROM);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue