Gabe Black (gabeblack@chromium.org) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/3578
-gerrit
commit 9b132425e00fb8faed259365334bdf7527dfd828 Author: Gabe Black gabeblack@chromium.org Date: Mon Jul 1 04:57:37 2013 -0700
CBFS: Change the signature of cbfs_decompress.
Instead of returning 0 on success and -1 on error, return the decompressed size of the data on success and 0 on error. The decompressed size is useful information to have that was being thrown away in that function.
Change-Id: If787201aa61456b1e47feaf3a0071c753fa299a3 Signed-off-by: Gabe Black gabeblack@chromium.org --- payloads/libpayload/include/cbfs_core.h | 2 +- payloads/libpayload/libcbfs/cbfs.c | 4 ++-- payloads/libpayload/libcbfs/cbfs_core.c | 9 +++------ src/include/cbfs_core.h | 2 +- src/lib/cbfs.c | 18 ++++++++++-------- src/lib/cbfs_core.c | 9 +++------ src/vendorcode/google/chromeos/vboot_loader.c | 8 ++++---- 7 files changed, 24 insertions(+), 28 deletions(-)
diff --git a/payloads/libpayload/include/cbfs_core.h b/payloads/libpayload/include/cbfs_core.h index 2dc1992..8be7212 100644 --- a/payloads/libpayload/include/cbfs_core.h +++ b/payloads/libpayload/include/cbfs_core.h @@ -217,7 +217,7 @@ struct cbfs_file *cbfs_get_file(struct cbfs_media *media, const char *name); void *cbfs_get_file_content(struct cbfs_media *media, const char *name, int type);
-/* returns 0 on success, -1 on failure */ +/* returns decompressed size on success, 0 on failure */ int cbfs_decompress(int algo, void *src, void *dst, int len);
/* returns a pointer to CBFS master header, or CBFS_HEADER_INVALID_ADDRESS diff --git a/payloads/libpayload/libcbfs/cbfs.c b/payloads/libpayload/libcbfs/cbfs.c index 2fb91bf..6243473 100644 --- a/payloads/libpayload/libcbfs/cbfs.c +++ b/payloads/libpayload/libcbfs/cbfs.c @@ -120,7 +120,7 @@ void *cbfs_load_optionrom(struct cbfs_media *media, uint16_t vendor, if (! dest) return src;
- if (cbfs_decompress(ntohl(orom->compression), + if (!cbfs_decompress(ntohl(orom->compression), src, dest, ntohl(orom->len))) @@ -146,7 +146,7 @@ void * cbfs_load_stage(struct cbfs_media *media, const char *name) stage->entry); memset((void *) (uint32_t) stage->load, 0, stage->memlen);
- if (cbfs_decompress(stage->compression, + if (!cbfs_decompress(stage->compression, ((unsigned char *) stage) + sizeof(struct cbfs_stage), (void *) (uint32_t) stage->load, diff --git a/payloads/libpayload/libcbfs/cbfs_core.c b/payloads/libpayload/libcbfs/cbfs_core.c index 48a4b3a..1945813 100644 --- a/payloads/libpayload/libcbfs/cbfs_core.c +++ b/payloads/libpayload/libcbfs/cbfs_core.c @@ -196,19 +196,16 @@ int cbfs_decompress(int algo, void *src, void *dst, int len) switch (algo) { case CBFS_COMPRESS_NONE: memcpy(dst, src, len); - return 0; + return len; #ifdef CBFS_CORE_WITH_LZMA case CBFS_COMPRESS_LZMA: - if (ulzma(src, dst) != 0) { - return 0; - } - return -1; + return ulzma(src, dst); #endif default: ERROR("tried to decompress %d bytes with algorithm #%x," "but that algorithm id is unsupported.\n", len, algo); - return -1; + return 0; } }
diff --git a/src/include/cbfs_core.h b/src/include/cbfs_core.h index 20636e2..b938427 100644 --- a/src/include/cbfs_core.h +++ b/src/include/cbfs_core.h @@ -218,7 +218,7 @@ struct cbfs_file *cbfs_get_file(struct cbfs_media *media, const char *name); void *cbfs_get_file_content(struct cbfs_media *media, const char *name, int type);
-/* returns 0 on success, -1 on failure */ +/* returns decompressed size on success, 0 on failure */ int cbfs_decompress(int algo, void *src, void *dst, int len);
/* returns a pointer to CBFS master header, or CBFS_HEADER_INVALID_ADDRESS diff --git a/src/lib/cbfs.c b/src/lib/cbfs.c index aba1bcc..400b8a5 100644 --- a/src/lib/cbfs.c +++ b/src/lib/cbfs.c @@ -112,7 +112,7 @@ void *cbfs_load_optionrom(struct cbfs_media *media, uint16_t vendor, if (! dest) return src;
- if (cbfs_decompress(ntohl(orom->compression), + if (!cbfs_decompress(ntohl(orom->compression), src, dest, ntohl(orom->len))) @@ -204,8 +204,8 @@ static void *load_stage_from_cbfs(struct cbfs_media *media, const char *name, LOG("Decompressing stage %s @ 0x%p (%d bytes)\n", name, &ramstage_region[rmodule_offset], stage->memlen);
- if (cbfs_decompress(stage->compression, &stage[1], - &ramstage_region[rmodule_offset], stage->len)) + if (!cbfs_decompress(stage->compression, &stage[1], + &ramstage_region[rmodule_offset], stage->len)) return (void *) -1;
if (rmodule_parse(&ramstage_region[rmodule_offset], &ramstage)) @@ -259,6 +259,7 @@ void * cbfs_load_stage(struct cbfs_media *media, const char *name) /* this is a mess. There is no ntohll. */ /* for now, assume compatible byte order until we solve this. */ uint32_t entry; + uint32_t final_size;
if (stage == NULL) return (void *) -1; @@ -270,11 +271,12 @@ void * cbfs_load_stage(struct cbfs_media *media, const char *name) /* Stages rely the below clearing so that the bss is initialized. */ memset((void *) (uint32_t) stage->load, 0, stage->memlen);
- if (cbfs_decompress(stage->compression, - ((unsigned char *) stage) + - sizeof(struct cbfs_stage), - (void *) (uint32_t) stage->load, - stage->len)) + final_size = cbfs_decompress(stage->compression, + ((unsigned char *) stage) + + sizeof(struct cbfs_stage), + (void *) (uint32_t) stage->load, + stage->len); + if (!final_size) return (void *) -1;
DEBUG("stage loaded.\n"); diff --git a/src/lib/cbfs_core.c b/src/lib/cbfs_core.c index 39c1ff6..612fef2 100644 --- a/src/lib/cbfs_core.c +++ b/src/lib/cbfs_core.c @@ -196,19 +196,16 @@ int cbfs_decompress(int algo, void *src, void *dst, int len) switch (algo) { case CBFS_COMPRESS_NONE: memmove(dst, src, len); - return 0; + return len; #ifdef CBFS_CORE_WITH_LZMA case CBFS_COMPRESS_LZMA: - if (ulzma(src, dst) != 0) { - return 0; - } - return -1; + return ulzma(src, dst); #endif default: ERROR("tried to decompress %d bytes with algorithm #%x," "but that algorithm id is unsupported.\n", len, algo); - return -1; + return 0; } }
diff --git a/src/vendorcode/google/chromeos/vboot_loader.c b/src/vendorcode/google/chromeos/vboot_loader.c index 10fa52d..b627af6 100644 --- a/src/vendorcode/google/chromeos/vboot_loader.c +++ b/src/vendorcode/google/chromeos/vboot_loader.c @@ -66,8 +66,8 @@ static void vboot_run_stub(struct vboot_context *context)
vboot_region = cbmem_entry_start(vboot_entry);
- if (cbfs_decompress(stage->compression, &stage[1], - &vboot_region[rmodule_offset], stage->len)) { + if (!cbfs_decompress(stage->compression, &stage[1], + &vboot_region[rmodule_offset], stage->len)) { printk(BIOS_DEBUG, "Couldn't decompress vboot stub.\n"); goto out; } @@ -221,8 +221,8 @@ static void vboot_load_ramstage(struct vboot_handoff *vboot_handoff, printk(BIOS_DEBUG, "Decompressing ramstage @ 0x%p (%d bytes)\n", &ramstage_region[rmodule_offset], stage->memlen);
- if (cbfs_decompress(stage->compression, &stage[1], - &ramstage_region[rmodule_offset], stage->len)) + if (!cbfs_decompress(stage->compression, &stage[1], + &ramstage_region[rmodule_offset], stage->len)) return;
if (rmodule_parse(&ramstage_region[rmodule_offset], &ramstage))