2009-06-24 20:32:46

by Michael Opdenacker

[permalink] [raw]
Subject: Status of bzip2 and lzma kernel compression for ARM?

Hi Alain,

I would like to test bzip2 and lzma compression on ARM.

Would you mind telling me what the status of your patches on ARM is, now
that the x86 and architecture independent code has been merged? Have
you or has anyone already updated them for 2.6.30, or shall I update
them by myself?

Thank you in advance,

Cheers,

Michael.

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


2009-06-25 08:56:57

by Mike Rapoport

[permalink] [raw]
Subject: Re: Status of bzip2 and lzma kernel compression for ARM?

Hi Michael,

Michael Opdenacker wrote:
> Hi Alain,
>
> I would like to test bzip2 and lzma compression on ARM.
>
> Would you mind telling me what the status of your patches on ARM is, now
> that the x86 and architecture independent code has been merged? Have
> you or has anyone already updated them for 2.6.30, or shall I update
> them by myself?

I'm not sure what exactly do you mean by "test bzip2 and lzma compression on
ARM", but if you refer to internal initramfs compression, I can tell that I've
used lzma compression on PXA270 and it works fine.

> Thank you in advance,
>
> Cheers,
>
> Michael.
>

--
Sincerely yours,
Mike.

2009-06-25 09:04:28

by Florian Fainelli

[permalink] [raw]
Subject: Re: Status of bzip2 and lzma kernel compression for ARM?

Hi Michael, Mike

Le Thursday 25 June 2009 10:56:45 Mike Rapoport, vous avez ?crit?:
> Hi Michael,
>
> Michael Opdenacker wrote:
> > Hi Alain,
> >
> > I would like to test bzip2 and lzma compression on ARM.
> >
> > Would you mind telling me what the status of your patches on ARM is, now
> > that the x86 and architecture independent code has been merged? Have
> > you or has anyone already updated them for 2.6.30, or shall I update
> > them by myself?
>
> I'm not sure what exactly do you mean by "test bzip2 and lzma compression
> on ARM", but if you refer to internal initramfs compression, I can tell
> that I've used lzma compression on PXA270 and it works fine.

I think Michael refers to the lzma decompressor which allows you to use a
lzma-compressed kernel as a (b)zImage with its architecture specific
decompressor piggy-backed in the (b)zImage.

Such thing would also be very useful on MIPS and PowerPC as well.
--
Best regards, Florian Fainelli
Email : [email protected]
http://openwrt.org
-------------------------------

2009-06-25 15:25:16

by Michael Opdenacker

[permalink] [raw]
Subject: Re: Status of bzip2 and lzma kernel compression for ARM?

On 06/25/2009 11:04 AM, Florian Fainelli wrote:
> Le Thursday 25 June 2009 10:56:45 Mike Rapoport, vous avez ?crit :
>> I'm not sure what exactly do you mean by "test bzip2 and lzma compression
>> on ARM", but if you refer to internal initramfs compression, I can tell
>> that I've used lzma compression on PXA270 and it works fine.
>>
>
> I think Michael refers to the lzma decompressor which allows you to use a
> lzma-compressed kernel as a (b)zImage with its architecture specific
> decompressor piggy-backed in the (b)zImage.
>
> Such thing would also be very useful on MIPS and PowerPC as well.
>
Yes, that's what I meant: using a bzip2 or lzma compressed kernel. I
would like to know the boot time impact on an ARM board.

If I don't get any answer from Alain in the next days, I will propose a
patch update for ARM.

Cheers,

Michael.

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

2009-06-25 17:09:21

by Paul Mundt

[permalink] [raw]
Subject: Re: Status of bzip2 and lzma kernel compression for ARM?

