[coreboot] r601 - in coreboot-v3: include lib util/lar

svn at coreboot.org svn at coreboot.org
Fri Feb 15 20:27:13 CET 2008


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 at pel.cs.byu.edu>
Acked-by: Ronald G. Minnich <rminnich at 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);





More information about the coreboot mailing list