vboot2: load decompressed stage directly to load address

this change allows vboot_load_stage to load a decompressed stage directly to the
load address without using the cbfs cache.

BUG=None
TEST=Booted Nyan Blaze.
BRANCH=None
Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org>

Original-Change-Id: I76530276ff9a87b44f98a33f2c34bd5b2de6888f
Original-Reviewed-on: https://chromium-review.googlesource.com/219028
Original-Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Original-Commit-Queue: Daisuke Nojiri <dnojiri@chromium.org>
Original-Tested-by: Daisuke Nojiri <dnojiri@chromium.org>
(cherry picked from commit 0ad6f7fee9df31e1b35d4df9a8c373516416a235)

Change-Id: I7abdbdda0cc549894dfb9d599a576bba0a4fadfc
Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: http://review.coreboot.org/8883
Tested-by: build bot (Jenkins)
Reviewed-by: Patrick Georgi <pgeorgi@google.com>
This commit is contained in:
Daisuke Nojiri
2014-09-19 09:56:15 -07:00
committed by Aaron Durbin
parent 1bbac3fd24
commit 35890170b5
3 changed files with 52 additions and 48 deletions

View File

@ -222,9 +222,10 @@ void *vboot_load_stage(int stage_index,
struct vboot_region *fw_main,
struct vboot_components *fw_info)
{
struct cbfs_stage *stage;
struct cbfs_media default_media, *media = &default_media;
uintptr_t fc_addr;
uint32_t fc_size;
void *entry;
if (stage_index >= fw_info->num_components) {
printk(BIOS_INFO, "invalid stage index\n");
@ -239,27 +240,15 @@ void *vboot_load_stage(int stage_index,
return NULL;
}
/* Loading to cbfs cache. This stage data must be retained until it's
* decompressed. */
stage = vboot_get_region(fc_addr, fc_size, NULL);
init_default_cbfs_media(media);
if (stage == NULL) {
printk(BIOS_INFO, "failed to load a stage\n");
return NULL;
}
/* Stages rely the below clearing so that the bss is initialized. */
memset((void *) (uintptr_t)stage->load, 0, stage->memlen);
if (cbfs_decompress(stage->compression,
(unsigned char *)stage + sizeof(*stage),
(void *) (uintptr_t) stage->load,
stage->len)) {
printk(BIOS_INFO, "failed to decompress a stage\n");
return NULL;
}
return (void *)(uintptr_t)stage->entry;
/* we're making cbfs access offset outside of the region managed by
* cbfs. this works because cbfs_load_stage_by_offset does not check
* the offset. */
entry = cbfs_load_stage_by_offset(media, fc_addr);
if (entry == (void *)-1)
entry = NULL;
return entry;
}
struct vb2_working_data * const vboot_get_working_data(void)