On Thu, Jun 25, 2009 at 05:24:59PM +0200, Michael Opdenacker wrote:
> On 06/25/2009 11:04 AM, Florian Fainelli wrote:
> > Le Thursday 25 June 2009 10:56:45 Mike Rapoport, vous avez ?crit :
> >> I'm not sure what exactly do you mean by "test bzip2 and lzma compression
> >> on ARM", but if you refer to internal initramfs compression, I can tell
> >> that I've used lzma compression on PXA270 and it works fine.
> >>
> >
> > I think Michael refers to the lzma decompressor which allows you to use a
> > lzma-compressed kernel as a (b)zImage with its architecture specific
> > decompressor piggy-backed in the (b)zImage.
> >
> > Such thing would also be very useful on MIPS and PowerPC as well.
> >
> Yes, that's what I meant: using a bzip2 or lzma compressed kernel. I
> would like to know the boot time impact on an ARM board.
>
> If I don't get any answer from Alain in the next days, I will propose a
> patch update for ARM.
>
It's possible to use this generically now, yes. Anything building uImages
today can basically wire it up in a similar fashion to how blackfin has
and support it out of the box.

2009-06-28 14:17:27

by Alain Knaff

[permalink] [raw]
Subject: Re: Status of bzip2 and lzma kernel compression for ARM?

Attached is a version of the ARM patch for 2.6.30

There seems to be some issues with the include files (which did not pose
any problems in 2.6.28...), but hopefully somebody more experienced with
the ARM architecture (and with its recent development) than I can help
out there.

Regards,

Alain


Attachments:
arm.2.6.30.diff (49.33 kB)

2009-06-28 14:48:26

by Alain Knaff

[permalink] [raw]
Subject: Re: Status of bzip2 and lzma kernel compression for ARM?

Alain Knaff wrote:
> Attached is a version of the ARM patch for 2.6.30
>
> There seems to be some issues with the include files (which did not pose
> any problems in 2.6.28...), but hopefully somebody more experienced with
> the ARM architecture (and with its recent development) than I can help
> out there.
>
> Regards,
>
> Alain

Actually, the needed changes turned out to be easier than I initially
feared. Attached a version that compiles all right.

Regards,

Alain


Attachments:
arm.2.6.30.diff (13.32 kB)

2009-06-29 12:22:20

by Mike Rapoport

[permalink] [raw]
Subject: Re: Status of bzip2 and lzma kernel compression for ARM?



Alain Knaff wrote:
> Alain Knaff wrote:
>> Attached is a version of the ARM patch for 2.6.30
>>
>> There seems to be some issues with the include files (which did not pose
>> any problems in 2.6.28...), but hopefully somebody more experienced with
>> the ARM architecture (and with its recent development) than I can help
>> out there.
>>
>> Regards,
>>
>> Alain
>
> Actually, the needed changes turned out to be easier than I initially
> feared. Attached a version that compiles all right.

I gave it a quick test and it hangs before "Decompressing kernel" is output.
I hope I'll have time this week to debug what's wrong there.

> Regards,
>
> Alain
>

--
Sincerely yours,
Mike.

2009-06-29 16:40:18

by Michael Opdenacker

[permalink] [raw]
Subject: Re: Status of bzip2 and lzma kernel compression for ARM?

On 06/29/2009 02:21 PM, Mike Rapoport wrote:
> Alain Knaff wrote:
>
>> Alain Knaff wrote:
>>
>>> Attached is a version of the ARM patch for 2.6.30
>>>
>>> There seems to be some issues with the include files (which did not pose
>>> any problems in 2.6.28...), but hopefully somebody more experienced with
>>> the ARM architecture (and with its recent development) than I can help
>>> out there.
>>>
>>> Regards,
>>>
>>> Alain
>>>
>> Actually, the needed changes turned out to be easier than I initially
>> feared. Attached a version that compiles all right.
>>
>
> I gave it a quick test and it hangs before "Decompressing kernel" is output.
> I hope I'll have time this week to debug what's wrong there.
>
Same here. I compiled 3 kernels with each option with no problem, but
none goes beyond the "Uncompressing Linux.." message. I am using a CALAO
USB-A9263 board with the AT91SAM9263 chip.

