Arthur Heymans has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/36272 )
Change subject: Program loading: Handoff cbmem_top via calling arguments ......................................................................
Program loading: Handoff cbmem_top via calling arguments
There are a lot of different implementations to pass information from romstage to ramstage. These could all be unified by passing this information via cbmem. Often however these methods exist for that very purpose. This solves this by passing cbmem_top via the programs arguments.
Change-Id: Id2031f7bb81ce65fc318313c270eb1fbae3b2114 Signed-off-by: Arthur Heymans arthur@aheymans.xyz --- M src/arch/x86/postcar_loader.c M src/include/program_loading.h M src/lib/prog_loaders.c 3 files changed, 12 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/72/36272/1
diff --git a/src/arch/x86/postcar_loader.c b/src/arch/x86/postcar_loader.c index c6149ab..0a5d50c 100644 --- a/src/arch/x86/postcar_loader.c +++ b/src/arch/x86/postcar_loader.c @@ -225,5 +225,7 @@ /* As postcar exist, it's end of romstage here */ timestamp_add_now(TS_END_ROMSTAGE);
+ prog_set_arg(&prog, cbmem_top()); + prog_run(&prog); } diff --git a/src/include/program_loading.h b/src/include/program_loading.h index 6dec192..8257a1e 100644 --- a/src/include/program_loading.h +++ b/src/include/program_loading.h @@ -136,6 +136,11 @@ prog->arg = arg; }
+static inline void prog_set_arg(struct prog *prog, void *arg) +{ + prog->arg = arg; +} + /* Locate the identified program to run. Return 0 on success. < 0 on error. */ int prog_locate(struct prog *prog);
diff --git a/src/lib/prog_loaders.c b/src/lib/prog_loaders.c index 2ef6bdf..3d1c4e6 100644 --- a/src/lib/prog_loaders.c +++ b/src/lib/prog_loaders.c @@ -90,6 +90,8 @@ /* Load the cached ramstage to runtime location. */ stage_cache_load_stage(STAGE_RAMSTAGE, ramstage);
+ prog_set_arg(ramstage, cbmem_top()); + if (prog_entry(ramstage) != NULL) { printk(BIOS_DEBUG, "Jumping to image.\n"); prog_run(ramstage); @@ -142,6 +144,9 @@
timestamp_add_now(TS_END_COPYRAM);
+ /* This overrides the arg fetched from the relocatable module */ + prog_set_arg(&ramstage, cbmem_top()); + prog_run(&ramstage);
fail: