arch/x86 postcar: Fix use with stage_cache
Postcar failed when loading from stage_cache, if romstage did not pass same pcf->stack on normal and resume paths. Change-Id: I853afb1fbdb942fd671d89950911c850c96e3af3 Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com> Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: https://review.coreboot.org/21444 Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
parent
d87e4b3469
commit
a7421fb9cb
|
@ -124,6 +124,17 @@ void *postcar_commit_mtrrs(struct postcar_frame *pcf)
|
||||||
return (void *) pcf->stack;
|
return (void *) pcf->stack;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void finalize_load(uintptr_t *stack_top_ptr, uintptr_t stack_top)
|
||||||
|
{
|
||||||
|
*stack_top_ptr = stack_top;
|
||||||
|
/*
|
||||||
|
* Signal to rest of system that another update was made to the
|
||||||
|
* postcar program prior to running it.
|
||||||
|
*/
|
||||||
|
prog_segment_loaded((uintptr_t)stack_top_ptr, sizeof(uintptr_t),
|
||||||
|
SEG_FINAL);
|
||||||
|
}
|
||||||
|
|
||||||
static void load_postcar_cbfs(struct prog *prog, struct postcar_frame *pcf)
|
static void load_postcar_cbfs(struct prog *prog, struct postcar_frame *pcf)
|
||||||
{
|
{
|
||||||
struct rmod_stage_load rsl = {
|
struct rmod_stage_load rsl = {
|
||||||
|
@ -140,14 +151,7 @@ static void load_postcar_cbfs(struct prog *prog, struct postcar_frame *pcf)
|
||||||
if (rsl.params == NULL)
|
if (rsl.params == NULL)
|
||||||
die("No parameters found in after CAR program.\n");
|
die("No parameters found in after CAR program.\n");
|
||||||
|
|
||||||
*(uintptr_t *)rsl.params = pcf->stack;
|
finalize_load(rsl.params, pcf->stack);
|
||||||
|
|
||||||
/*
|
|
||||||
* Signal to rest of system that another update was made to the
|
|
||||||
* postcar program prior to running it.
|
|
||||||
*/
|
|
||||||
prog_segment_loaded((uintptr_t)rsl.params, sizeof(uintptr_t),
|
|
||||||
SEG_FINAL);
|
|
||||||
|
|
||||||
if (!IS_ENABLED(CONFIG_NO_STAGE_CACHE))
|
if (!IS_ENABLED(CONFIG_NO_STAGE_CACHE))
|
||||||
stage_cache_add(STAGE_POSTCAR, prog);
|
stage_cache_add(STAGE_POSTCAR, prog);
|
||||||
|
@ -160,9 +164,11 @@ void run_postcar_phase(struct postcar_frame *pcf)
|
||||||
|
|
||||||
postcar_commit_mtrrs(pcf);
|
postcar_commit_mtrrs(pcf);
|
||||||
|
|
||||||
if (!IS_ENABLED(CONFIG_NO_STAGE_CACHE) && romstage_handoff_is_resume())
|
if (!IS_ENABLED(CONFIG_NO_STAGE_CACHE) &&
|
||||||
|
romstage_handoff_is_resume()) {
|
||||||
stage_cache_load_stage(STAGE_POSTCAR, &prog);
|
stage_cache_load_stage(STAGE_POSTCAR, &prog);
|
||||||
else
|
finalize_load(prog.arg, pcf->stack);
|
||||||
|
} else
|
||||||
load_postcar_cbfs(&prog, pcf);
|
load_postcar_cbfs(&prog, pcf);
|
||||||
|
|
||||||
prog_run(&prog);
|
prog_run(&prog);
|
||||||
|
|
Loading…
Reference in New Issue