This means that even zlib compression is broken with this patch.

I hope I can work on this too.

Thanks anyway!

Cheers,

Michael.

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

2009-07-03 15:53:21

by Albin Tonnerre

[permalink] [raw]
Subject: Re: Status of bzip2 and lzma kernel compression for ARM?

On Mon, Jun 29, 2009 at 03:21:45PM +0300, Mike Rapoport wrote :
>
>
> Alain Knaff wrote:
> > Alain Knaff wrote:
> >> Attached is a version of the ARM patch for 2.6.30
> >>
> >> There seems to be some issues with the include files (which did not pose
> >> any problems in 2.6.28...), but hopefully somebody more experienced with
> >> the ARM architecture (and with its recent development) than I can help
> >> out there.
> >>
> >> Regards,
> >>
> >> Alain
> >
> > Actually, the needed changes turned out to be easier than I initially
> > feared. Attached a version that compiles all right.
>
> I gave it a quick test and it hangs before "Decompressing kernel" is output.
> I hope I'll have time this week to debug what's wrong there.

On my testing board, it hangs after "Decompressing kernel" is output. It seems
that it's getting stuck in the following piece of code in lib/decompressor_lzma.c

while (get_pos(&wr) < header.dst_size) {
int pos_state = get_pos(&wr) & pos_state_mask;
uint16_t *prob = p + LZMA_IS_MATCH +
(cst.state << LZMA_NUM_POS_BITS_MAX) + pos_state;
if (rc_is_bit_0(&rc, prob))
process_bit0(&wr, &rc, &cst, p, pos_state, prob,
lc, literal_pos_mask);
else {
process_bit1(&wr, &rc, &cst, p, pos_state, prob);
if (cst.rep0 == 0)
break;
}
}

Based on some quick tests, it seems that header.dst_size is 0xFFFFFFFFFFFFFFFF,
and if my understanding is correct, it's because LZMA doesn't write the file
size in the header if it reads its input from a pipe, and piggy.lzma turns out
to be created using a pipe.

Replacing cmd_lzma in scripts/Makefile.lib by the following snippet:

cmd_lzma = (lzma -9 -c $(filter-out FORCE, $^) > $@ && $(call size_append, $(filter-out FORCE,$^)) >> $@ ) || (rm -f $@ ; false)

does the trick, as lzma is able to write the file size in the header (and I
think the second part is useless, as it's the filesize encoded in 32bits
little-endian). However, it now hangs right after the 'done, booting the
kernel.'

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

2009-07-13 19:17:57

by Albin Tonnerre

[permalink] [raw]
Subject: Re: Status of bzip2 and lzma kernel compression for ARM?

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_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);}
-# define Trace(x) fprintf x
-# define Tracev(x) {if (verbose) fprintf x ;}
-# define Tracevv(x) {if (verbose>1) fprintf x ;}
-# define Tracec(c,x) {if (verbose && (c)) fprintf x ;}
-# define Tracecv(c,x) {if (verbose>1 && (c)) fprintf x ;}
-#else
-# define Assert(cond,msg)
-# define Trace(x)
-# define Tracev(x)
-# define Tracevv(x)
-# define Tracec(c,x)
-# 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 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;
+#define ARCH_HAS_DECOMP_WDOG

-#ifdef STANDALONE_DEBUG
-#define NO_INFLATE_MALLOC
+#ifdef CONFIG_KERNEL_GZIP
+#include "../../../../lib/decompress_inflate.c"
#endif

-#define ARCH_HAS_DECOMP_WDOG
-
-#include "../../../../lib/inflate.c"
+#ifdef CONFIG_KERNEL_BZIP2
+#include "../../../../lib/decompress_bunzip2.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");
+#ifdef CONFIG_KERNEL_LZMA
+#include "../../../../lib/decompress_unlzma.c"
+#endif

