Revert "arm: add support for LZO-compressed kernels"
author黄涛 <huangtao@rock-chips.com>
Sat, 30 Jul 2011 07:54:56 +0000 (15:54 +0800)
committer黄涛 <huangtao@rock-chips.com>
Sat, 30 Jul 2011 07:54:56 +0000 (15:54 +0800)
This reverts commit c418f3acd26f289b11b043378656e1d000d97f87.

arch/arm/Kconfig
arch/arm/boot/compressed/Makefile
arch/arm/boot/compressed/misc.c
arch/arm/boot/compressed/piggy.S [new file with mode: 0644]
arch/arm/boot/compressed/piggy.gzip.S [deleted file]
arch/arm/boot/compressed/piggy.lzo.S [deleted file]

index ccf23ffc9006613389f56cd81e7237c47a61d95d..457038911f57e06f2a9374c087506a58d305db8d 100644 (file)
@@ -18,8 +18,6 @@ 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
index 2d4d88ba73bf9533598b074b08cce94ee85ae26c..ce39dc5400858891dc17be16de158fb6db041627 100644 (file)
@@ -63,12 +63,8 @@ endif
 
 SEDFLAGS       = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/
 
-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)
+targets       := vmlinux vmlinux.lds piggy.gz piggy.o font.o font.c \
+                head.o misc.o $(OBJS)
 
 ifeq ($(CONFIG_FUNCTION_TRACER),y)
 ORIG_CFLAGS := $(KBUILD_CFLAGS)
@@ -91,34 +87,22 @@ endif
 ifneq ($(PARAMS_PHYS),)
 LDFLAGS_vmlinux += --defsym params_phys=$(PARAMS_PHYS)
 endif
-# ?
-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 = $(obj)/lib1funcs.o
-
-$(obj)/lib1funcs.S: $(srctree)/arch/$(SRCARCH)/lib/lib1funcs.S FORCE
-       $(call cmd,shipped)
+LDFLAGS_vmlinux += -p --no-undefined -X \
+       $(shell $(CC) $(KBUILD_CFLAGS) --print-libgcc-file-name) -T
 
 # 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.$(suffix_y).o \
-               $(addprefix $(obj)/, $(OBJS)) $(lib1funcs) FORCE
+$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.o \
+               $(addprefix $(obj)/, $(OBJS)) FORCE
        $(call if_changed,ld)
        @:
 
-$(obj)/piggy.$(suffix_y): $(obj)/../Image FORCE
-       $(call if_changed,$(suffix_y))
+$(obj)/piggy.gz: $(obj)/../Image FORCE
+       $(call if_changed,gzip)
 
-$(obj)/piggy.$(suffix_y).o:  $(obj)/piggy.$(suffix_y) FORCE
+$(obj)/piggy.o:  $(obj)/piggy.gz FORCE
 
 CFLAGS_font.o := -Dstatic=
 
index 328e7a896205bfbd3d4cd20705de01cdc219deac..c97ad768b42c4dab7b0697c53c7fbc30f2670cfd 100644 (file)
 
 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
