diff options
author | Kyösti Mälkki <kyosti.malkki@gmail.com> | 2017-09-05 22:43:05 +0300 |
---|---|---|
committer | Kyösti Mälkki <kyosti.malkki@gmail.com> | 2017-09-08 03:17:52 +0000 |
commit | d87e4b346943110a6d919aa52444bb420e2755be (patch) | |
tree | 504cf11ac99f37a8eaae4a885583ad08ffbc99d0 | |
parent | 534b23639bd1ee82e752f0a8593e46c1d03d8d2c (diff) | |
download | coreboot-d87e4b346943110a6d919aa52444bb420e2755be.tar.xz |
stage_cache: Add rmodule params in metadata
The change allows to update rmodule parameters after
it has been loaded from stage cache.
Change-Id: Ib825ffe245d447ad3a8246f7dbd52c6e34103a0c
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/21385
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
-rw-r--r-- | src/include/stage_cache.h | 1 | ||||
-rw-r--r-- | src/lib/cbmem_stage_cache.c | 4 | ||||
-rw-r--r-- | src/lib/rmodule.c | 3 |
3 files changed, 6 insertions, 2 deletions
diff --git a/src/include/stage_cache.h b/src/include/stage_cache.h index fbf9c46578..08312ff554 100644 --- a/src/include/stage_cache.h +++ b/src/include/stage_cache.h @@ -37,6 +37,7 @@ void stage_cache_external_region(void **base, size_t *size); struct stage_cache { uint64_t load_addr; uint64_t entry_addr; + uint64_t arg; }; #endif /* _STAGE_CACHE_H_ */ diff --git a/src/lib/cbmem_stage_cache.c b/src/lib/cbmem_stage_cache.c index 3fc99db726..2947972ac5 100644 --- a/src/lib/cbmem_stage_cache.c +++ b/src/lib/cbmem_stage_cache.c @@ -29,6 +29,7 @@ void stage_cache_add(int stage_id, const struct prog *stage) return; meta->load_addr = (uintptr_t)prog_start(stage); meta->entry_addr = (uintptr_t)prog_entry(stage); + meta->arg = (uintptr_t)prog_entry_arg(stage); c = cbmem_add(CBMEM_ID_STAGEx_CACHE + stage_id, prog_size(stage)); if (c == NULL) @@ -63,5 +64,6 @@ void stage_cache_load_stage(int stage_id, struct prog *stage) memcpy(load_addr, c, size); prog_set_area(stage, load_addr, size); - prog_set_entry(stage, (void *)(uintptr_t)meta->entry_addr, NULL); + prog_set_entry(stage, (void *)(uintptr_t)meta->entry_addr, + (void *)(uintptr_t)meta->arg); } diff --git a/src/lib/rmodule.c b/src/lib/rmodule.c index a3a74ac613..66d5120fee 100644 --- a/src/lib/rmodule.c +++ b/src/lib/rmodule.c @@ -294,10 +294,11 @@ int rmodule_stage_load(struct rmod_stage_load *rsl) prog_set_area(rsl->prog, rmod_stage.location, rmodule_memory_size(&rmod_stage)); - prog_set_entry(rsl->prog, rmodule_entry(&rmod_stage), NULL); /* Allow caller to pick up parameters, if available. */ rsl->params = rmodule_parameters(&rmod_stage); + prog_set_entry(rsl->prog, rmodule_entry(&rmod_stage), rsl->params); + return 0; } |