diff options
-rw-r--r-- | util/cbfstool/cbfs.h | 9 | ||||
-rw-r--r-- | util/cbfstool/cbfstool.c | 40 |
2 files changed, 46 insertions, 3 deletions
diff --git a/util/cbfstool/cbfs.h b/util/cbfstool/cbfs.h index 185bddebf6..44e3dcde6d 100644 --- a/util/cbfstool/cbfs.h +++ b/util/cbfstool/cbfs.h @@ -104,6 +104,15 @@ struct cbfs_file_attribute { * 0xff. Support both. */ #define CBFS_FILE_ATTR_TAG_UNUSED 0 #define CBFS_FILE_ATTR_TAG_UNUSED2 0xffffffff +#define CBFS_FILE_ATTR_TAG_COMPRESSION 0x42435a4c + +struct cbfs_file_attr_compression { + uint32_t tag; + uint32_t len; + /* whole file compression format. 0 if no compression. */ + uint32_t compression; + uint32_t decompressed_size; +} __PACKED; struct cbfs_stage { uint32_t compression; 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] " |