summaryrefslogtreecommitdiff
path: root/util/cbfstool/cbfstool.c
diff options
context:
space:
mode:
authorDaisuke Nojiri <dnojiri@chromium.org>2015-07-09 15:07:45 -0700
committerPatrick Georgi <pgeorgi@google.com>2015-09-01 14:51:19 +0000
commit8984a637c121d06a408a5f2b3b9d5233a7aa0e6e (patch)
treef10700775087674ea26a04136a725369a4b7bbf5 /util/cbfstool/cbfstool.c
parent2c61506630b8e76bed93b3a5ac0ab2089376f548 (diff)
downloadcoreboot-8984a637c121d06a408a5f2b3b9d5233a7aa0e6e.tar.xz
cbfstool: allow compression at file header level
Currently, compression is only allowed at subheader level (e.g. cbfs_stage, cbfs_payload_segment). This change adds compression field to each file's header so that any cbfs file can be compressed. With the necessary additions in coreboot and libpayload, the following sample code can load a compressed file: const char *name = "foo.bmp"; struct cbfs_file *file = cbfs_get_file(media, name); void *dst = malloc(ntohl(file->uncompressed_size)); dst = cbfs_get_file_content(media, name, type, file, dst); cbfs_stage and cbfs_payload_segment continue to support compression at subheader level because stages and payloads have to be decompressed to the load address, which is stored in the subheader. For these, file level compression should be turned off. Change-Id: I9a00ec99dfc68ffb2771bb4a3cc5ba6ba8a326f4 Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org> Signed-off-by: Patrick Georgi <pgeorgi@chromium.org> Reviewed-on: http://review.coreboot.org/10935 Tested-by: build bot (Jenkins) Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Diffstat (limited to 'util/cbfstool/cbfstool.c')
-rw-r--r--util/cbfstool/cbfstool.c40
1 files changed, 37 insertions, 3 deletions
diff --git a/util/cbfstool/cbfstool.c b/util/cbfstool/cbfstool.c
index 059acbf14e..a91b600e4d 100644
--- a/util/cbfstool/cbfstool.c
+++ b/util/cbfstool/cbfstool.c
@@ -230,6 +230,40 @@ static int cbfs_add_component(const char *filename,
return 0;
}
+static int cbfstool_convert_raw(struct buffer *buffer,
+ unused uint32_t *offset, struct cbfs_file *header)
+{
+ char *compressed;
+ int compressed_size;
+
+ comp_func_ptr compress = compression_function(param.compression);
+ if (!compress)
+ return -1;
+ compressed = calloc(buffer->size, 1);
+
+ if (compress(buffer->data, buffer->size,
+ compressed, &compressed_size)) {
+ WARN("Compression failed - disabled\n");
+ } else {
+ struct cbfs_file_attr_compression *attrs =
+ (struct cbfs_file_attr_compression *)
+ cbfs_add_file_attr(header,
+ CBFS_FILE_ATTR_TAG_COMPRESSION,
+ sizeof(struct cbfs_file_attr_compression));
+ if (attrs == NULL)
+ return -1;
+ attrs->compression = htonl(param.compression);
+ attrs->decompressed_size = htonl(buffer->size);
+
+ free(buffer->data);
+ buffer->data = compressed;
+ buffer->size = compressed_size;
+
+ header->len = htonl(buffer->size);
+ }
+ return 0;
+}
+
static int cbfstool_convert_mkstage(struct buffer *buffer, uint32_t *offset,
struct cbfs_file *header)
{
@@ -301,7 +335,7 @@ static int cbfs_add(void)
param.type,
param.baseaddress,
param.headeroffset,
- NULL);
+ cbfstool_convert_raw);
}
static int cbfs_add_stage(void)
@@ -747,7 +781,7 @@ static bool cbfs_is_legacy_format(struct buffer *buffer)
}
static const struct command commands[] = {
- {"add", "H:r:f:n:t:b:vh?", cbfs_add, true, true},
+ {"add", "H:r:f:n:t:c:b:vh?", cbfs_add, true, true},
{"add-flat-binary", "H:r:f:n:l:e:c:b:vh?", cbfs_add_flat_binary, true,
true},
{"add-payload", "H:r:f:n:t:c:b:C:I:vh?", cbfs_add_payload, true, true},
@@ -862,7 +896,7 @@ static void usage(char *name)
" -h Display this help message\n\n"
"COMMANDs:\n"
" add [-r image,regions] -f FILE -n NAME -t TYPE \\\n"
- " [-b base-address] "
+ " [-c compression] [-b base-address] "
"Add a component\n"
" add-payload [-r image,regions] -f FILE -n NAME \\\n"
" [-c compression] [-b base-address] "