diff options
author | Atish Patra | 2020-03-05 16:24:22 -0800 |
---|---|---|
committer | Tom Rini | 2020-04-17 12:32:36 -0400 |
commit | 155d6a3575470c1a735b8cf368d9e987930910a8 (patch) | |
tree | 102854264876f6bbee25449bea7cbad36cd145a8 /common/image.c | |
parent | 2a2119e10ca364d7c1539a9103b9fd3839dbe6ac (diff) |
image: Add a common compression type detection function.
Currently, there is no method that can detect compression types
given a file. This is very useful where a compressed kernel image
is loaded directly to the memory.
Inspect initial few bytes to figure out compression type of the
image. It will be used in booti method for now but can be reused
any other function in future as well.
Signed-off-by: Atish Patra <atish.patra@wdc.com>
Reviewed-by: Tom Rini <trini@konsulko.com>
Diffstat (limited to 'common/image.c')
-rw-r--r-- | common/image.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/common/image.c b/common/image.c index 94873cb6ed5..d8d14e871c6 100644 --- a/common/image.c +++ b/common/image.c @@ -202,6 +202,14 @@ struct table_info { const table_entry_t *table; }; +static const struct comp_magic_map image_comp[] = { + { IH_COMP_BZIP2, "bzip2", {0x42, 0x5a},}, + { IH_COMP_GZIP, "gzip", {0x1f, 0x8b},}, + { IH_COMP_LZMA, "lzma", {0x5d, 0x00},}, + { IH_COMP_LZO, "lzo", {0x89, 0x4c},}, + { IH_COMP_NONE, "none", {}, }, +}; + static const struct table_info table_info[IH_COUNT] = { { "architecture", IH_ARCH_COUNT, uimage_arch }, { "compression", IH_COMP_COUNT, uimage_comp }, @@ -407,6 +415,21 @@ static void print_decomp_msg(int comp_type, int type, bool is_xip) printf(" Uncompressing %s\n", name); } +int image_decomp_type(const unsigned char *buf, ulong len) +{ + const struct comp_magic_map *cmagic = image_comp; + + if (len < 2) + return -EINVAL; + + for (; cmagic->comp_id > 0; cmagic++) { + if (!memcmp(buf, cmagic->magic, 2)) + break; + } + + return cmagic->comp_id; +} + int image_decomp(int comp, ulong load, ulong image_start, int type, void *load_buf, void *image_buf, ulong image_len, uint unc_len, ulong *load_end) |