- 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)
@@ -317,20 +238,37 @@ static void error(char *x)

#ifndef STANDALONE_DEBUG

-ulg
-decompress_kernel(ulg output_start, ulg free_mem_ptr_p, ulg free_mem_ptr_end_p,
+unsigned long
+decompress_kernel(unsigned long output_start,
+ unsigned long free_mem_ptr_p,
+ unsigned long free_mem_ptr_end_p,
int arch_id)
{
- 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;
+ unsigned long output_ptr;
+ char *ptr;
+ size_t input_len = input_data_end - input_data;
+ size_t pos = 0;
+
__machine_arch_type = arch_id;

arch_decomp_setup();

- makecrc();
- putstr("Uncompressing Linux...");
- gunzip();
+ ptr = (unsigned char *) (((unsigned long)input_data_end) - 4);
+
+ /* The uncompressed size is appended at the end of the compressed file, but
+ * we have no guarantee that it's 2-bytes aligned. Therefore, use a char *
+ * to get the size. At least on my box, trying to access a non 2-bytes
+ * aligned unsigned long resulted in some weirdness
+ */
+
+ output_ptr = ptr[0] | ptr[1] << 8 | ptr[2] << 16 | ptr[3] << 24;
+
+ free_mem_ptr = free_mem_ptr_p;
+ free_mem_end_ptr = free_mem_ptr_end_p;
+
+ putstr("Decompressing Linux...");
+ decompress(input_data, input_len,
+ NULL, NULL, (unsigned char *) output_start, &pos, error);
putstr(" done, booting the kernel.\n");
return output_ptr;
}
@@ -340,11 +278,8 @@ char output_buffer[1500*1024];

int main()
{
- output_data = output_buffer;
-
- makecrc();
putstr("Uncompressing Linux...");
- gunzip();
+ decompress(input_data, input_len, NULL, output_buffer, NULL);
putstr("done.\n");
return 0;
}
diff --git a/arch/arm/boot/compressed/piggy.S b/arch/arm/boot/compressed/piggy.S
deleted file mode 100644
index 54c9518..0000000
--- a/arch/arm/boot/compressed/piggy.S
+++ /dev/null
@@ -1,6 +0,0 @@
- .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.bz2.S b/arch/arm/boot/compressed/piggy.bz2.S
new file mode 100644
index 0000000..c5ecbde
--- /dev/null
+++ b/arch/arm/boot/compressed/piggy.bz2.S
@@ -0,0 +1,6 @@
+ .section .piggydata,#alloc
+ .globl input_data
+input_data:
+ .incbin "arch/arm/boot/compressed/piggy.bz2"
+ .globl input_data_end
+input_data_end:
diff --git a/arch/arm/boot/compressed/piggy.gz.S b/arch/arm/boot/compressed/piggy.gz.S
new file mode 100644
index 0000000..54c9518
--- /dev/null
+++ b/arch/arm/boot/compressed/piggy.gz.S
@@ -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.lzma.S b/arch/arm/boot/compressed/piggy.lzma.S
new file mode 100644
index 0000000..d7e69cf
--- /dev/null
+++ b/arch/arm/boot/compressed/piggy.lzma.S
@@ -0,0 +1,6 @@
+ .section .piggydata,#alloc
+ .globl input_data
+input_data:
+ .incbin "arch/arm/boot/compressed/piggy.lzma"
+ .globl input_data_end
+input_data_end:
diff --git a/arch/arm/boot/uImage.lzma b/arch/arm/boot/uImage.lzma
new file mode 100644
index 0000000..4fb24eb
Binary files /dev/null and b/arch/arm/boot/uImage.lzma differ
diff --git a/include/linux/decompress/mm.h b/include/linux/decompress/mm.h
index 12ff8c3..8becfce 100644
--- a/include/linux/decompress/mm.h
+++ b/include/linux/decompress/mm.h
@@ -64,6 +64,8 @@ static void free(void *where)
#include <linux/string.h>
#include <linux/vmalloc.h>

+#include <linux/slab.h>
+
/* Use defines rather than static inline in order to avoid spurious
* warnings when not needed (indeed large_malloc / large_free are not
* needed by inflate */
diff --git a/include/linux/zutil.h b/include/linux/zutil.h
index 6adfa9a..bedd56b 100644
--- a/include/linux/zutil.h
+++ b/include/linux/zutil.h
@@ -60,6 +60,19 @@ typedef uLong (*check_func) (uLong check, const Byte *buf,
#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4);
#define DO16(buf) DO8(buf,0); DO8(buf,8);

+#ifdef NO_DIVISION
+static inline unsigned long mod65521(unsigned long s)
+{
+ while (1) {
+ if (s < BASE)
+ return s;
+ if (s < 0x10000)
+ return s-BASE;
+ s = (s & 0xffff) + 15 * (s >> 16);
+ }
+}
+#endif
+
/* ========================================================================= */
/*
Update a running Adler-32 checksum with the bytes buf[0..len-1] and
@@ -97,8 +110,13 @@ static inline uLong zlib_adler32(uLong adler,
s1 += *buf++;
s2 += s1;
} while (--k);
+#ifdef NO_DIVISION
+ s1 = mod65521(s1);
+ s2 = mod65521(s2);
+#else
s1 %= BASE;
s2 %= BASE;
+#endif
}
return (s2 << 16) | s1;
}
diff --git a/lib/decompress_bunzip2.c b/lib/decompress_bunzip2.c
index 708e2a8..5d3ddb5 100644
--- a/lib/decompress_bunzip2.c
+++ b/lib/decompress_bunzip2.c
@@ -50,7 +50,6 @@
#endif /* !STATIC */

#include <linux/decompress/mm.h>
-#include <linux/slab.h>

#ifndef INT_MAX
#define INT_MAX 0x7fffffff
diff --git a/lib/decompress_inflate.c b/lib/decompress_inflate.c
index e36b296..839a329 100644
--- a/lib/decompress_inflate.c
+++ b/lib/decompress_inflate.c
@@ -23,7 +23,6 @@
#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..546f2f4 100644
--- a/lib/decompress_unlzma.c
+++ b/lib/decompress_unlzma.c
@@ -34,7 +34,6 @@
#endif /* STATIC */

#include <linux/decompress/mm.h>
-#include <linux/slab.h>

#define MIN(a, b) (((a) < (b)) ? (a) : (b))

diff --git a/lib/zlib_inflate/inflate.c b/lib/zlib_inflate/inflate.c
index f5ce87b..566bf1e 100644
--- a/lib/zlib_inflate/inflate.c
+++ b/lib/zlib_inflate/inflate.c
@@ -247,6 +247,23 @@ static int zlib_inflateSyncPacket(z_streamp strm)
((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \
(((q) & 0xff00) << 8) + (((q) & 0xff) << 24))

+#ifdef NO_DIVISION
+/*
+ modulo 15 routine for those architectures that don't have division
+*/
+static inline unsigned long mod31(unsigned long s)
+{
+ while (1) {
+ if (s < 31)
+ return s;
+ if (s < 32)
+ return 0;
+ s = (s >> 5) + (s & 31);
+ }
+}
+#endif
+
+
/*
inflate() uses a state machine to process as much input data and generate as
much output data as possible before returning. The state machine is
@@ -370,7 +387,12 @@ int zlib_inflate(z_streamp strm, int flush)
}
NEEDBITS(16);
if (
- ((BITS(8) << 8) + (hold >> 8)) % 31) {
+#ifdef NO_DIVISION
+ mod31((BITS(8) << 8) + (hold >> 8))
+#else
+ ((BITS(8) << 8) + (hold >> 8)) % 31
+#endif
+ ) {
strm->msg = (char *)"incorrect header check";
state->mode = BAD;
break;

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