@@ -193,8 +188,34 @@ 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_NAME    0x08 /* bit 3 set: original file name present */
+#define COMMENT      0x10 /* bit 4 set: file comment present */
+#define ENCRYPTED    0x20 /* 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);}
@@ -212,20 +233,24 @@ static inline __ptr_t memcpy(__ptr_t __dest, __const __ptr_t __src,
 #  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[];
 
-static unsigned char *output_data;
-static unsigned long output_ptr;
+static uch *output_data;
+static ulg output_ptr;
+static ulg bytes_out;
 
 static void error(char *m);
 
 static void putstr(const char *);
 
-static unsigned long free_mem_ptr;
-static unsigned long free_mem_end_ptr;
+extern int end;
+static ulg free_mem_ptr;
+static ulg free_mem_end_ptr;
 
 #ifdef STANDALONE_DEBUG
 #define NO_INFLATE_MALLOC
@@ -233,13 +258,46 @@ static unsigned long free_mem_end_ptr;
 
 #define ARCH_HAS_DECOMP_WDOG
 
-#ifdef CONFIG_KERNEL_GZIP
-#include "../../../../lib/decompress_inflate.c"
-#endif
+#include "../../../../lib/inflate.c"
 
-#ifdef CONFIG_KERNEL_LZO
-#include "../../../../lib/decompress_unlzo.c"
-#endif
+/* ===========================================================================
+ * Fill the input buffer. This is called only when the buffer is empty
+ * and at least one byte is really needed.
+ */
+int fill_inbuf(void)
+{
+       if (insize != 0)
+               error("ran out of input data");
+
+       inbuf = input_data;
+       insize = &input_data_end[0] - &input_data[0];
+
+       inptr = 1;
+       return inbuf[0];
+}
+
+/* ===========================================================================
+ * Write the output window window[0..outcnt-1] and update crc and bytes_out.
+ * (Used for the decompressed data only.)
+ */
+void flush_window(void)
+{
+       ulg c = crc;
+       unsigned n;
+       uch *in, *out, ch;
+
+       in = window;
+       out = &output_data[output_ptr];
+       for (n = 0; n < outcnt; n++) {
+               ch = *out++ = *in++;
+               c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8);
+       }
+       crc = c;
+       bytes_out += (ulg)outcnt;
+       output_ptr += (ulg)outcnt;
+       outcnt = 0;
+       putstr(".");
+}
 
 #ifndef arch_error
 #define arch_error(x)
@@ -256,33 +314,22 @@ static void error(char *x)
        while(1);       /* Halt */
 }
 
-asmlinkage void __div0(void)
-{
-       error("Attempting division by 0!");
-}
-
 #ifndef STANDALONE_DEBUG
 
-unsigned long
-decompress_kernel(unsigned long output_start, unsigned long free_mem_ptr_p,
-               unsigned long free_mem_ptr_end_p,
-               int arch_id)
+ulg
+decompress_kernel(ulg output_start, ulg free_mem_ptr_p, ulg free_mem_ptr_end_p,
+                 int arch_id)
 {
-       unsigned char *tmp;
-
-       output_data             = (unsigned char *)output_start;
+       output_data             = (uch *)output_start;  /* Points to kernel start */
        free_mem_ptr            = free_mem_ptr_p;
        free_mem_end_ptr        = free_mem_ptr_end_p;
        __machine_arch_type     = arch_id;
 
        arch_decomp_setup();
 
-       tmp = (unsigned char *) (((unsigned long)input_data_end) - 4);
-       output_ptr = get_unaligned_le32(tmp);
-
+       makecrc();
        putstr("Uncompressing Linux...");
-       decompress(input_data, input_data_end - input_data,
-                       NULL, NULL, output_data, NULL, error);
+       gunzip();
        putstr(" done, booting the kernel.\n");
        return output_ptr;
 }
@@ -294,10 +341,11 @@ int main()
 {
        output_data = output_buffer;
 
+       makecrc();
        putstr("Uncompressing Linux...");
-       decompress(input_data, input_data_end - input_data,
-                       NULL, NULL, output_data, NULL, error);
+       gunzip();
        putstr("done.\n");
        return 0;
 }
 #endif
+       
diff --git a/arch/arm/boot/compressed/piggy.S b/arch/arm/boot/compressed/piggy.S
new file mode 100644 (file)
index 0000000..54c9518
--- /dev/null
@@ -0,0 +1,6 @@
+       .section .piggydata,#alloc
+       .globl  input_data
+input_data:
+       .incbin "arch/arm/boot/compressed/piggy.gz"
+       .globl  input_data_end
+input_data_end:
diff --git a/arch/arm/boot/compressed/piggy.gzip.S b/arch/arm/boot/compressed/piggy.gzip.S
deleted file mode 100644 (file)
index a68adf9..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-       .section .piggydata,#alloc
-       .globl  input_data
-input_data:
-       .incbin "arch/arm/boot/compressed/piggy.gzip"
-       .globl  input_data_end
-input_data_end:
diff --git a/arch/arm/boot/compressed/piggy.lzo.S b/arch/arm/boot/compressed/piggy.lzo.S
deleted file mode 100644 (file)
index a425ad9..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-       .section .piggydata,#alloc
-       .globl  input_data
-input_data:
-       .incbin "arch/arm/boot/compressed/piggy.lzo"
-       .globl  input_data_end
-input_data_end: