Re: Status of bzip2 and lzma kernel compression for ARM?

2009-07-13 Thread Albin Tonnerre
On Fri, Jul 03, 2009 at 05:43:27PM +0200, Albin Tonnerre wrote :
However, it now hangs right after the 'done, booting the
 kernel.'
 

After some further work, here's an updated patch that works properly on ARM,
at least for gzip and lzma (I'm getting an 'out of memory' error with bzip2).

As a side note, my previous remarks about the LZMA header not being created
properly only apply to the git tree, as this is caused by commit
d3dd3b5a29bb9582957451531fed461628dfc834. 2.6.30 and 2.6.30.1 don't have this
issue

Regards,
Albin

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 9d02cdb..5cde822 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -18,6 +18,9 @@ config ARM
select HAVE_KRETPROBES if (HAVE_KPROBES)
select HAVE_FUNCTION_TRACER if (!XIP_KERNEL)
select HAVE_GENERIC_DMA_COHERENT
+   select HAVE_KERNEL_GZIP
+   select HAVE_KERNEL_BZIP2
+   select HAVE_KERNEL_LZMA
help
  The ARM series is a line of low-power-consumption RISC chip designs
  licensed by ARM Ltd and targeted at embedded applications and
diff --git a/arch/arm/boot/compressed/Makefile 
b/arch/arm/boot/compressed/Makefile
index fbe5eef..c29a88f 100644
--- a/arch/arm/boot/compressed/Makefile
+++ b/arch/arm/boot/compressed/Makefile
@@ -63,8 +63,15 @@ endif
 
 SEDFLAGS   = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/
 
-targets   := vmlinux vmlinux.lds piggy.gz piggy.o font.o font.c \
-head.o misc.o $(OBJS)
+suffix_$(CONFIG_KERNEL_GZIP)  = gz
+suffix_$(CONFIG_KERNEL_BZIP2) = bz2
+suffix_$(CONFIG_KERNEL_LZMA)  = lzma
+
+targets   := vmlinux vmlinux.lds \
+piggy.gz piggy.gz.o \
+piggy.bz2 piggy.bz2.o \
+piggy.lzma piggy.lzma.o \
+font.o font.c head.o misc.o $(OBJS)
 
 ifeq ($(CONFIG_FUNCTION_TRACER),y)
 ORIG_CFLAGS := $(KBUILD_CFLAGS)
@@ -91,7 +98,7 @@ LDFLAGS_vmlinux += -p --no-undefined -X \
 # would otherwise mess up our GOT table
 CFLAGS_misc.o := -Dstatic=
 
-$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.o \
+$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.$(suffix_y).o \
$(addprefix $(obj)/, $(OBJS)) FORCE
$(call if_changed,ld)
@:
@@ -99,7 +106,17 @@ $(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) 
$(obj)/piggy.o \
 $(obj)/piggy.gz: $(obj)/../Image FORCE
$(call if_changed,gzip)
 
-$(obj)/piggy.o:  $(obj)/piggy.gz FORCE
+$(obj)/piggy.bz2: $(obj)/../Image FORCE
+   $(call if_changed,bzip2)
+
+$(obj)/piggy.lzma: $(obj)/../Image FORCE
+   $(call if_changed,lzma)
+
+$(obj)/piggy.gz.o:  $(obj)/piggy.gz FORCE
+
+$(obj)/piggy.bz2.o:  $(obj)/piggy.bz2 FORCE
+
+$(obj)/piggy.lzma.o:  $(obj)/piggy.lzma FORCE
 
 CFLAGS_font.o := -Dstatic=
 
diff --git a/arch/arm/boot/compressed/misc.c b/arch/arm/boot/compressed/misc.c
index 9e6e512..4ba7249 100644
--- a/arch/arm/boot/compressed/misc.c
+++ b/arch/arm/boot/compressed/misc.c
@@ -18,6 +18,12 @@
 
 unsigned int __machine_arch_type;
 
+/* Prevent inclusion of string.h */
+#define _LINUX_STRING_H_
+
+/* ARM has no support for division or modulo in its pre-boot environment */
+#define NO_DIVISION
+
 #include linux/compiler.h/* for inline */
 #include linux/types.h   /* for size_t */
 #include linux/stddef.h  /* for NULL */
@@ -189,116 +195,31 @@ static inline __ptr_t memcpy(__ptr_t __dest, __const 
__ptr_t __src,
 /*
  * gzip delarations
  */
-#define OF(args)  args
 #define STATIC static
 
-typedef unsigned char  uch;
-typedef unsigned short ush;
-typedef unsigned long  ulg;
-
-#define WSIZE 0x8000   /* Window size must be at least 32k, */
-   /* and a power of two */
-
-static uch *inbuf; /* input buffer */
-static uch window[WSIZE];  /* Sliding window buffer */
-
-static unsigned insize;/* valid bytes in inbuf */
-static unsigned inptr; /* index of next byte to be processed in inbuf 
*/
-static unsigned outcnt;/* bytes in output buffer */
-
-/* gzip flag byte */
-#define ASCII_FLAG   0x01 /* bit 0 set: file probably ascii text */
-#define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */
-#define EXTRA_FIELD  0x04 /* bit 2 set: extra field present */
-#define ORIG_NAME0x08 /* bit 3 set: original file name present */
-#define COMMENT  0x10 /* bit 4 set: file comment present */
-#define ENCRYPTED0x20 /* bit 5 set: file is encrypted */
-#define RESERVED 0xC0 /* bit 6,7:   reserved */
-
-#define get_byte()  (inptr  insize ? inbuf[inptr++] : fill_inbuf())
-
-/* Diagnostic functions */
-#ifdef DEBUG
-#  define Assert(cond,msg) {if(!(cond)) error(msg);}
-#  define Trace(x) fprintf x
-#  define Tracev(x) {if (verbose) fprintf x ;}
-#  define Tracevv(x) {if (verbose1) fprintf x ;}
-#  define Tracec(c,x) {if (verbose  (c)) fprintf x ;}
-#  define Tracecv(c,x) {if (verbose1  (c)) fprintf x ;}
-#else
-#  define Assert(cond,msg

[PATCH 2/5] include/linux/unaligned/{l,b}e_byteshift.h: Fix usage for compressed kernels

2009-07-22 Thread Albin Tonnerre
When unaligned accesses are required for uncompressing a kernel (such as
for LZO decompression on ARM in a patch that follows), including
linux/kernel.h causes issues as it brings in a lot of things that are
not available in the decompression environment.
However, those files apparently use nothing from linux/kernel.h, all
they need is the declaration of types such as u32 or u64, so
linux/types.h should be enough

Signed-off-by: Albin Tonnerre albin.tonne...@free-electrons.com
---
 include/linux/unaligned/be_byteshift.h |2 +-
 include/linux/unaligned/le_byteshift.h |2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/include/linux/unaligned/be_byteshift.h 
b/include/linux/unaligned/be_byteshift.h
index 46dd12c..9356b24 100644
--- a/include/linux/unaligned/be_byteshift.h
+++ b/include/linux/unaligned/be_byteshift.h
@@ -1,7 +1,7 @@
 #ifndef _LINUX_UNALIGNED_BE_BYTESHIFT_H
 #define _LINUX_UNALIGNED_BE_BYTESHIFT_H
 
-#include linux/kernel.h
+#include linux/types.h
 
 static inline u16 __get_unaligned_be16(const u8 *p)
 {
diff --git a/include/linux/unaligned/le_byteshift.h 
b/include/linux/unaligned/le_byteshift.h
index 59777e9..be376fb 100644
--- a/include/linux/unaligned/le_byteshift.h
+++ b/include/linux/unaligned/le_byteshift.h
@@ -1,7 +1,7 @@
 #ifndef _LINUX_UNALIGNED_LE_BYTESHIFT_H
 #define _LINUX_UNALIGNED_LE_BYTESHIFT_H
 
-#include linux/kernel.h
+#include linux/types.h
 
 static inline u16 __get_unaligned_le16(const u8 *p)
 {
-- 
1.6.0.4

--
To unsubscribe from this list: send the line unsubscribe linux-embedded in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 3/5] Add support for LZO-compressed kernels

2009-07-22 Thread Albin Tonnerre
This is the first part of the lzo patch
The lzo compressor is worse than gzip at compression, but faster at
extraction. Here are some figures for an ARM board I'm working on:

Uncompressed size: 3.24Mo
gzip  1.61Mo 0.72s
lzo   1.75Mo 0.48s

So for a compression ratio that is still relatively close to gzip, it's
much faster to extract, at least in that case.

This version applies to kernel 2.6.31-rc3

This part contains:
 - Makefile routine to support lzo compression
 - Fixes to the existing lzo compressor so that it can be used in
   compressed kernels
 - wrapper around the existing lzo1x_decompress, as it only extracts one
   block at a time, while we need to extract a whole file here
 - config dialog for kernel compression

Signed-off-by: Albin Tonnerre albin.tonne...@free-electrons.com
---
 include/linux/decompress/unlzo.h |   10 +++
 init/Kconfig |   18 -
 lib/decompress_unlzo.c   |  138 ++
 lib/lzo/lzo1x_decompress.c   |9 ++-
 scripts/Makefile.lib |5 ++
 5 files changed, 173 insertions(+), 7 deletions(-)
 create mode 100644 include/linux/decompress/unlzo.h
 create mode 100644 lib/decompress_unlzo.c

diff --git a/include/linux/decompress/unlzo.h b/include/linux/decompress/unlzo.h
new file mode 100644
index 000..d1925ea
--- /dev/null
+++ b/include/linux/decompress/unlzo.h
@@ -0,0 +1,10 @@
+#ifndef DECOMPRESS_UNLZO_H
+#define DECOMPRESS_UNLZO_H
+
+int unlzo(unsigned char *inbuf, int len,
+  int(*fill)(void*, unsigned int),
+  int(*flush)(void*, unsigned int),
+  unsigned char *output,
+  int *pos,
+  void(*error)(char *x));
+#endif
diff --git a/init/Kconfig b/init/Kconfig
index 1ce05a4..66281fb 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -115,10 +115,13 @@ config HAVE_KERNEL_BZIP2
 config HAVE_KERNEL_LZMA
bool
 
+config HAVE_KERNEL_LZO
+   bool
+
 choice
prompt Kernel compression mode
default KERNEL_GZIP
-   depends on HAVE_KERNEL_GZIP || HAVE_KERNEL_BZIP2 || HAVE_KERNEL_LZMA
+   depends on HAVE_KERNEL_GZIP || HAVE_KERNEL_BZIP2 || HAVE_KERNEL_LZMA || 
HAVE_KERNEL_LZO
help
  The linux kernel is a kind of self-extracting executable.
  Several compression algorithms are available, which differ
@@ -141,9 +144,8 @@ config KERNEL_GZIP
bool Gzip
depends on HAVE_KERNEL_GZIP
help
- The old and tried gzip compression. Its compression ratio is
- the poorest among the 3 choices; however its speed (both
- compression and decompression) is the fastest.
+ The old and tried gzip compression. It provides a good balance
+ between compression ration and decompression speed.
 
 config KERNEL_BZIP2
bool Bzip2
@@ -164,6 +166,14 @@ config KERNEL_LZMA
  two. Compression is slowest.  The kernel size is about 33%
  smaller with LZMA in comparison to gzip.
 
+config KERNEL_LZO
+   bool LZO
+   depends on HAVE_KERNEL_LZO
+   help
+ Its compression ratio is the poorest among the 4. The kernel
+ size is about about 10% bigger than gzip; however its speed
+ (both compression and decompression) is the fastest.
+
 endchoice
 
 config SWAP
diff --git a/lib/decompress_unlzo.c b/lib/decompress_unlzo.c
new file mode 100644
index 000..d908b35
--- /dev/null
+++ b/lib/decompress_unlzo.c
@@ -0,0 +1,138 @@
+/*
+ * LZO decompressor for the Linux kernel. Code borrowed from the lzo
+ * implementation by Markus Franz Xaver Johannes Oberhumer.
+ *
+ * Linux kernel adaptation:
+ * Copyright (C) 2009
+ * Albin Tonnerre, Free Electrons albin.tonne...@free-electrons.com
+ *
+ * Original code:
+ * Copyright (C) 1996-2005 Markus Franz Xaver Johannes Oberhumer
+ * All Rights Reserved.
+ *
+ * lzop and the LZO library are free software; you can redistribute them
+ * and/or modify them under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.
+ * If not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Markus F.X.J. Oberhumer
+ * mar...@oberhumer.com
+ * http://www.oberhumer.com/opensource/lzop/
+ */
+
+#ifdef STATIC
+#include lzo/lzo1x_decompress.c
+#endif
+
+#include linux/lzo.h
+#include linux/decompress/mm.h
+#include linux/decompress/unlzo.h
+
+#include linux/compiler.h
+#include linux/types.h
+#include asm/unaligned.h
+
+static const unsigned char lzop_magic[] =
+{ 0x89, 0x4c

[PATCH 4/5] Add support for LZO-compressed kernels for ARM

2009-07-22 Thread Albin Tonnerre
This is the second part of patch. This part includes:
 - changes to ach/arch/boot/Makefile to make it easier to add new
   compression types
 - new piggy.lzo.S necessary for lzo compression
 - changes in arch/arm/boot/compressed/misc.c to allow the use of lzo or
   gzip, depending on the config
 - Kconfig support

Signed-off-by: Albin Tonnerre albin.tonne...@free-electrons.com
---
 arch/arm/Kconfig  |2 +
 arch/arm/boot/compressed/Makefile |   16 +++--
 arch/arm/boot/compressed/misc.c   |  110 
 arch/arm/boot/compressed/piggy.S  |6 --
 arch/arm/boot/compressed/piggy.gzip.S |6 ++
 arch/arm/boot/compressed/piggy.lzo.S  |6 ++
 6 files changed, 52 insertions(+), 94 deletions(-)
 delete mode 100644 arch/arm/boot/compressed/piggy.S
 create mode 100644 arch/arm/boot/compressed/piggy.gzip.S
 create mode 100644 arch/arm/boot/compressed/piggy.lzo.S

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index aef63c8..ea71c0c 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -18,6 +18,8 @@ config ARM
select HAVE_KRETPROBES if (HAVE_KPROBES)
select HAVE_FUNCTION_TRACER if (!XIP_KERNEL)
select HAVE_GENERIC_DMA_COHERENT
+   select HAVE_KERNEL_GZIP
+   select HAVE_KERNEL_LZO
help
  The ARM series is a line of low-power-consumption RISC chip designs
  licensed by ARM Ltd and targeted at embedded applications and
diff --git a/arch/arm/boot/compressed/Makefile 
b/arch/arm/boot/compressed/Makefile
index ce39dc5..4ea8f25 100644
--- a/arch/arm/boot/compressed/Makefile
+++ b/arch/arm/boot/compressed/Makefile
@@ -63,8 +63,12 @@ endif
 
 SEDFLAGS   = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/
 
-targets   := vmlinux vmlinux.lds piggy.gz piggy.o font.o font.c \
-head.o misc.o $(OBJS)
+suffix_$(CONFIG_KERNEL_GZIP) = gzip
+suffix_$(CONFIG_KERNEL_LZO)  = lzo
+
+targets   := vmlinux vmlinux.lds \
+piggy.$(suffix_y) piggy.$(suffix_y).o \
+font.o font.c head.o misc.o $(OBJS)
 
 ifeq ($(CONFIG_FUNCTION_TRACER),y)
 ORIG_CFLAGS := $(KBUILD_CFLAGS)
@@ -94,15 +98,15 @@ LDFLAGS_vmlinux += -p --no-undefined -X \
 # would otherwise mess up our GOT table
 CFLAGS_misc.o := -Dstatic=
 
-$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.o \
+$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.$(suffix_y).o \
$(addprefix $(obj)/, $(OBJS)) FORCE
$(call if_changed,ld)
@:
 
-$(obj)/piggy.gz: $(obj)/../Image FORCE
-   $(call if_changed,gzip)
+$(obj)/piggy.$(suffix_y): $(obj)/../Image FORCE
+   $(call if_changed,$(suffix_y))
 
-$(obj)/piggy.o:  $(obj)/piggy.gz FORCE
+$(obj)/piggy.$(suffix_y).o:  $(obj)/piggy.$(suffix_y) FORCE
 
 CFLAGS_font.o := -Dstatic=
 
diff --git a/arch/arm/boot/compressed/misc.c b/arch/arm/boot/compressed/misc.c
index 9e6e512..c4ec564 100644
--- a/arch/arm/boot/compressed/misc.c
+++ b/arch/arm/boot/compressed/misc.c
@@ -18,11 +18,15 @@
 
 unsigned int __machine_arch_type;
 
+#define _LINUX_STRING_H_
+
 #include linux/compiler.h/* for inline */
 #include linux/types.h   /* for size_t */
 #include linux/stddef.h  /* for NULL */
 #include asm/string.h
 
+#include asm/unaligned.h
+
 #ifdef STANDALONE_DEBUG
 #define putstr printf
 #else
@@ -189,34 +193,8 @@ static inline __ptr_t memcpy(__ptr_t __dest, __const 
__ptr_t __src,
 /*
  * gzip delarations
  */
-#define OF(args)  args
 #define STATIC static
 
-typedef unsigned char  uch;
-typedef unsigned short ush;
-typedef unsigned long  ulg;
-
-#define WSIZE 0x8000   /* Window size must be at least 32k, */
-   /* and a power of two */
-
-static uch *inbuf; /* input buffer */
-static uch window[WSIZE];  /* Sliding window buffer */
-
-static unsigned insize;/* valid bytes in inbuf */
-static unsigned inptr; /* index of next byte to be processed in inbuf 
*/
-static unsigned outcnt;/* bytes in output buffer */
-
-/* gzip flag byte */
-#define ASCII_FLAG   0x01 /* bit 0 set: file probably ascii text */
-#define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */
-#define EXTRA_FIELD  0x04 /* bit 2 set: extra field present */
-#define ORIG_NAME0x08 /* bit 3 set: original file name present */
-#define COMMENT  0x10 /* bit 4 set: file comment present */
-#define ENCRYPTED0x20 /* bit 5 set: file is encrypted */
-#define RESERVED 0xC0 /* bit 6,7:   reserved */
-
-#define get_byte()  (inptr  insize ? inbuf[inptr++] : fill_inbuf())
-
 /* Diagnostic functions */
 #ifdef DEBUG
 #  define Assert(cond,msg) {if(!(cond)) error(msg);}
@@ -234,24 +212,20 @@ static unsigned outcnt;   /* bytes in output 
buffer */
 #  define Tracecv(c,x)
 #endif
 
-static int  fill_inbuf(void);
-static void flush_window(void);
 static void error(char *m);
 
 extern char input_data[];
 extern char input_data_end

Re: [PATCH 4/5] Add support for LZO-compressed kernels for ARM

2009-07-23 Thread Albin Tonnerre
On Wed, Jul 22, 2009 at 04:01:18PM +0200, Albin Tonnerre wrote :
 This is the second part of patch. This part includes:
  - changes to ach/arch/boot/Makefile to make it easier to add new
compression types
  - new piggy.lzo.S necessary for lzo compression
  - changes in arch/arm/boot/compressed/misc.c to allow the use of lzo or
gzip, depending on the config
  - Kconfig support
 

I failed to mention this in the first place, but for proper crediting it should
be noted that the ARM part of the patch is based on Alain Knaff's work on the
LZMA/Bzip compression patch for ARM.

Regards,
-- 
Albin Tonnerre, Free Electrons
Kernel, drivers and embedded Linux development,
consulting, training and support.
http://free-electrons.com


signature.asc
Description: Digital signature


[PATCH 3/5 v2] Add support for LZO-compressed kernels

2009-07-29 Thread Albin Tonnerre
This is the first part of the lzo patch
The lzo compressor is worse than gzip at compression, but faster at
extraction. Here are some figures for an ARM board I'm working on:

Uncompressed size: 3.24Mo
gzip  1.61Mo 0.72s
lzo   1.75Mo 0.48s

So for a compression ratio that is still relatively close to gzip, it's
much faster to extract, at least in that case.

This version applies to kernel 2.6.31-rc3

This part contains:
 - Makefile routine to support lzo compression
 - Fixes to the existing lzo compressor so that it can be used in
   compressed kernels
 - wrapper around the existing lzo1x_decompress, as it only extracts one
   block at a time, while we need to extract a whole file here
 - config dialog for kernel compression

Signed-off-by: Albin Tonnerre albin.tonne...@free-electrons.com
---
Changelog since v1:

lib/decompress_unlzo.c
 - Rename lzo_decompress to unlzo to match the prototype in decompress/unlzo.h
 - Use LZO_BLOCK_SIZE instead of BLOCK_SIZE to avoid confusion
 - Add support for using the posp, fill and flush arguments
 - Reorder includes so that linux/types.h is included before
   linux/lzo.h. This prevents issue when not used as bootstrap code, as
   lzo.h needs things like size_t
 - When we are not using unlzo as part of kernel bootstrap code, we need
   linux/slab.h for memory allocation functions.
 - ... and we also need a call to set_error_fn so that the provided error
   function is used correctly

 include/linux/decompress/unlzo.h |   10 ++
 init/Kconfig |   18 +++-
 lib/decompress_unlzo.c   |  206 ++
 lib/lzo/lzo1x_decompress.c   |9 +-
 scripts/Makefile.lib |5 +
 5 files changed, 241 insertions(+), 7 deletions(-)
 create mode 100644 include/linux/decompress/unlzo.h
 create mode 100644 lib/decompress_unlzo.c

diff --git a/include/linux/decompress/unlzo.h b/include/linux/decompress/unlzo.h
new file mode 100644
index 000..d1925ea
--- /dev/null
+++ b/include/linux/decompress/unlzo.h
@@ -0,0 +1,10 @@
+#ifndef DECOMPRESS_UNLZO_H
+#define DECOMPRESS_UNLZO_H
+
+int unlzo(unsigned char *inbuf, int len,
+  int(*fill)(void*, unsigned int),
+  int(*flush)(void*, unsigned int),
+  unsigned char *output,
+  int *pos,
+  void(*error)(char *x));
+#endif
diff --git a/init/Kconfig b/init/Kconfig
index cb2c092..ada6182 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -115,10 +115,13 @@ config HAVE_KERNEL_BZIP2
 config HAVE_KERNEL_LZMA
bool
 
+config HAVE_KERNEL_LZO
+   bool
+
 choice
prompt Kernel compression mode
default KERNEL_GZIP
-   depends on HAVE_KERNEL_GZIP || HAVE_KERNEL_BZIP2 || HAVE_KERNEL_LZMA
+   depends on HAVE_KERNEL_GZIP || HAVE_KERNEL_BZIP2 || HAVE_KERNEL_LZMA || 
HAVE_KERNEL_LZO
help
  The linux kernel is a kind of self-extracting executable.
  Several compression algorithms are available, which differ
@@ -141,9 +144,8 @@ config KERNEL_GZIP
bool Gzip
depends on HAVE_KERNEL_GZIP
help
- The old and tried gzip compression. Its compression ratio is
- the poorest among the 3 choices; however its speed (both
- compression and decompression) is the fastest.
+ The old and tried gzip compression. It provides a good balance
+ between compression ration and decompression speed.
 
 config KERNEL_BZIP2
bool Bzip2
@@ -164,6 +166,14 @@ config KERNEL_LZMA
  two. Compression is slowest.  The kernel size is about 33%
  smaller with LZMA in comparison to gzip.
 
+config KERNEL_LZO
+   bool LZO
+   depends on HAVE_KERNEL_LZO
+   help
+ Its compression ratio is the poorest among the 4. The kernel
+ size is about about 10% bigger than gzip; however its speed
+ (both compression and decompression) is the fastest.
+
 endchoice
 
 config SWAP
diff --git a/lib/decompress_unlzo.c b/lib/decompress_unlzo.c
new file mode 100644
index 000..a18417a
--- /dev/null
+++ b/lib/decompress_unlzo.c
@@ -0,0 +1,206 @@
+/*
+ * LZO decompressor for the Linux kernel. Code borrowed from the lzo
+ * implementation by Markus Franz Xaver Johannes Oberhumer.
+ *
+ * Linux kernel adaptation:
+ * Copyright (C) 2009
+ * Albin Tonnerre, Free Electrons albin.tonne...@free-electrons.com
+ *
+ * Original code:
+ * Copyright (C) 1996-2005 Markus Franz Xaver Johannes Oberhumer
+ * All Rights Reserved.
+ *
+ * lzop and the LZO library are free software; you can redistribute them
+ * and/or modify them under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details

[PATCH] Add LZO compression support for initramfs and old-style initrd

2009-07-29 Thread Albin Tonnerre
Signed-off-by: Albin Tonnerre albin.tonne...@free-electrons.com
---
 lib/Kconfig  |4 
 lib/Makefile |1 +
 lib/decompress.c |5 +
 usr/Kconfig  |   25 -
 4 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/lib/Kconfig b/lib/Kconfig
index bb1326d..8639349 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -117,6 +117,10 @@ config DECOMPRESS_BZIP2
 config DECOMPRESS_LZMA
tristate
 
+config DECOMPRESS_LZO
+   select LZO_DECOMPRESS
+   tristate
+
 #
 # Generic allocator support is selected if needed
 #
diff --git a/lib/Makefile b/lib/Makefile
index b6d1857..cd3d37b 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -69,6 +69,7 @@ obj-$(CONFIG_LZO_DECOMPRESS) += lzo/
 lib-$(CONFIG_DECOMPRESS_GZIP) += decompress_inflate.o
 lib-$(CONFIG_DECOMPRESS_BZIP2) += decompress_bunzip2.o
 lib-$(CONFIG_DECOMPRESS_LZMA) += decompress_unlzma.o
+lib-$(CONFIG_DECOMPRESS_LZO) += decompress_unlzo.o
 
 obj-$(CONFIG_TEXTSEARCH) += textsearch.o
 obj-$(CONFIG_TEXTSEARCH_KMP) += ts_kmp.o
diff --git a/lib/decompress.c b/lib/decompress.c
index d2842f5..a760681 100644
--- a/lib/decompress.c
+++ b/lib/decompress.c
@@ -9,6 +9,7 @@
 #include linux/decompress/bunzip2.h
 #include linux/decompress/unlzma.h
 #include linux/decompress/inflate.h
+#include linux/decompress/unlzo.h
 
 #include linux/types.h
 #include linux/string.h
@@ -22,6 +23,9 @@
 #ifndef CONFIG_DECOMPRESS_LZMA
 # define unlzma NULL
 #endif
+#ifndef CONFIG_DECOMPRESS_LZO
+# define unlzo NULL
+#endif
 
 static const struct compress_format {
unsigned char magic[2];
@@ -32,6 +36,7 @@ static const struct compress_format {
{ {037, 0236}, gzip, gunzip },
{ {0x42, 0x5a}, bzip2, bunzip2 },
{ {0x5d, 0x00}, lzma, unlzma },
+   { {0x89, 0x4c}, lzo, unlzo },
{ {0, 0}, NULL, NULL }
 };
 
diff --git a/usr/Kconfig b/usr/Kconfig
index 1c3039f..04a826e 100644
--- a/usr/Kconfig
+++ b/usr/Kconfig
@@ -72,6 +72,15 @@ config RD_LZMA
  Support loading of a LZMA encoded initial ramdisk or cpio buffer
  If unsure, say N.
 
+config RD_LZO
+   bool Support initial ramdisks compressed using LZO if EMBEDDED
+   default !EMBEDDED
+   depends on BLK_DEV_INITRD
+   select DECOMPRESS_LZO
+   help
+ Support loading of a LZO encoded initial ramdisk or cpio buffer
+ If unsure, say N.
+
 choice
prompt Built-in initramfs compression mode if INITRAMFS_SOURCE!=
help
@@ -108,16 +117,15 @@ config INITRAMFS_COMPRESSION_GZIP
bool Gzip
depends on RD_GZIP
help
- The old and tried gzip compression. Its compression ratio is
- the poorest among the 3 choices; however its speed (both
- compression and decompression) is the fastest.
+ The old and tried gzip compression. It provides a good balance
+ between compression ration and decompression speed.
 
 config INITRAMFS_COMPRESSION_BZIP2
bool Bzip2
depends on RD_BZIP2
help
  Its compression ratio and speed is intermediate.
- Decompression speed is slowest among the three.  The initramfs
+ Decompression speed is slowest among the four.  The initramfs
  size is about 10% smaller with bzip2, in comparison to gzip.
  Bzip2 uses a large amount of memory. For modern kernels you
  will need at least 8MB RAM or more for booting.
@@ -128,7 +136,14 @@ config INITRAMFS_COMPRESSION_LZMA
help
  The most recent compression algorithm.
  Its ratio is best, decompression speed is between the other
- two. Compression is slowest.  The initramfs size is about 33%
+ three. Compression is slowest. The initramfs size is about 33%
  smaller with LZMA in comparison to gzip.
 
+config INITRAMFS_COMPRESSION_LZO
+   bool LZO
+   depends on RD_LZO
+   help
+ Its compression ratio is the poorest among the four. The kernel
+ size is about about 10% bigger than gzip; however its speed
+
 endchoice
-- 
Albin Tonnerre, Free Electrons
Kernel, drivers and embedded Linux development,
consulting, training and support.
http://free-electrons.com
--
To unsubscribe from this list: send the line unsubscribe linux-embedded in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 5/5] Add support for LZO-compressed kernels on x86

2009-07-31 Thread Albin Tonnerre
On Wed, Jul 29, 2009 at 11:02:58PM +0200, Sam Ravnborg wrote :
 On Wed, Jul 29, 2009 at 01:00:36PM -0700, H. Peter Anvin wrote:
  On 07/22/2009 07:01 AM, Albin Tonnerre wrote:
   This is the third and last part of the patch, which contains the
   necessary changes to the x86 Kconfig and boot/compressed to allow the
   use of this new compression method
   
   Signed-off-by: Albin Tonnerre albin.tonne...@free-electrons.com
  
  Acked-by: H. Peter Anvin h...@zytor.com
  
  Since the patchset otherwise isn't really x86-related it probably makes
  more sense to pass this through the kbuild tree, or perhaps via akpm,
  rather than -tip?
 
 I can take it via kbuild if I get a fewsh patch-set with proper
 ack's added.
 I've long lost the original patch-set.

Only the x86-specific part of the patch has been acked so far, and it relies on
3 other patches which have not been acked. If there's anything I can do to get
feedback on the remaining patches, please let me know.

Regards,
-- 
Albin Tonnerre, Free Electrons
Kernel, drivers and embedded Linux development,
consulting, training and support.
http://free-electrons.com


signature.asc
Description: Digital signature


[PATCH 1/6] lib/decompress_*: only include linux/slab.h if STATIC is not defined

2009-08-03 Thread Albin Tonnerre
These includes were added by 079effb6933f34b9b1b67b08bd4fd7fb672d16ef to
fix the build when using kmemtrace. However this is not necessary when
used to create a compressed kernel, and actually creates issues (brings
a lot of things unavailable in the decompression environment), so don't
include it if STATIC is defined.

Signed-off-by: Albin Tonnerre albin.tonne...@free-electrons.com
---
 lib/decompress_bunzip2.c |2 +-
 lib/decompress_inflate.c |2 +-
 lib/decompress_unlzma.c  |2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/lib/decompress_bunzip2.c b/lib/decompress_bunzip2.c
index 708e2a8..14b0c7d 100644
--- a/lib/decompress_bunzip2.c
+++ b/lib/decompress_bunzip2.c
@@ -47,10 +47,10 @@
 
 #ifndef STATIC
 #include linux/decompress/bunzip2.h
+#include linux/slab.h
 #endif /* !STATIC */
 
 #include linux/decompress/mm.h
-#include linux/slab.h
 
 #ifndef INT_MAX
 #define INT_MAX 0x7fff
diff --git a/lib/decompress_inflate.c b/lib/decompress_inflate.c
index e36b296..fc30d50 100644
--- a/lib/decompress_inflate.c
+++ b/lib/decompress_inflate.c
@@ -19,11 +19,11 @@
 #include zlib_inflate/inflate.h
 
 #include zlib_inflate/infutil.h
+#include linux/slab.h
 
 #endif /* STATIC */
 
 #include linux/decompress/mm.h
-#include linux/slab.h
 
 #define INBUF_LEN (16*1024)
 
diff --git a/lib/decompress_unlzma.c b/lib/decompress_unlzma.c
index 32123a1..f078c88 100644
--- a/lib/decompress_unlzma.c
+++ b/lib/decompress_unlzma.c
@@ -31,10 +31,10 @@
 
 #ifndef STATIC
 #include linux/decompress/unlzma.h
+#include linux/slab.h
 #endif /* STATIC */
 
 #include linux/decompress/mm.h
-#include linux/slab.h
 
 #defineMIN(a, b) (((a)  (b)) ? (a) : (b))
 
-- 
1.6.3.3

--
To unsubscribe from this list: send the line unsubscribe linux-embedded in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 2/6] include/linux/unaligned/{l,b}e_byteshift.h: Fix usage for compressed kernels

2009-08-03 Thread Albin Tonnerre
When unaligned accesses are required for uncompressing a kernel (such as
for LZO decompression on ARM in a patch that follows), including
linux/kernel.h causes issues as it brings in a lot of things that are
not available in the decompression environment.
However, those files apparently use nothing from linux/kernel.h, all
they need is the declaration of types such as u32 or u64, so
linux/types.h should be enough

Signed-off-by: Albin Tonnerre albin.tonne...@free-electrons.com
---
 include/linux/unaligned/be_byteshift.h |2 +-
 include/linux/unaligned/le_byteshift.h |2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/include/linux/unaligned/be_byteshift.h 
b/include/linux/unaligned/be_byteshift.h
index 46dd12c..9356b24 100644
--- a/include/linux/unaligned/be_byteshift.h
+++ b/include/linux/unaligned/be_byteshift.h
@@ -1,7 +1,7 @@
 #ifndef _LINUX_UNALIGNED_BE_BYTESHIFT_H
 #define _LINUX_UNALIGNED_BE_BYTESHIFT_H
 
-#include linux/kernel.h
+#include linux/types.h
 
 static inline u16 __get_unaligned_be16(const u8 *p)
 {
diff --git a/include/linux/unaligned/le_byteshift.h 
b/include/linux/unaligned/le_byteshift.h
index 59777e9..be376fb 100644
--- a/include/linux/unaligned/le_byteshift.h
+++ b/include/linux/unaligned/le_byteshift.h
@@ -1,7 +1,7 @@
 #ifndef _LINUX_UNALIGNED_LE_BYTESHIFT_H
 #define _LINUX_UNALIGNED_LE_BYTESHIFT_H
 
-#include linux/kernel.h
+#include linux/types.h
 
 static inline u16 __get_unaligned_le16(const u8 *p)
 {
-- 
1.6.3.3

--
To unsubscribe from this list: send the line unsubscribe linux-embedded in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 4/6] Add support for LZO-compressed kernels for ARM

2009-08-03 Thread Albin Tonnerre
This is the second part of patch. This part includes:
 - changes to ach/arch/boot/Makefile to make it easier to add new
   compression types
 - new piggy.lzo.S necessary for lzo compression
 - changes in arch/arm/boot/compressed/misc.c to allow the use of lzo or
   gzip, depending on the config
 - Kconfig support

Signed-off-by: Albin Tonnerre albin.tonne...@free-electrons.com
---
 arch/arm/Kconfig  |2 +
 arch/arm/boot/compressed/Makefile |   16 +++--
 arch/arm/boot/compressed/misc.c   |  110 
 arch/arm/boot/compressed/piggy.S  |6 --
 arch/arm/boot/compressed/piggy.gzip.S |6 ++
 arch/arm/boot/compressed/piggy.lzo.S  |6 ++
 6 files changed, 52 insertions(+), 94 deletions(-)
 delete mode 100644 arch/arm/boot/compressed/piggy.S
 create mode 100644 arch/arm/boot/compressed/piggy.gzip.S
 create mode 100644 arch/arm/boot/compressed/piggy.lzo.S

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index aef63c8..ea71c0c 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -18,6 +18,8 @@ config ARM
select HAVE_KRETPROBES if (HAVE_KPROBES)
select HAVE_FUNCTION_TRACER if (!XIP_KERNEL)
select HAVE_GENERIC_DMA_COHERENT
+   select HAVE_KERNEL_GZIP
+   select HAVE_KERNEL_LZO
help
  The ARM series is a line of low-power-consumption RISC chip designs
  licensed by ARM Ltd and targeted at embedded applications and
diff --git a/arch/arm/boot/compressed/Makefile 
b/arch/arm/boot/compressed/Makefile
index ce39dc5..4ea8f25 100644
--- a/arch/arm/boot/compressed/Makefile
+++ b/arch/arm/boot/compressed/Makefile
@@ -63,8 +63,12 @@ endif
 
 SEDFLAGS   = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/
 
-targets   := vmlinux vmlinux.lds piggy.gz piggy.o font.o font.c \
-head.o misc.o $(OBJS)
+suffix_$(CONFIG_KERNEL_GZIP) = gzip
+suffix_$(CONFIG_KERNEL_LZO)  = lzo
+
+targets   := vmlinux vmlinux.lds \
+piggy.$(suffix_y) piggy.$(suffix_y).o \
+font.o font.c head.o misc.o $(OBJS)
 
 ifeq ($(CONFIG_FUNCTION_TRACER),y)
 ORIG_CFLAGS := $(KBUILD_CFLAGS)
@@ -94,15 +98,15 @@ LDFLAGS_vmlinux += -p --no-undefined -X \
 # would otherwise mess up our GOT table
 CFLAGS_misc.o := -Dstatic=
 
-$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.o \
+$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.$(suffix_y).o \
$(addprefix $(obj)/, $(OBJS)) FORCE
$(call if_changed,ld)
@:
 
-$(obj)/piggy.gz: $(obj)/../Image FORCE
-   $(call if_changed,gzip)
+$(obj)/piggy.$(suffix_y): $(obj)/../Image FORCE
+   $(call if_changed,$(suffix_y))
 
-$(obj)/piggy.o:  $(obj)/piggy.gz FORCE
+$(obj)/piggy.$(suffix_y).o:  $(obj)/piggy.$(suffix_y) FORCE
 
 CFLAGS_font.o := -Dstatic=
 
diff --git a/arch/arm/boot/compressed/misc.c b/arch/arm/boot/compressed/misc.c
index 9e6e512..c4ec564 100644
--- a/arch/arm/boot/compressed/misc.c
+++ b/arch/arm/boot/compressed/misc.c
@@ -18,11 +18,15 @@
 
 unsigned int __machine_arch_type;
 
+#define _LINUX_STRING_H_
+
 #include linux/compiler.h/* for inline */
 #include linux/types.h   /* for size_t */
 #include linux/stddef.h  /* for NULL */
 #include asm/string.h
 
+#include asm/unaligned.h
+
 #ifdef STANDALONE_DEBUG
 #define putstr printf
 #else
@@ -189,34 +193,8 @@ static inline __ptr_t memcpy(__ptr_t __dest, __const 
__ptr_t __src,
 /*
  * gzip delarations
  */
-#define OF(args)  args
 #define STATIC static
 
-typedef unsigned char  uch;
-typedef unsigned short ush;
-typedef unsigned long  ulg;
-
-#define WSIZE 0x8000   /* Window size must be at least 32k, */
-   /* and a power of two */
-
-static uch *inbuf; /* input buffer */
-static uch window[WSIZE];  /* Sliding window buffer */
-
-static unsigned insize;/* valid bytes in inbuf */
-static unsigned inptr; /* index of next byte to be processed in inbuf 
*/
-static unsigned outcnt;/* bytes in output buffer */
-
-/* gzip flag byte */
-#define ASCII_FLAG   0x01 /* bit 0 set: file probably ascii text */
-#define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */
-#define EXTRA_FIELD  0x04 /* bit 2 set: extra field present */
-#define ORIG_NAME0x08 /* bit 3 set: original file name present */
-#define COMMENT  0x10 /* bit 4 set: file comment present */
-#define ENCRYPTED0x20 /* bit 5 set: file is encrypted */
-#define RESERVED 0xC0 /* bit 6,7:   reserved */
-
-#define get_byte()  (inptr  insize ? inbuf[inptr++] : fill_inbuf())
-
 /* Diagnostic functions */
 #ifdef DEBUG
 #  define Assert(cond,msg) {if(!(cond)) error(msg);}
@@ -234,24 +212,20 @@ static unsigned outcnt;   /* bytes in output 
buffer */
 #  define Tracecv(c,x)
 #endif
 
-static int  fill_inbuf(void);
-static void flush_window(void);
 static void error(char *m);
 
 extern char input_data[];
 extern char input_data_end

[PATCH 6/6] Add LZO compression support for initramfs and old-style initrd

2009-08-03 Thread Albin Tonnerre

Signed-off-by: Albin Tonnerre albin.tonne...@free-electrons.com
---
 lib/Kconfig  |4 
 lib/Makefile |1 +
 lib/decompress.c |5 +
 usr/Kconfig  |   25 -
 4 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/lib/Kconfig b/lib/Kconfig
index bb1326d..8639349 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -117,6 +117,10 @@ config DECOMPRESS_BZIP2
 config DECOMPRESS_LZMA
tristate
 
+config DECOMPRESS_LZO
+   select LZO_DECOMPRESS
+   tristate
+
 #
 # Generic allocator support is selected if needed
 #
diff --git a/lib/Makefile b/lib/Makefile
index 2e78277..cfa4041 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -69,6 +69,7 @@ obj-$(CONFIG_LZO_DECOMPRESS) += lzo/
 lib-$(CONFIG_DECOMPRESS_GZIP) += decompress_inflate.o
 lib-$(CONFIG_DECOMPRESS_BZIP2) += decompress_bunzip2.o
 lib-$(CONFIG_DECOMPRESS_LZMA) += decompress_unlzma.o
+lib-$(CONFIG_DECOMPRESS_LZO) += decompress_unlzo.o
 
 obj-$(CONFIG_TEXTSEARCH) += textsearch.o
 obj-$(CONFIG_TEXTSEARCH_KMP) += ts_kmp.o
diff --git a/lib/decompress.c b/lib/decompress.c
index d2842f5..a760681 100644
--- a/lib/decompress.c
+++ b/lib/decompress.c
@@ -9,6 +9,7 @@
 #include linux/decompress/bunzip2.h
 #include linux/decompress/unlzma.h
 #include linux/decompress/inflate.h
+#include linux/decompress/unlzo.h
 
 #include linux/types.h
 #include linux/string.h
@@ -22,6 +23,9 @@
 #ifndef CONFIG_DECOMPRESS_LZMA
 # define unlzma NULL
 #endif
+#ifndef CONFIG_DECOMPRESS_LZO
+# define unlzo NULL
+#endif
 
 static const struct compress_format {
unsigned char magic[2];
@@ -32,6 +36,7 @@ static const struct compress_format {
{ {037, 0236}, gzip, gunzip },
{ {0x42, 0x5a}, bzip2, bunzip2 },
{ {0x5d, 0x00}, lzma, unlzma },
+   { {0x89, 0x4c}, lzo, unlzo },
{ {0, 0}, NULL, NULL }
 };
 
diff --git a/usr/Kconfig b/usr/Kconfig
index 1c3039f..04a826e 100644
--- a/usr/Kconfig
+++ b/usr/Kconfig
@@ -72,6 +72,15 @@ config RD_LZMA
  Support loading of a LZMA encoded initial ramdisk or cpio buffer
  If unsure, say N.
 
+config RD_LZO
+   bool Support initial ramdisks compressed using LZO if EMBEDDED
+   default !EMBEDDED
+   depends on BLK_DEV_INITRD
+   select DECOMPRESS_LZO
+   help
+ Support loading of a LZO encoded initial ramdisk or cpio buffer
+ If unsure, say N.
+
 choice
prompt Built-in initramfs compression mode if INITRAMFS_SOURCE!=
help
@@ -108,16 +117,15 @@ config INITRAMFS_COMPRESSION_GZIP
bool Gzip
depends on RD_GZIP
help
- The old and tried gzip compression. Its compression ratio is
- the poorest among the 3 choices; however its speed (both
- compression and decompression) is the fastest.
+ The old and tried gzip compression. It provides a good balance
+ between compression ration and decompression speed.
 
 config INITRAMFS_COMPRESSION_BZIP2
bool Bzip2
depends on RD_BZIP2
help
  Its compression ratio and speed is intermediate.
- Decompression speed is slowest among the three.  The initramfs
+ Decompression speed is slowest among the four.  The initramfs
  size is about 10% smaller with bzip2, in comparison to gzip.
  Bzip2 uses a large amount of memory. For modern kernels you
  will need at least 8MB RAM or more for booting.
@@ -128,7 +136,14 @@ config INITRAMFS_COMPRESSION_LZMA
help
  The most recent compression algorithm.
  Its ratio is best, decompression speed is between the other
- two. Compression is slowest.  The initramfs size is about 33%
+ three. Compression is slowest. The initramfs size is about 33%
  smaller with LZMA in comparison to gzip.
 
+config INITRAMFS_COMPRESSION_LZO
+   bool LZO
+   depends on RD_LZO
+   help
+ Its compression ratio is the poorest among the four. The kernel
+ size is about about 10% bigger than gzip; however its speed
+
 endchoice
-- 
1.6.3.3

--
To unsubscribe from this list: send the line unsubscribe linux-embedded in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 6/6] Add LZO compression support for initramfs and old-style initrd

2009-08-03 Thread Albin Tonnerre
Signed-off-by: Albin Tonnerre albin.tonne...@free-electrons.com
---

Updated with a missing part of the description for INITRAMFS_COMPRESSION_LZO

 lib/Kconfig  |4 
 lib/Makefile |1 +
 lib/decompress.c |5 +
 usr/Kconfig  |   26 +-
 4 files changed, 31 insertions(+), 5 deletions(-)

diff --git a/lib/Kconfig b/lib/Kconfig
index bb1326d..8639349 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -117,6 +117,10 @@ config DECOMPRESS_BZIP2
 config DECOMPRESS_LZMA
tristate
 
+config DECOMPRESS_LZO
+   select LZO_DECOMPRESS
+   tristate
+
 #
 # Generic allocator support is selected if needed
 #
diff --git a/lib/Makefile b/lib/Makefile
index 2e78277..cfa4041 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -69,6 +69,7 @@ obj-$(CONFIG_LZO_DECOMPRESS) += lzo/
 lib-$(CONFIG_DECOMPRESS_GZIP) += decompress_inflate.o
 lib-$(CONFIG_DECOMPRESS_BZIP2) += decompress_bunzip2.o
 lib-$(CONFIG_DECOMPRESS_LZMA) += decompress_unlzma.o
+lib-$(CONFIG_DECOMPRESS_LZO) += decompress_unlzo.o
 
 obj-$(CONFIG_TEXTSEARCH) += textsearch.o
 obj-$(CONFIG_TEXTSEARCH_KMP) += ts_kmp.o
diff --git a/lib/decompress.c b/lib/decompress.c
index d2842f5..a760681 100644
--- a/lib/decompress.c
+++ b/lib/decompress.c
@@ -9,6 +9,7 @@
 #include linux/decompress/bunzip2.h
 #include linux/decompress/unlzma.h
 #include linux/decompress/inflate.h
+#include linux/decompress/unlzo.h
 
 #include linux/types.h
 #include linux/string.h
@@ -22,6 +23,9 @@
 #ifndef CONFIG_DECOMPRESS_LZMA
 # define unlzma NULL
 #endif
+#ifndef CONFIG_DECOMPRESS_LZO
+# define unlzo NULL
+#endif
 
 static const struct compress_format {
unsigned char magic[2];
@@ -32,6 +36,7 @@ static const struct compress_format {
{ {037, 0236}, gzip, gunzip },
{ {0x42, 0x5a}, bzip2, bunzip2 },
{ {0x5d, 0x00}, lzma, unlzma },
+   { {0x89, 0x4c}, lzo, unlzo },
{ {0, 0}, NULL, NULL }
 };
 
diff --git a/usr/Kconfig b/usr/Kconfig
index 1c3039f..bf30c32 100644
--- a/usr/Kconfig
+++ b/usr/Kconfig
@@ -72,6 +72,15 @@ config RD_LZMA
  Support loading of a LZMA encoded initial ramdisk or cpio buffer
  If unsure, say N.
 
+config RD_LZO
+   bool Support initial ramdisks compressed using LZO if EMBEDDED
+   default !EMBEDDED
+   depends on BLK_DEV_INITRD
+   select DECOMPRESS_LZO
+   help
+ Support loading of a LZO encoded initial ramdisk or cpio buffer
+ If unsure, say N.
+
 choice
prompt Built-in initramfs compression mode if INITRAMFS_SOURCE!=
help
@@ -108,16 +117,15 @@ config INITRAMFS_COMPRESSION_GZIP
bool Gzip
depends on RD_GZIP
help
- The old and tried gzip compression. Its compression ratio is
- the poorest among the 3 choices; however its speed (both
- compression and decompression) is the fastest.
+ The old and tried gzip compression. It provides a good balance
+ between compression ration and decompression speed.
 
 config INITRAMFS_COMPRESSION_BZIP2
bool Bzip2
depends on RD_BZIP2
help
  Its compression ratio and speed is intermediate.
- Decompression speed is slowest among the three.  The initramfs
+ Decompression speed is slowest among the four.  The initramfs
  size is about 10% smaller with bzip2, in comparison to gzip.
  Bzip2 uses a large amount of memory. For modern kernels you
  will need at least 8MB RAM or more for booting.
@@ -128,7 +136,15 @@ config INITRAMFS_COMPRESSION_LZMA
help
  The most recent compression algorithm.
  Its ratio is best, decompression speed is between the other
- two. Compression is slowest.  The initramfs size is about 33%
+ three. Compression is slowest. The initramfs size is about 33%
  smaller with LZMA in comparison to gzip.
 
+config INITRAMFS_COMPRESSION_LZO
+   bool LZO
+   depends on RD_LZO
+   help
+ Its compression ratio is the poorest among the four. The kernel
+ size is about about 10% bigger than gzip; however its speed
+ (both compression and decompression) is the fastest.
+
 endchoice
-- 
Albin Tonnerre, Free Electrons
Kernel, drivers and embedded Linux development,
consulting, training and support.
http://free-electrons.com
--
To unsubscribe from this list: send the line unsubscribe linux-embedded in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 3/6] Add support for LZO-compressed kernels

2009-08-05 Thread Albin Tonnerre
On Tue, Aug 04, 2009 at 04:00:43PM -0700, Andrew Morton wrote :
 On Mon,  3 Aug 2009 16:58:18 +0200
 Albin Tonnerre albin.tonne...@free-electrons.com wrote:

  This is the first part of the lzo patch
  The lzo compressor is worse than gzip at compression, but faster at
  extraction. Here are some figures for an ARM board I'm working on:

  Uncompressed size: 3.24Mo
  gzip  1.61Mo 0.72s
  lzo   1.75Mo 0.48s

  So for a compression ratio that is still relatively close to gzip, it's
  much faster to extract, at least in that case.

 Is 3.2Mb a typical kernel size for small systems?  It sounds large.

This one actually embeds an initramfs which accounts for about half of the size.

  +#ifdef STATIC

 What is this STATIC thing for?

That's what is currently used to test whether you're compiling the pre-boot
environment. eg. include/linux/decompress/mm.h uses this to determine whether it
should provide a malloc() implementation or simply #define malloc(a) kmalloc(a, 
GFP_KERNEL),
and a lot of similar things

-- 
Albin Tonnerre, Free Electrons
Kernel, drivers and embedded Linux development,
consulting, training and support.
http://free-electrons.com
--
To unsubscribe from this list: send the line unsubscribe linux-embedded in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 2/6] include/linux/unaligned/{l,b}e_byteshift.h: Fix usage for compressed kernels

2009-08-05 Thread Albin Tonnerre
On Tue, Aug 04, 2009 at 03:55:50PM -0700, Andrew Morton wrote :
 On Mon,  3 Aug 2009 16:58:17 +0200
 Albin Tonnerre albin.tonne...@free-electrons.com wrote:

  When unaligned accesses are required for uncompressing a kernel (such as
  for LZO decompression on ARM in a patch that follows), including
  linux/kernel.h causes issues as it brings in a lot of things that are
  not available in the decompression environment.
  However, those files apparently use nothing from linux/kernel.h, all
  they need is the declaration of types such as u32 or u64, so
  linux/types.h should be enough

 Again, please provide a full description of thes issues which a patch
 addresses so that the patch's importance can be understood by others,
 thanks.

linux/kernel.h brings at least:
extern int console_printk[];
extern const char hex_asc[];
which causes errors at link-time as they are not available when
compiling the pre-boot environement. There are also a few others:

arch/arm/boot/compressed/misc.o: In function `valid_user_regs':
/home/albin/devel/free-electrons/gits/linux-2.6/arch/arm/include/asm/ptrace.h:158:
 undefined reference to `elf_hwcap'
arch/arm/boot/compressed/misc.o: In function `console_silent':
/home/albin/devel/free-electrons/gits/linux-2.6/include/linux/kernel.h:292: 
undefined reference to `console_printk'
arch/arm/boot/compressed/misc.o: In function `console_verbose':
/home/albin/devel/free-electrons/gits/linux-2.6/include/linux/kernel.h:297: 
undefined reference to `console_printk'
arch/arm/boot/compressed/misc.o: In function `pack_hex_byte':
/home/albin/devel/free-electrons/gits/linux-2.6/include/linux/kernel.h:360: 
undefined reference to `hex_asc'
arch/arm/boot/compressed/misc.o: In function `hweight_long':
/home/albin/devel/free-electrons/gits/linux-2.6/include/linux/bitops.h:45: 
undefined reference to `hweight32'
arch/arm/boot/compressed/misc.o: In function `__cmpxchg_local_generic':
/home/albin/devel/free-electrons/gits/linux-2.6/include/asm-generic/cmpxchg-local.h:21:
 undefined reference to `wrong_size_cmpxchg'
/home/albin/devel/free-electrons/gits/linux-2.6/include/asm-generic/cmpxchg-local.h:42:
 undefined reference to `wrong_size_cmpxchg'
arch/arm/boot/compressed/misc.o: In function `__xchg':
/home/albin/devel/free-electrons/gits/linux-2.6/arch/arm/include/asm/system.h:309:
 undefined reference to `__bad_xchg'
make[2]: *** [arch/arm/boot/compressed/vmlinux] Error 1
make[1]: *** [arch/arm/boot/compressed/vmlinux] Error 2

Regards,
-- 
Albin Tonnerre, Free Electrons
Kernel, drivers and embedded Linux development,
consulting, training and support.
http://free-electrons.com
--
To unsubscribe from this list: send the line unsubscribe linux-embedded in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 4/6] Add support for LZO-compressed kernels for ARM

2009-08-07 Thread Albin Tonnerre
On Thu, Aug 06, 2009 at 11:40:55PM +0100, Russell King - ARM Linux wrote :
 On Mon, Aug 03, 2009 at 04:58:19PM +0200, Albin Tonnerre wrote:
  This is the second part of patch. This part includes:
   - changes to ach/arch/boot/Makefile to make it easier to add new
 compression types
   - new piggy.lzo.S necessary for lzo compression
   - changes in arch/arm/boot/compressed/misc.c to allow the use of lzo or
 gzip, depending on the config
   - Kconfig support

 FYI, with these patches applied and selecting GZIP method, I get
 linker errors.  I've been unable to track down what's going on, but
 it appears to be a libgcc issue.

 In spite of the decompressor being built as an EABI object, gcc seems
 to be issuing calls to __umodsi3, which isn't in the EABI libgcc
 (they're called something different - don't ask.)

I also happen to have issues related to the linker not finding __aeabi_uidivmod,
but only when compiling with CONFIG_CC_OPTIMIZE_FOR_SIZE. Is it similar for you,
or does it also fail when compiling with -O2 ?

 So I think these patches need further testing and evaluation on ARM
 before they can be merged.  Moreover, I'd like to see some comparisons
 between the _current_ gzip method, the new gzip method and the lzo
 method on ARM.

I don't have my ARM platforms at hand, but I'll so these comparisons in a couple
days when I access to them again.

Regards,
-- 
Albin Tonnerre, Free Electrons
Kernel, drivers and embedded Linux development,
consulting, training and support.
http://free-electrons.com
--
To unsubscribe from this list: send the line unsubscribe linux-embedded in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 4/6] Add support for LZO-compressed kernels for ARM

2009-08-07 Thread Albin Tonnerre
On Fri, Aug 07, 2009 at 11:36:56AM +0200, Alain Knaff wrote :
 On 08/07/09 11:24, Albin Tonnerre wrote:
  On Thu, Aug 06, 2009 at 11:40:55PM +0100, Russell King - ARM Linux wrote :
  On Mon, Aug 03, 2009 at 04:58:19PM +0200, Albin Tonnerre wrote:
  This is the second part of patch. This part includes:
   - changes to ach/arch/boot/Makefile to make it easier to add new
 compression types
   - new piggy.lzo.S necessary for lzo compression
   - changes in arch/arm/boot/compressed/misc.c to allow the use of lzo or
 gzip, depending on the config
   - Kconfig support

  FYI, with these patches applied and selecting GZIP method, I get
  linker errors.  I've been unable to track down what's going on, but
  it appears to be a libgcc issue.

  In spite of the decompressor being built as an EABI object, gcc seems
  to be issuing calls to __umodsi3, which isn't in the EABI libgcc
  (they're called something different - don't ask.)

  I also happen to have issues related to the linker not finding 
  __aeabi_uidivmod,
  but only when compiling with CONFIG_CC_OPTIMIZE_FOR_SIZE. Is it similar for 
  you,
  or does it also fail when compiling with -O2 ?

  So I think these patches need further testing and evaluation on ARM
  before they can be merged.  Moreover, I'd like to see some comparisons
  between the _current_ gzip method, the new gzip method and the lzo
  method on ARM.

  I don't have my ARM platforms at hand, but I'll so these comparisons in a 
  couple
  days when I access to them again.

  Regards,

 Could it be that the patches that remove division (zutil.h and inflate.c)
 have somehow not been applied?

Indeed, they've not been applied. However, I'd rather try to understand why
exactly this is an issue when compiling with -Os and not -O2 instead of working
around it by removing the divisions.

Regards,
-- 
Albin Tonnerre, Free Electrons
Kernel, drivers and embedded Linux development,
consulting, training and support.
http://free-electrons.com
--
To unsubscribe from this list: send the line unsubscribe linux-embedded in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 4/6] Add support for LZO-compressed kernels for ARM

2009-08-07 Thread Albin Tonnerre
On Fri, Aug 07, 2009 at 03:27:00PM +0200, Matthieu CASTET wrote :
 Albin Tonnerre a écrit :
  On Fri, Aug 07, 2009 at 01:50:03PM +0200, Matthieu CASTET wrote :
  Albin Tonnerre a écrit :
  On Fri, Aug 07, 2009 at 11:36:56AM +0200, Alain Knaff wrote :
  On 08/07/09 11:24, Albin Tonnerre wrote:

  Regards,

  Could it be that the patches that remove division (zutil.h and inflate.c)
  have somehow not been applied?

  Indeed, they've not been applied. However, I'd rather try to understand 
  why
  exactly this is an issue when compiling with -Os and not -O2 instead of 
  working
  around it by removing the divisions.

  Look at the generated code.

  Arm doesn't have division instruction.
  May be at -Os gcc emit a call to the software division, but at -O2 it
  manage to optimise the division (transform it in shift, inline some
  builtin, ...).

  Yes, I figured that out. What I don't get, though, is that it fails while 
  the
  software division symbol (__aeabi_uidivmod here) does seem to be provided by
  libgcc.

 AFAIK we don't link the kernel with libgcc.
 That's why the kernel provide __aeabi_* in arch/arm/lib

That's true for the actual kernel image, but not for the bootstrap code we use
when compiling compressed kernels. arch/arm/boot/compressed/Makefile uses
libgcc, unless I'm overlooking something here:

  arm-unknown-linux-uclibcgnueabi-ld -EL--defsym zreladdr=0x20008000
  --defsym initrd_phys=0x2041 --defsym params_phys=0x2100 -p
  --no-undefined -X
  
/home/albin/x-tools/arm-unknown-linux-uclibcgnueabi/lib/gcc/arm-unknown-linux-uclibcgnueabi/4.3.2/libgcc.a
  -T arch/arm/boot/compressed/vmlinux.lds arch/arm/boot/compressed/head.o
  arch/arm/boot/compressed/piggy.gzip.o arch/arm/boot/compressed/misc.o -o
  arch/arm/boot/compressed/vmlinux


Regards,
-- 
Albin Tonnerre, Free Electrons
Kernel, drivers and embedded Linux development,
consulting, training and support.
http://free-electrons.com
--
To unsubscribe from this list: send the line unsubscribe linux-embedded in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 4/6] Add support for LZO-compressed kernels for ARM

2009-08-11 Thread Albin Tonnerre
Hi Sam,

On Fri, Aug 07, 2009 at 11:08:16PM +0200, Sam Ravnborg wrote :
 We could add libgcc as a prerequisite.
 Untested patch below.

When compiling with this patch applied, I get the following error:

  Kernel: arch/arm/boot/Image is ready
LD  arch/arm/boot/compressed/vmlinux
/home/albin/x-tools/arm-unknown-linux-uclibcgnueabi/lib/gcc/arm-unknown-linux-uclibcgnueabi/4.3.2/libgcc.a(_dvmd_lnx.o):
In function `__div0':
/home/albin/devel/free-electrons/toolchain/targets/src/gcc-4.3.2/libgcc/../gcc/config/arm/lib1funcs.asm:1079:
undefined reference to `raise'
make[2]: *** [arch/arm/boot/compressed/vmlinux] Error 1
make[1]: *** [arch/arm/boot/compressed/vmlinux] Error 2

I've got no idea where this symbol is defined, though. Has anyone an idea on
this ?

Regards,
-- 
Albin Tonnerre, Free Electrons
Kernel, drivers and embedded Linux development,
consulting, training and support.
http://free-electrons.com
--
To unsubscribe from this list: send the line unsubscribe linux-embedded in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 4/6] Add support for LZO-compressed kernels for ARM

2009-08-11 Thread Albin Tonnerre
On Tue, Aug 11, 2009 at 09:03:14AM -0700, H. Peter Anvin wrote :
 On 08/11/2009 02:44 AM, Albin Tonnerre wrote:
  Hi Sam,
  
  On Fri, Aug 07, 2009 at 11:08:16PM +0200, Sam Ravnborg wrote :
  We could add libgcc as a prerequisite.
  Untested patch below.
  
  When compiling with this patch applied, I get the following error:
  
Kernel: arch/arm/boot/Image is ready
  LD  arch/arm/boot/compressed/vmlinux
  /home/albin/x-tools/arm-unknown-linux-uclibcgnueabi/lib/gcc/arm-unknown-linux-uclibcgnueabi/4.3.2/libgcc.a(_dvmd_lnx.o):
  In function `__div0':
  /home/albin/devel/free-electrons/toolchain/targets/src/gcc-4.3.2/libgcc/../gcc/config/arm/lib1funcs.asm:1079:
  undefined reference to `raise'
  make[2]: *** [arch/arm/boot/compressed/vmlinux] Error 1
  make[1]: *** [arch/arm/boot/compressed/vmlinux] Error 2
  
  I've got no idea where this symbol is defined, though. Has anyone an idea on
  this ?
  
 
 raise() gets called by libgcc to handle division by zero.

So I guess the only options left are either define a dummy raise() function, or
get rid of the divisions like Alain Knaff did in his patch ?

Regards,
-- 
Albin Tonnerre, Free Electrons
Kernel, drivers and embedded Linux development,
consulting, training and support.
http://free-electrons.com
--
To unsubscribe from this list: send the line unsubscribe linux-embedded in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 4/6] Add support for LZO-compressed kernels for ARM

2009-08-13 Thread Albin Tonnerre
On Thu, Aug 06, 2009 at 11:40:55PM +0100, Russell King - ARM Linux wrote :
 On Mon, Aug 03, 2009 at 04:58:19PM +0200, Albin Tonnerre wrote:
  This is the second part of patch. This part includes:
   - changes to ach/arch/boot/Makefile to make it easier to add new
 compression types
   - new piggy.lzo.S necessary for lzo compression
   - changes in arch/arm/boot/compressed/misc.c to allow the use of lzo or
 gzip, depending on the config
   - Kconfig support
 
 FYI, with these patches applied and selecting GZIP method, I get
 linker errors.  I've been unable to track down what's going on, but
 it appears to be a libgcc issue.
 
 In spite of the decompressor being built as an EABI object, gcc seems
 to be issuing calls to __umodsi3, which isn't in the EABI libgcc
 (they're called something different - don't ask.)

Looks like this one is on its way to getting solved.

 So I think these patches need further testing and evaluation on ARM
 before they can be merged.  Moreover, I'd like to see some comparisons
 between the _current_ gzip method, the new gzip method and the lzo
 method on ARM.

The figures I posted with my patch were from an ARM (AT91SAM9263) 180MHz CPU.
For the record (average on 25 boots with each compression method):

Uncompressed size: 3.24Mo
gzip  1.61Mo 0.72s
lzo   1.75Mo 0.48s

Some tests with the current gzip code give about 1.64s decompression time.

Regards,
-- 
Albin Tonnerre, Free Electrons
Kernel, drivers and embedded Linux development,
consulting, training and support.
http://free-electrons.com
--
To unsubscribe from this list: send the line unsubscribe linux-embedded in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 4/6 v2] Add support for LZO-compressed kernels for ARM

2009-08-14 Thread Albin Tonnerre
This is the second part of patch. This part includes:
 - changes to ach/arch/boot/Makefile to make it easier to add new
   compression types
 - new piggy.lzo.S necessary for lzo compression
 - changes in arch/arm/boot/compressed/misc.c to allow the use of lzo or
   gzip, depending on the config
 - Kconfig support

Signed-off-by: Albin Tonnerre albin.tonne...@free-electrons.com
---
Changes:
 Compiling with -Os failed due to missing __aeabi_uidivmod.
 Link using arch/arm/lib/lib1funcs.o which provides this symbol, and
 define a dummy __div0 function in arch/arm/boot/compressed/misc.c, as
 this symbol is required by lib1funcs.

 arch/arm/Kconfig  |2 +
 arch/arm/boot/compressed/Makefile |   31 ++---
 arch/arm/boot/compressed/misc.c   |  116 ++---
 arch/arm/boot/compressed/piggy.S  |6 --
 arch/arm/boot/compressed/piggy.gzip.S |6 ++
 arch/arm/boot/compressed/piggy.lzo.S  |6 ++
 6 files changed, 70 insertions(+), 97 deletions(-)
 delete mode 100644 arch/arm/boot/compressed/piggy.S
 create mode 100644 arch/arm/boot/compressed/piggy.gzip.S
 create mode 100644 arch/arm/boot/compressed/piggy.lzo.S

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index aef63c8..ea71c0c 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -18,6 +18,8 @@ config ARM
select HAVE_KRETPROBES if (HAVE_KPROBES)
select HAVE_FUNCTION_TRACER if (!XIP_KERNEL)
select HAVE_GENERIC_DMA_COHERENT
+   select HAVE_KERNEL_GZIP
+   select HAVE_KERNEL_LZO
help
  The ARM series is a line of low-power-consumption RISC chip designs
  licensed by ARM Ltd and targeted at embedded applications and
diff --git a/arch/arm/boot/compressed/Makefile 
b/arch/arm/boot/compressed/Makefile
index ce39dc5..5b4629b 100644
--- a/arch/arm/boot/compressed/Makefile
+++ b/arch/arm/boot/compressed/Makefile
@@ -63,8 +63,12 @@ endif
 
 SEDFLAGS   = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/
 
-targets   := vmlinux vmlinux.lds piggy.gz piggy.o font.o font.c \
-head.o misc.o $(OBJS)
+suffix_$(CONFIG_KERNEL_GZIP) = gzip
+suffix_$(CONFIG_KERNEL_LZO)  = lzo
+
+targets   := vmlinux vmlinux.lds \
+piggy.$(suffix_y) piggy.$(suffix_y).o \
+font.o font.c head.o misc.o $(OBJS)
 
 ifeq ($(CONFIG_FUNCTION_TRACER),y)
 ORIG_CFLAGS := $(KBUILD_CFLAGS)
@@ -87,22 +91,31 @@ endif
 ifneq ($(PARAMS_PHYS),)
 LDFLAGS_vmlinux += --defsym params_phys=$(PARAMS_PHYS)
 endif
-LDFLAGS_vmlinux += -p --no-undefined -X \
-   $(shell $(CC) $(KBUILD_CFLAGS) --print-libgcc-file-name) -T
+# ?
+LDFLAGS_vmlinux += -p
+# Report unresolved symbol references
+LDFLAGS_vmlinux += --no-undefined
+# Delete all temporary local symbols
+LDFLAGS_vmlinux += -X
+# Next argument is a linker script
+LDFLAGS_vmlinux += -T
+
+# For __aeabi_uidivmod
+lib1funcs = $(srctree)/arch/$(SRCARCH)/lib/lib1funcs.o
 
 # Don't allow any static data in misc.o, which
 # would otherwise mess up our GOT table
 CFLAGS_misc.o := -Dstatic=
 
-$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.o \
-   $(addprefix $(obj)/, $(OBJS)) FORCE
+$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.$(suffix_y).o \
+   $(addprefix $(obj)/, $(OBJS)) $(lib1funcs) FORCE
$(call if_changed,ld)
@:
 
-$(obj)/piggy.gz: $(obj)/../Image FORCE
-   $(call if_changed,gzip)
+$(obj)/piggy.$(suffix_y): $(obj)/../Image FORCE
+   $(call if_changed,$(suffix_y))
 
-$(obj)/piggy.o:  $(obj)/piggy.gz FORCE
+$(obj)/piggy.$(suffix_y).o:  $(obj)/piggy.$(suffix_y) FORCE
 
 CFLAGS_font.o := -Dstatic=
 
diff --git a/arch/arm/boot/compressed/misc.c b/arch/arm/boot/compressed/misc.c
index 17153b5..57077c8 100644
--- a/arch/arm/boot/compressed/misc.c
+++ b/arch/arm/boot/compressed/misc.c
@@ -18,10 +18,15 @@
 
 unsigned int __machine_arch_type;
 
+#define _LINUX_STRING_H_
+
 #include linux/compiler.h/* for inline */
 #include linux/types.h   /* for size_t */
 #include linux/stddef.h  /* for NULL */
 #include asm/string.h
+#include linux/linkage.h
+
+#include asm/unaligned.h
 
 #ifdef STANDALONE_DEBUG
 #define putstr printf
@@ -188,34 +193,8 @@ static inline __ptr_t memcpy(__ptr_t __dest, __const 
__ptr_t __src,
 /*
  * gzip delarations
  */
-#define OF(args)  args
 #define STATIC static
 
-typedef unsigned char  uch;
-typedef unsigned short ush;
-typedef unsigned long  ulg;
-
-#define WSIZE 0x8000   /* Window size must be at least 32k, */
-   /* and a power of two */
-
-static uch *inbuf; /* input buffer */
-static uch window[WSIZE];  /* Sliding window buffer */
-
-static unsigned insize;/* valid bytes in inbuf */
-static unsigned inptr; /* index of next byte to be processed in inbuf 
*/
-static unsigned outcnt;/* bytes in output buffer */
-
-/* gzip flag byte */
-#define ASCII_FLAG   0x01 /* bit 0 set: file probably