aboutsummaryrefslogtreecommitdiff
path: root/common/image.c
diff options
context:
space:
mode:
authorAtish Patra <atish.patra@wdc.com>2020-03-05 16:24:22 -0800
committerTom Rini <trini@konsulko.com>2020-04-17 12:32:36 -0400
commit155d6a3575470c1a735b8cf368d9e987930910a8 (patch)
tree102854264876f6bbee25449bea7cbad36cd145a8 /common/image.c
parent2a2119e10ca364d7c1539a9103b9fd3839dbe6ac (diff)
downloadu-boot-155d6a3575470c1a735b8cf368d9e987930910a8.zip
u-boot-155d6a3575470c1a735b8cf368d9e987930910a8.tar.gz
u-boot-155d6a3575470c1a735b8cf368d9e987930910a8.tar.bz2
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.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/common/image.c b/common/image.c
index 94873cb..d8d14e8 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)