Author: myles Date: 2008-02-15 20:27:13 +0100 (Fri, 15 Feb 2008) New Revision: 601
Modified: coreboot-v3/include/lar.h coreboot-v3/lib/lar.c coreboot-v3/util/lar/lar.h coreboot-v3/util/lar/lib.c coreboot-v3/util/lar/stream.c Log: This patch adds zero compression for bss segments. One of the reasons for this is that currently, if you select no compression, the bss segment of filo takes up 153K with just zeroes. With this patch, it always takes up a lar header + 1 byte. I left the one byte so that the checksum wouldn't be broken.
This patch could have taken out the calloc in the compression area, but since it only uses compile-time memory, I decided to keep this simple.
Myles
Signed-off-by: Myles Watson myles@pel.cs.byu.edu Acked-by: Ronald G. Minnich rminnich@gmail.com
Modified: coreboot-v3/include/lar.h =================================================================== --- coreboot-v3/include/lar.h 2008-02-15 13:49:52 UTC (rev 600) +++ coreboot-v3/include/lar.h 2008-02-15 19:27:13 UTC (rev 601) @@ -67,6 +67,7 @@ * 0 = no compression * 1 = lzma * 2 = nrv2b + * 3 = zeroes */ u32 compression; u64 entry;
Modified: coreboot-v3/lib/lar.c =================================================================== --- coreboot-v3/lib/lar.c 2008-02-15 13:49:52 UTC (rev 600) +++ coreboot-v3/lib/lar.c 2008-02-15 19:27:13 UTC (rev 601) @@ -170,6 +170,11 @@ 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; }
Modified: coreboot-v3/util/lar/lar.h =================================================================== --- coreboot-v3/util/lar/lar.h 2008-02-15 13:49:52 UTC (rev 600) +++ coreboot-v3/util/lar/lar.h 2008-02-15 19:27:13 UTC (rev 601) @@ -75,6 +75,7 @@ * 0 = no compression * 1 = lzma * 2 = nrv2b + * 3 = zeroes */ u32 compression; u64 entry; @@ -91,7 +92,7 @@ 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 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", };
Modified: coreboot-v3/util/lar/lib.c =================================================================== --- coreboot-v3/util/lar/lib.c 2008-02-15 13:49:52 UTC (rev 600) +++ coreboot-v3/util/lar/lib.c 2008-02-15 19:27:13 UTC (rev 601) @@ -57,6 +57,25 @@ }
/** + * 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 */
Modified: coreboot-v3/util/lar/stream.c =================================================================== --- coreboot-v3/util/lar/stream.c 2008-02-15 13:49:52 UTC (rev 600) +++ coreboot-v3/util/lar/stream.c 2008-02-15 19:27:13 UTC (rev 601) @@ -147,7 +147,7 @@ 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);