diff --git a/include/lar.h b/include/lar.h index 95b411a6cc..9b0914023a 100644 --- a/include/lar.h +++ b/include/lar.h @@ -67,6 +67,7 @@ struct lar_header { * 0 = no compression * 1 = lzma * 2 = nrv2b + * 3 = zeroes */ u32 compression; u64 entry; diff --git a/lib/lar.c b/lib/lar.c index 3eb1fccbd8..325a3e1517 100644 --- a/lib/lar.c +++ b/lib/lar.c @@ -170,6 +170,11 @@ int process_file(const struct mem_file *archive, void *where) return 0; } #endif + /* zeroes */ + if (archive->compression == 3) { + memset(archive->start, 0, archive->reallen); + return 0; + } printk(BIOS_INFO, "LAR: Compression algorithm #%i not supported!\n", archive->compression); return -1; } diff --git a/util/lar/lar.h b/util/lar/lar.h index 42c9a2c271..28e670fa33 100644 --- a/util/lar/lar.h +++ b/util/lar/lar.h @@ -75,6 +75,7 @@ struct lar_header { * 0 = no compression * 1 = lzma * 2 = nrv2b + * 3 = zeroes */ u32 compression; u64 entry; @@ -91,7 +92,7 @@ struct lar { u32 size; /**< Size of the mmaped file */ }; -enum compalgo { none = 0, lzma = 1, nrv2b = 2 }; +enum compalgo { none = 0, lzma = 1, nrv2b = 2, zeroes = 3 }; typedef void (*compress_func) (char *, int, char *, int *); typedef void (*uncompress_func) (char *, int, char *, int); @@ -100,26 +101,31 @@ void compress_impossible(char *in, int in_len, char *out, int *out_len); void do_no_compress(char *in, int in_len, char *out, int *out_len); void do_lzma_compress(char *in, int in_len, char *out, int *out_len); void do_nrv2b_compress(char *in, int in_len, char *out, int *out_len); +void do_zeroes_compress(char *in, int in_len, char *out, int *out_len); void uncompress_impossible(char *dst, int dst_len, char *src, int src_len); void do_no_uncompress(char *dst, int dst_len, char *src, int src_len); void do_lzma_uncompress(char *dst, int dst_len, char *src, int src_len); void do_nrv2b_uncompress(char *dst, int dst_len, char *src, int src_len); +void do_zeroes_uncompress(char *dst, int dst_len, char *src, int src_len); static compress_func compress_functions[] = { do_no_compress, do_lzma_compress, do_nrv2b_compress, + do_zeroes_compress, }; static uncompress_func uncompress_functions[] = { do_no_uncompress, do_lzma_uncompress, do_nrv2b_uncompress, + do_zeroes_uncompress, }; static const char *algo_name[] = { "", "lzma", "nrv2b", + "zeroes", }; diff --git a/util/lar/lib.c b/util/lar/lib.c index d9388c64f6..0dd2a69663 100644 --- a/util/lar/lib.c +++ b/util/lar/lib.c @@ -56,6 +56,25 @@ void do_no_compress(char *in, int in_len, char *out, int *out_len) out_len[0] = in_len; } +/** + * The zeroes "compress" hook + * Leave one byte for calculating the checksum. + */ +void do_zeroes_compress(char *in, int in_len, char *out, int *out_len) +{ + out[0] = 0; + out_len[0] = 1; +} + +/** + * The zeroes "uncompress" hook + */ + +void do_zeroes_uncompress(char *dst, int dst_len, char *src, int src_len) +{ + memset(dst, 0, dst_len); +} + /** * The default "uncompress" hook to call when no other compression is used */ diff --git a/util/lar/stream.c b/util/lar/stream.c index 5439b23df3..0b9f766189 100644 --- a/util/lar/stream.c +++ b/util/lar/stream.c @@ -147,7 +147,7 @@ int output_elf_segments(struct lar *lar, char *name, char *filebuf, fprintf(stderr, "Dropping empty section\n"); continue; } - thisalgo = algo; + thisalgo = zeroes; if (verbose()) fprintf(stderr, "New section addr %#x size %#x\n", (u32)shdr[i].sh_addr, (u32)shdr[i].sh_size);