From 35890170b56941a155635d57b9ee693e5f690311 Mon Sep 17 00:00:00 2001 From: Daisuke Nojiri Date: Fri, 19 Sep 2014 09:56:15 -0700 Subject: 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 Original-Change-Id: I76530276ff9a87b44f98a33f2c34bd5b2de6888f Original-Reviewed-on: https://chromium-review.googlesource.com/219028 Original-Reviewed-by: Aaron Durbin Original-Commit-Queue: Daisuke Nojiri Original-Tested-by: Daisuke Nojiri (cherry picked from commit 0ad6f7fee9df31e1b35d4df9a8c373516416a235) Change-Id: I7abdbdda0cc549894dfb9d599a576bba0a4fadfc Signed-off-by: Aaron Durbin Reviewed-on: http://review.coreboot.org/8883 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi --- src/vendorcode/google/chromeos/chromeos.c | 31 ++++++++++--------------------- 1 file changed, 10 insertions(+), 21 deletions(-) (limited to 'src/vendorcode') diff --git a/src/vendorcode/google/chromeos/chromeos.c b/src/vendorcode/google/chromeos/chromeos.c index bd72e77e6c..5696aec787 100644 --- a/src/vendorcode/google/chromeos/chromeos.c +++ b/src/vendorcode/google/chromeos/chromeos.c @@ -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) -- cgit v1.2.3