summaryrefslogtreecommitdiff
path: root/linux/linux-mtx-1-2.4.24/04-zboot-2.4.24.patch
diff options
context:
space:
mode:
Diffstat (limited to 'linux/linux-mtx-1-2.4.24/04-zboot-2.4.24.patch')
-rw-r--r--linux/linux-mtx-1-2.4.24/04-zboot-2.4.24.patch5286
1 files changed, 0 insertions, 5286 deletions
diff --git a/linux/linux-mtx-1-2.4.24/04-zboot-2.4.24.patch b/linux/linux-mtx-1-2.4.24/04-zboot-2.4.24.patch
deleted file mode 100644
index 85f5fc3aa3..0000000000
--- a/linux/linux-mtx-1-2.4.24/04-zboot-2.4.24.patch
+++ /dev/null
@@ -1,5286 +0,0 @@
-diff -Naru linux/arch/mips/Makefile linux-new/arch/mips/Makefile
---- linux/arch/mips/Makefile 2003-10-22 02:58:37.000000000 -0400
-+++ linux-new/arch/mips/Makefile 2003-12-18 14:26:20.000000000 -0500
-@@ -724,15 +724,21 @@
- endif
-
- MAKEBOOT = $(MAKE) -C arch/$(ARCH)/boot
-+MAKEZBOOT = $(MAKE) -C arch/$(ARCH)/zboot
-+BOOT_TARGETS = zImage zImage.initrd zImage.flash
-
- vmlinux.ecoff: vmlinux
- @$(MAKEBOOT) $@
-
-+ $(BOOT_TARGETS): vmlinux
-+ @$(MAKEZBOOT) $@
-+
- vmlinux.srec: vmlinux
- @$(MAKEBOOT) $@
-
- archclean:
- @$(MAKEBOOT) clean
-+ @$(MAKEZBOOT) clean
- rm -f arch/$(ARCH)/ld.script
- $(MAKE) -C arch/$(ARCH)/tools clean
- $(MAKE) -C arch/mips/baget clean
-diff -Naru linux/arch/mips/zboot/common/au1k_uart.c linux-new/arch/mips/zboot/common/au1k_uart.c
---- linux/arch/mips/zboot/common/au1k_uart.c 1969-12-31 19:00:00.000000000 -0500
-+++ linux-new/arch/mips/zboot/common/au1k_uart.c 2003-12-18 14:26:20.000000000 -0500
-@@ -0,0 +1,103 @@
-+/*
-+ * BRIEF MODULE DESCRIPTION
-+ * Simple Au1000 uart routines.
-+ *
-+ * Copyright 2001 MontaVista Software Inc.
-+ * Author: MontaVista Software, Inc.
-+ * ppopov@mvista.com or source@mvista.com
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * 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 SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
-+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
-+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ *
-+ * You should have received a copy of the GNU General Public License along
-+ * with this program; if not, write to the Free Software Foundation, Inc.,
-+ * 675 Mass Ave, Cambridge, MA 02139, USA.
-+ */
-+#include <linux/config.h>
-+#include <asm/io.h>
-+#include <asm/au1000.h>
-+#include "ns16550.h"
-+
-+typedef unsigned char uint8;
-+typedef unsigned int uint32;
-+
-+#define UART16550_BAUD_2400 2400
-+#define UART16550_BAUD_4800 4800
-+#define UART16550_BAUD_9600 9600
-+#define UART16550_BAUD_19200 19200
-+#define UART16550_BAUD_38400 38400
-+#define UART16550_BAUD_57600 57600
-+#define UART16550_BAUD_115200 115200
-+
-+#define UART16550_PARITY_NONE 0
-+#define UART16550_PARITY_ODD 0x08
-+#define UART16550_PARITY_EVEN 0x18
-+#define UART16550_PARITY_MARK 0x28
-+#define UART16550_PARITY_SPACE 0x38
-+
-+#define UART16550_DATA_5BIT 0x0
-+#define UART16550_DATA_6BIT 0x1
-+#define UART16550_DATA_7BIT 0x2
-+#define UART16550_DATA_8BIT 0x3
-+
-+#define UART16550_STOP_1BIT 0x0
-+#define UART16550_STOP_2BIT 0x4
-+
-+/* It would be nice if we had a better way to do this.
-+ * It could be a variable defined in one of the board specific files.
-+ */
-+#undef UART_BASE
-+#ifdef CONFIG_COGENT_CSB250
-+#define UART_BASE UART3_ADDR
-+#else
-+#define UART_BASE UART0_ADDR
-+#endif
-+
-+/* memory-mapped read/write of the port */
-+#define UART16550_READ(y) (readl(UART_BASE + y) & 0xff)
-+#define UART16550_WRITE(y,z) (writel(z&0xff, UART_BASE + y))
-+
-+/*
-+ * We use uart 0, which is already initialized by
-+ * yamon.
-+ */
-+volatile struct NS16550 *
-+serial_init(int chan)
-+{
-+ volatile struct NS16550 *com_port;
-+ com_port = (struct NS16550 *) UART_BASE;
-+ return (com_port);
-+}
-+
-+void
-+serial_putc(volatile struct NS16550 *com_port, unsigned char c)
-+{
-+ while ((UART16550_READ(UART_LSR)&0x40) == 0);
-+ UART16550_WRITE(UART_TX, c);
-+}
-+
-+unsigned char
-+serial_getc(volatile struct NS16550 *com_port)
-+{
-+ while((UART16550_READ(UART_LSR) & 0x1) == 0);
-+ return UART16550_READ(UART_RX);
-+}
-+
-+int
-+serial_tstc(volatile struct NS16550 *com_port)
-+{
-+ return((UART16550_READ(UART_LSR) & LSR_DR) != 0);
-+}
-diff -Naru linux/arch/mips/zboot/common/ctype.c linux-new/arch/mips/zboot/common/ctype.c
---- linux/arch/mips/zboot/common/ctype.c 1969-12-31 19:00:00.000000000 -0500
-+++ linux-new/arch/mips/zboot/common/ctype.c 2003-12-18 14:26:20.000000000 -0500
-@@ -0,0 +1,35 @@
-+/*
-+ * linux/lib/ctype.c
-+ *
-+ * Copyright (C) 1991, 1992 Linus Torvalds
-+ */
-+
-+#include <linux/ctype.h>
-+
-+unsigned char _ctype[] = {
-+_C,_C,_C,_C,_C,_C,_C,_C, /* 0-7 */
-+_C,_C|_S,_C|_S,_C|_S,_C|_S,_C|_S,_C,_C, /* 8-15 */
-+_C,_C,_C,_C,_C,_C,_C,_C, /* 16-23 */
-+_C,_C,_C,_C,_C,_C,_C,_C, /* 24-31 */
-+_S|_SP,_P,_P,_P,_P,_P,_P,_P, /* 32-39 */
-+_P,_P,_P,_P,_P,_P,_P,_P, /* 40-47 */
-+_D,_D,_D,_D,_D,_D,_D,_D, /* 48-55 */
-+_D,_D,_P,_P,_P,_P,_P,_P, /* 56-63 */
-+_P,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U, /* 64-71 */
-+_U,_U,_U,_U,_U,_U,_U,_U, /* 72-79 */
-+_U,_U,_U,_U,_U,_U,_U,_U, /* 80-87 */
-+_U,_U,_U,_P,_P,_P,_P,_P, /* 88-95 */
-+_P,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L, /* 96-103 */
-+_L,_L,_L,_L,_L,_L,_L,_L, /* 104-111 */
-+_L,_L,_L,_L,_L,_L,_L,_L, /* 112-119 */
-+_L,_L,_L,_P,_P,_P,_P,_C, /* 120-127 */
-+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 128-143 */
-+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 144-159 */
-+_S|_SP,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P, /* 160-175 */
-+_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P, /* 176-191 */
-+_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U, /* 192-207 */
-+_U,_U,_U,_U,_U,_U,_U,_P,_U,_U,_U,_U,_U,_U,_U,_L, /* 208-223 */
-+_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L, /* 224-239 */
-+_L,_L,_L,_L,_L,_L,_L,_P,_L,_L,_L,_L,_L,_L,_L,_L}; /* 240-255 */
-+
-+
-diff -Naru linux/arch/mips/zboot/common/dummy.c linux-new/arch/mips/zboot/common/dummy.c
---- linux/arch/mips/zboot/common/dummy.c 1969-12-31 19:00:00.000000000 -0500
-+++ linux-new/arch/mips/zboot/common/dummy.c 2003-12-18 14:26:20.000000000 -0500
-@@ -0,0 +1,4 @@
-+int main(void)
-+{
-+ return 0;
-+}
-diff -Naru linux/arch/mips/zboot/common/Makefile linux-new/arch/mips/zboot/common/Makefile
---- linux/arch/mips/zboot/common/Makefile 1969-12-31 19:00:00.000000000 -0500
-+++ linux-new/arch/mips/zboot/common/Makefile 2003-12-18 14:26:20.000000000 -0500
-@@ -0,0 +1,27 @@
-+#
-+# arch/mips/zboot/common/Makefile
-+#
-+# This file is subject to the terms and conditions of the GNU General Public
-+# License. See the file "COPYING" in the main directory of this archive
-+# for more details.
-+#
-+# Tom Rini January 2001
-+#
-+
-+.c.s:
-+ $(CC) $(CFLAGS) -S -o $*.s $<
-+.s.o:
-+ $(AS) -o $*.o $<
-+.c.o:
-+ $(CC) $(CFLAGS) -c -o $*.o $<
-+.S.s:
-+ $(CPP) $(AFLAGS) -o $*.o $<
-+.S.o:
-+ $(CC) $(AFLAGS) -c -o $*.o $<
-+
-+clean:
-+ rm -rf *.o
-+
-+OBJCOPY_ARGS = -O elf32-tradlittlemips
-+
-+include $(TOPDIR)/Rules.make
-diff -Naru linux/arch/mips/zboot/common/misc-common.c linux-new/arch/mips/zboot/common/misc-common.c
---- linux/arch/mips/zboot/common/misc-common.c 1969-12-31 19:00:00.000000000 -0500
-+++ linux-new/arch/mips/zboot/common/misc-common.c 2003-12-18 14:26:20.000000000 -0500
-@@ -0,0 +1,437 @@
-+/*
-+ * arch/mips/zboot/common/misc-common.c
-+ *
-+ * Misc. bootloader code (almost) all platforms can use
-+ *
-+ * Author: Johnnie Peters <jpeters@mvista.com>
-+ * Editor: Tom Rini <trini@mvista.com>
-+ *
-+ * Derived from arch/ppc/boot/prep/misc.c
-+ *
-+ * Ported by Pete Popov <ppopov@mvista.com> to
-+ * support mips board(s). I also got rid of the vga console
-+ * code.
-+ *
-+ * Copyright 2000-2001 MontaVista Software Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * 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 SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
-+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
-+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ *
-+ * You should have received a copy of the GNU General Public License along
-+ * with this program; if not, write to the Free Software Foundation, Inc.,
-+ * 675 Mass Ave, Cambridge, MA 02139, USA.
-+ */
-+
-+#include <linux/config.h>
-+#include "zlib.h"
-+#include <stdarg.h>
-+
-+extern char *avail_ram;
-+extern char *end_avail;
-+extern char _end[];
-+
-+void puts(const char *);
-+void putc(const char c);
-+void puthex(unsigned long val);
-+void _bcopy(char *src, char *dst, int len);
-+void gunzip(void *, int, unsigned char *, int *);
-+static int _cvt(unsigned long val, char *buf, long radix, char *digits);
-+
-+void _vprintk(void(*)(const char), const char *, va_list ap);
-+
-+struct NS16550 *com_port;
-+
-+int serial_tstc(volatile struct NS16550 *);
-+unsigned char serial_getc(volatile struct NS16550 *);
-+void serial_putc(volatile struct NS16550 *, unsigned char);
-+
-+void pause(void)
-+{
-+ puts("pause\n");
-+}
-+
-+void exit(void)
-+{
-+ puts("exit\n");
-+ while(1);
-+}
-+
-+int tstc(void)
-+{
-+ return (serial_tstc(com_port));
-+}
-+
-+int getc(void)
-+{
-+ while (1) {
-+ if (serial_tstc(com_port))
-+ return (serial_getc(com_port));
-+ }
-+}
-+
-+void
-+putc(const char c)
-+{
-+ int x,y;
-+
-+ serial_putc(com_port, c);
-+ if ( c == '\n' )
-+ serial_putc(com_port, '\r');
-+}
-+
-+void puts(const char *s)
-+{
-+ char c;
-+ while ( ( c = *s++ ) != '\0' ) {
-+ serial_putc(com_port, c);
-+ if ( c == '\n' ) serial_putc(com_port, '\r');
-+ }
-+}
-+
-+void error(char *x)
-+{
-+ puts("\n\n");
-+ puts(x);
-+ puts("\n\n -- System halted");
-+
-+ while(1); /* Halt */
-+}
-+
-+void *zalloc(void *x, unsigned items, unsigned size)
-+{
-+ void *p = avail_ram;
-+
-+ size *= items;
-+ size = (size + 7) & -8;
-+ avail_ram += size;
-+ if (avail_ram > end_avail) {
-+ puts("oops... out of memory\n");
-+ pause();
-+ }
-+ return p;
-+}
-+
-+void zfree(void *x, void *addr, unsigned nb)
-+{
-+}
-+
-+#define HEAD_CRC 2
-+#define EXTRA_FIELD 4
-+#define ORIG_NAME 8
-+#define COMMENT 0x10
-+#define RESERVED 0xe0
-+
-+#define DEFLATED 8
-+
-+void gunzip(void *dst, int dstlen, unsigned char *src, int *lenp)
-+{
-+ z_stream s;
-+ int r, i, flags;
-+
-+ /* skip header */
-+ i = 10;
-+ flags = src[3];
-+ if (src[2] != DEFLATED || (flags & RESERVED) != 0) {
-+ puts("bad gzipped data\n");
-+ exit();
-+ }
-+ if ((flags & EXTRA_FIELD) != 0)
-+ i = 12 + src[10] + (src[11] << 8);
-+ if ((flags & ORIG_NAME) != 0)
-+ while (src[i++] != 0)
-+ ;
-+ if ((flags & COMMENT) != 0)
-+ while (src[i++] != 0)
-+ ;
-+ if ((flags & HEAD_CRC) != 0)
-+ i += 2;
-+ if (i >= *lenp) {
-+ puts("gunzip: ran out of data in header\n");
-+ exit();
-+ }
-+
-+ s.zalloc = zalloc;
-+ s.zfree = zfree;
-+ r = inflateInit2(&s, -MAX_WBITS);
-+ if (r != Z_OK) {
-+ puts("inflateInit2 returned %d\n");
-+ exit();
-+ }
-+ s.next_in = src + i;
-+ s.avail_in = *lenp - i;
-+ s.next_out = dst;
-+ s.avail_out = dstlen;
-+ r = inflate(&s, Z_FINISH);
-+ if (r != Z_OK && r != Z_STREAM_END) {
-+ puts("inflate returned %d\n");
-+ exit();
-+ }
-+ *lenp = s.next_out - (unsigned char *) dst;
-+ inflateEnd(&s);
-+}
-+
-+void
-+puthex(unsigned long val)
-+{
-+
-+ unsigned char buf[10];
-+ int i;
-+ for (i = 7; i >= 0; i--)
-+ {
-+ buf[i] = "0123456789ABCDEF"[val & 0x0F];
-+ val >>= 4;
-+ }
-+ buf[8] = '\0';
-+ puts(buf);
-+}
-+
-+#define FALSE 0
-+#define TRUE 1
-+
-+void
-+_printk(char const *fmt, ...)
-+{
-+ va_list ap;
-+
-+ va_start(ap, fmt);
-+ _vprintk(putc, fmt, ap);
-+ va_end(ap);
-+ return;
-+}
-+
-+#define is_digit(c) ((c >= '0') && (c <= '9'))
-+
-+void
-+_vprintk(void(*putc)(const char), const char *fmt0, va_list ap)
-+{
-+ char c, sign, *cp = 0;
-+ int left_prec, right_prec, zero_fill, length = 0, pad, pad_on_right;
-+ char buf[32];
-+ long val;
-+ while ((c = *fmt0++))
-+ {
-+ if (c == '%')
-+ {
-+ c = *fmt0++;
-+ left_prec = right_prec = pad_on_right = 0;
-+ if (c == '-')
-+ {
-+ c = *fmt0++;
-+ pad_on_right++;
-+ }
-+ if (c == '0')
-+ {
-+ zero_fill = TRUE;
-+ c = *fmt0++;
-+ } else
-+ {
-+ zero_fill = FALSE;
-+ }
-+ while (is_digit(c))
-+ {
-+ left_prec = (left_prec * 10) + (c - '0');
-+ c = *fmt0++;
-+ }
-+ if (c == '.')
-+ {
-+ c = *fmt0++;
-+ zero_fill++;
-+ while (is_digit(c))
-+ {
-+ right_prec = (right_prec * 10) + (c - '0');
-+ c = *fmt0++;
-+ }
-+ } else
-+ {
-+ right_prec = left_prec;
-+ }
-+ sign = '\0';
-+ switch (c)
-+ {
-+ case 'd':
-+ case 'x':
-+ case 'X':
-+ val = va_arg(ap, long);
-+ switch (c)
-+ {
-+ case 'd':
-+ if (val < 0)
-+ {
-+ sign = '-';
-+ val = -val;
-+ }
-+ length = _cvt(val, buf, 10, "0123456789");
-+ break;
-+ case 'x':
-+ length = _cvt(val, buf, 16, "0123456789abcdef");
-+ break;
-+ case 'X':
-+ length = _cvt(val, buf, 16, "0123456789ABCDEF");
-+ break;
-+ }
-+ cp = buf;
-+ break;
-+ case 's':
-+ cp = va_arg(ap, char *);
-+ length = strlen(cp);
-+ break;
-+ case 'c':
-+ c = va_arg(ap, long /*char*/);
-+ (*putc)(c);
-+ continue;
-+ default:
-+ (*putc)('?');
-+ }
-+ pad = left_prec - length;
-+ if (sign != '\0')
-+ {
-+ pad--;
-+ }
-+ if (zero_fill)
-+ {
-+ c = '0';
-+ if (sign != '\0')
-+ {
-+ (*putc)(sign);
-+ sign = '\0';
-+ }
-+ } else
-+ {
-+ c = ' ';
-+ }
-+ if (!pad_on_right)
-+ {
-+ while (pad-- > 0)
-+ {
-+ (*putc)(c);
-+ }
-+ }
-+ if (sign != '\0')
-+ {
-+ (*putc)(sign);
-+ }
-+ while (length-- > 0)
-+ {
-+ (*putc)(c = *cp++);
-+ if (c == '\n')
-+ {
-+ (*putc)('\r');
-+ }
-+ }
-+ if (pad_on_right)
-+ {
-+ while (pad-- > 0)
-+ {
-+ (*putc)(c);
-+ }
-+ }
-+ } else
-+ {
-+ (*putc)(c);
-+ if (c == '\n')
-+ {
-+ (*putc)('\r');
-+ }
-+ }
-+ }
-+}
-+
-+int
-+_cvt(unsigned long val, char *buf, long radix, char *digits)
-+{
-+ char temp[80];
-+ char *cp = temp;
-+ int length = 0;
-+ if (val == 0)
-+ { /* Special case */
-+ *cp++ = '0';
-+ } else
-+ while (val)
-+ {
-+ *cp++ = digits[val % radix];
-+ val /= radix;
-+ }
-+ while (cp != temp)
-+ {
-+ *buf++ = *--cp;
-+ length++;
-+ }
-+ *buf = '\0';
-+ return (length);
-+}
-+
-+void
-+_dump_buf_with_offset(unsigned char *p, int s, unsigned char *base)
-+{
-+ int i, c;
-+ if ((unsigned int)s > (unsigned int)p)
-+ {
-+ s = (unsigned int)s - (unsigned int)p;
-+ }
-+ while (s > 0)
-+ {
-+ if (base)
-+ {
-+ _printk("%06X: ", (int)p - (int)base);
-+ } else
-+ {
-+ _printk("%06X: ", p);
-+ }
-+ for (i = 0; i < 16; i++)
-+ {
-+ if (i < s)
-+ {
-+ _printk("%02X", p[i] & 0xFF);
-+ } else
-+ {
-+ _printk(" ");
-+ }
-+ if ((i % 2) == 1) _printk(" ");
-+ if ((i % 8) == 7) _printk(" ");
-+ }
-+ _printk(" |");
-+ for (i = 0; i < 16; i++)
-+ {
-+ if (i < s)
-+ {
-+ c = p[i] & 0xFF;
-+ if ((c < 0x20) || (c >= 0x7F)) c = '.';
-+ } else
-+ {
-+ c = ' ';
-+ }
-+ _printk("%c", c);
-+ }
-+ _printk("|\n");
-+ s -= 16;
-+ p += 16;
-+ }
-+}
-+
-+void
-+_dump_buf(unsigned char *p, int s)
-+{
-+ _printk("\n");
-+ _dump_buf_with_offset(p, s, 0);
-+}
-+
-+/*
-+ * Local variables:
-+ * c-indent-level: 8
-+ * c-basic-offset: 8
-+ * tab-width: 8
-+ * End:
-+ */
-diff -Naru linux/arch/mips/zboot/common/misc-simple.c linux-new/arch/mips/zboot/common/misc-simple.c
---- linux/arch/mips/zboot/common/misc-simple.c 1969-12-31 19:00:00.000000000 -0500
-+++ linux-new/arch/mips/zboot/common/misc-simple.c 2003-12-18 14:26:20.000000000 -0500
-@@ -0,0 +1,127 @@
-+/*
-+ * arch/mips/zboot/common/misc-simple.c
-+ *
-+ * Misc. bootloader code for many machines. This assumes you have are using
-+ * a 6xx/7xx/74xx CPU in your machine. This assumes the chunk of memory
-+ * below 8MB is free. Finally, it assumes you have a NS16550-style uart for
-+ * your serial console. If a machine meets these requirements, it can quite
-+ * likely use this code during boot.
-+ *
-+ * Author: Matt Porter <mporter@mvista.com>
-+ * Derived from arch/ppc/boot/prep/misc.c
-+ *
-+ * Copyright 2001 MontaVista Software Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * 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.
-+ */
-+
-+#include <linux/types.h>
-+#include <linux/elf.h>
-+#include <linux/config.h>
-+
-+#include <asm/page.h>
-+#include <asm/processor.h>
-+#include <asm/mmu.h>
-+
-+#include "zlib.h"
-+
-+extern struct NS16550 *com_port;
-+
-+char *avail_ram;
-+char *end_avail;
-+extern char _end[];
-+char *zimage_start;
-+
-+#ifdef CONFIG_CMDLINE
-+#define CMDLINE CONFIG_CMDLINE
-+#else
-+#define CMDLINE ""
-+#endif
-+char cmd_preset[] = CMDLINE;
-+char cmd_buf[256];
-+char *cmd_line = cmd_buf;
-+
-+/* The linker tells us where the image is.
-+*/
-+extern unsigned char __image_begin, __image_end;
-+extern unsigned char __ramdisk_begin, __ramdisk_end;
-+unsigned long initrd_size;
-+
-+extern void puts(const char *);
-+extern void putc(const char c);
-+extern void puthex(unsigned long val);
-+extern void *memcpy(void * __dest, __const void * __src,
-+ __kernel_size_t __n);
-+extern void gunzip(void *, int, unsigned char *, int *);
-+extern void udelay(long delay);
-+extern int tstc(void);
-+extern int getc(void);
-+extern volatile struct NS16550 *serial_init(int chan);
-+
-+void
-+decompress_kernel(unsigned long load_addr, int num_words,
-+ unsigned long cksum, unsigned long *sp)
-+{
-+ int timer = 0;
-+ extern unsigned long start;
-+ char *cp, ch;
-+ int i;
-+ int zimage_size;
-+
-+ com_port = (struct NS16550 *)serial_init(0);
-+
-+ initrd_size = (unsigned long)(&__ramdisk_end) -
-+ (unsigned long)(&__ramdisk_begin);
-+
-+ /*
-+ * Reveal where we were loaded at and where we
-+ * were relocated to.
-+ */
-+ puts("loaded at: "); puthex(load_addr);
-+ puts(" "); puthex((unsigned long)(load_addr + (4*num_words))); puts("\n");
-+ if ( (unsigned long)load_addr != (unsigned long)&start )
-+ {
-+ puts("relocated to: "); puthex((unsigned long)&start);
-+ puts(" ");
-+ puthex((unsigned long)((unsigned long)&start + (4*num_words)));
-+ puts("\n");
-+ }
-+
-+ /*
-+ * We link ourself to an arbitrary low address. When we run, we
-+ * relocate outself to that address. __image_being points to
-+ * the part of the image where the zImage is. -- Tom
-+ */
-+ zimage_start = (char *)(unsigned long)(&__image_begin);
-+ zimage_size = (unsigned long)(&__image_end) -
-+ (unsigned long)(&__image_begin);
-+
-+ /*
-+ * The zImage and initrd will be between start and _end, so they've
-+ * already been moved once. We're good to go now. -- Tom
-+ */
-+ puts("zimage at: "); puthex((unsigned long)zimage_start);
-+ puts(" "); puthex((unsigned long)(zimage_size+zimage_start));
-+ puts("\n");
-+
-+ if ( initrd_size ) {
-+ puts("initrd at: ");
-+ puthex((unsigned long)(&__ramdisk_begin));
-+ puts(" "); puthex((unsigned long)(&__ramdisk_end));puts("\n");
-+ }
-+
-+ /* assume the chunk below 8M is free */
-+ avail_ram = (char *)AVAIL_RAM_START;
-+ end_avail = (char *)AVAIL_RAM_END;
-+
-+ /* Display standard Linux/MIPS boot prompt for kernel args */
-+ puts("Uncompressing Linux at load address ");
-+ puthex(LOADADDR);
-+ puts("\n");
-+ /* I don't like this hard coded gunzip size (fixme) */
-+ gunzip((void *)LOADADDR, 0x400000, zimage_start, &zimage_size);
-+ puts("Now booting the kernel\n");
-+}
-diff -Naru linux/arch/mips/zboot/common/no_initrd.c linux-new/arch/mips/zboot/common/no_initrd.c
---- linux/arch/mips/zboot/common/no_initrd.c 1969-12-31 19:00:00.000000000 -0500
-+++ linux-new/arch/mips/zboot/common/no_initrd.c 2003-12-18 14:26:20.000000000 -0500
-@@ -0,0 +1,2 @@
-+char initrd_data[1];
-+int initrd_len = 0;
-diff -Naru linux/arch/mips/zboot/common/ns16550.c linux-new/arch/mips/zboot/common/ns16550.c
---- linux/arch/mips/zboot/common/ns16550.c 1969-12-31 19:00:00.000000000 -0500
-+++ linux-new/arch/mips/zboot/common/ns16550.c 2003-12-18 14:26:20.000000000 -0500
-@@ -0,0 +1,57 @@
-+/*
-+ * NS16550 support
-+ */
-+
-+#include <linux/config.h>
-+#include <asm/serial.h>
-+#include "ns16550.h"
-+
-+typedef struct NS16550 *NS16550_t;
-+
-+const NS16550_t COM_PORTS[] = { (NS16550_t) COM1,
-+ (NS16550_t) COM2,
-+ (NS16550_t) COM3,
-+ (NS16550_t) COM4 };
-+
-+volatile struct NS16550 *
-+serial_init(int chan)
-+{
-+ volatile struct NS16550 *com_port;
-+ com_port = (struct NS16550 *) COM_PORTS[chan];
-+ /* See if port is present */
-+ com_port->lcr = 0x00;
-+ com_port->ier = 0xFF;
-+#if 0
-+ if (com_port->ier != 0x0F) return ((struct NS16550 *)0);
-+#endif
-+ com_port->ier = 0x00;
-+ com_port->lcr = 0x80; /* Access baud rate */
-+#ifdef CONFIG_SERIAL_CONSOLE_NONSTD
-+ com_port->dll = (BASE_BAUD / CONFIG_SERIAL_CONSOLE_BAUD);
-+ com_port->dlm = (BASE_BAUD / CONFIG_SERIAL_CONSOLE_BAUD) >> 8;
-+#endif
-+ com_port->lcr = 0x03; /* 8 data, 1 stop, no parity */
-+ com_port->mcr = 0x03; /* RTS/DTR */
-+ com_port->fcr = 0x07; /* Clear & enable FIFOs */
-+ return (com_port);
-+}
-+
-+void
-+serial_putc(volatile struct NS16550 *com_port, unsigned char c)
-+{
-+ while ((com_port->lsr & LSR_THRE) == 0) ;
-+ com_port->thr = c;
-+}
-+
-+unsigned char
-+serial_getc(volatile struct NS16550 *com_port)
-+{
-+ while ((com_port->lsr & LSR_DR) == 0) ;
-+ return (com_port->rbr);
-+}
-+
-+int
-+serial_tstc(volatile struct NS16550 *com_port)
-+{
-+ return ((com_port->lsr & LSR_DR) != 0);
-+}
---- linux/arch/mips/zboot/common/string.c 1969-12-31 19:00:00.000000000 -0500
-+++ linux-new/arch/mips/zboot/common/string.c 2003-12-18 17:11:10.000000000 -0500
-@@ -0,0 +1,497 @@
-+/*
-+ * linux/lib/string.c
-+ *
-+ * Copyright (C) 1991, 1992 Linus Torvalds
-+ */
-+
-+/*
-+ * stupid library routines.. The optimized versions should generally be found
-+ * as inline code in <asm-xx/string.h>
-+ *
-+ * These are buggy as well..
-+ *
-+ * * Fri Jun 25 1999, Ingo Oeser <ioe@informatik.tu-chemnitz.de>
-+ * - Added strsep() which will replace strtok() soon (because strsep() is
-+ * reentrant and should be faster). Use only strsep() in new code, please.
-+ */
-+
-+#include <linux/types.h>
-+#include <linux/string.h>
-+#include <linux/ctype.h>
-+
-+/**
-+ * strnicmp - Case insensitive, length-limited string comparison
-+ * @s1: One string
-+ * @s2: The other string
-+ * @len: the maximum number of characters to compare
-+ */
-+int strnicmp(const char *s1, const char *s2, size_t len)
-+{
-+ /* Yes, Virginia, it had better be unsigned */
-+ unsigned char c1, c2;
-+
-+ c1 = 0; c2 = 0;
-+ if (len) {
-+ do {
-+ c1 = *s1; c2 = *s2;
-+ s1++; s2++;
-+ if (!c1)
-+ break;
-+ if (!c2)
-+ break;
-+ if (c1 == c2)
-+ continue;
-+ c1 = tolower(c1);
-+ c2 = tolower(c2);
-+ if (c1 != c2)
-+ break;
-+ } while (--len);
-+ }
-+ return (int)c1 - (int)c2;
-+}
-+
-+char * ___strtok;
-+
-+#ifndef __HAVE_ARCH_STRCPY
-+/**
-+ * strcpy - Copy a %NUL terminated string
-+ * @dest: Where to copy the string to
-+ * @src: Where to copy the string from
-+ */
-+char * strcpy(char * dest,const char *src)
-+{
-+ char *tmp = dest;
-+
-+ while ((*dest++ = *src++) != '\0')
-+ /* nothing */;
-+ return tmp;
-+}
-+#endif
-+
-+#ifndef __HAVE_ARCH_STRNCPY
-+/**
-+ * strncpy - Copy a length-limited, %NUL-terminated string
-+ * @dest: Where to copy the string to
-+ * @src: Where to copy the string from
-+ * @count: The maximum number of bytes to copy
-+ *
-+ * Note that unlike userspace strncpy, this does not %NUL-pad the buffer.
-+ * However, the result is not %NUL-terminated if the source exceeds
-+ * @count bytes.
-+ */
-+char * strncpy(char * dest,const char *src,size_t count)
-+{
-+ char *tmp = dest;
-+
-+ while (count-- && (*dest++ = *src++) != '\0')
-+ /* nothing */;
-+
-+ return tmp;
-+}
-+#endif
-+
-+/**
-+ * strcat - Append one %NUL-terminated string to another
-+ * @dest: The string to be appended to
-+ * @src: The string to append to it
-+ */
-+char * strcat(char * dest, const char * src)
-+{
-+ char *tmp = dest;
-+
-+ while (*dest)
-+ dest++;
-+ while ((*dest++ = *src++) != '\0')
-+ ;
-+
-+ return tmp;
-+}
-+
-+/**
-+ * strncat - Append a length-limited, %NUL-terminated string to another
-+ * @dest: The string to be appended to
-+ * @src: The string to append to it
-+ * @count: The maximum numbers of bytes to copy
-+ *
-+ * Note that in contrast to strncpy, strncat ensures the result is
-+ * terminated.
-+ */
-+char * strncat(char *dest, const char *src, size_t count)
-+{
-+ char *tmp = dest;
-+
-+ if (count) {
-+ while (*dest)
-+ dest++;
-+ while ((*dest++ = *src++)) {
-+ if (--count == 0) {
-+ *dest = '\0';
-+ break;
-+ }
-+ }
-+ }
-+
-+ return tmp;
-+}
-+
-+#ifndef __HAVE_ARCH_STRCMP
-+/**
-+ * strcmp - Compare two strings
-+ * @cs: One string
-+ * @ct: Another string
-+ */
-+int strcmp(const char * cs,const char * ct)
-+{
-+ register signed char __res;
-+
-+ while (1) {
-+ if ((__res = *cs - *ct++) != 0 || !*cs++)
-+ break;
-+ }
-+
-+ return __res;
-+}
-+#endif
-+
-+#ifndef __HAVE_ARCH_STRNCMP
-+/**
-+ * strncmp - Compare two length-limited strings
-+ * @cs: One string
-+ * @ct: Another string
-+ * @count: The maximum number of bytes to compare
-+ */
-+int strncmp(const char * cs,const char * ct,size_t count)
-+{
-+ register signed char __res = 0;
-+
-+ while (count) {
-+ if ((__res = *cs - *ct++) != 0 || !*cs++)
-+ break;
-+ count--;
-+ }
-+
-+ return __res;
-+}
-+#endif
-+
-+/**
-+ * strchr - Find the first occurrence of a character in a string
-+ * @s: The string to be searched
-+ * @c: The character to search for
-+ */
-+char * strchr(const char * s, int c)
-+{
-+ for(; *s != (char) c; ++s)
-+ if (*s == '\0')
-+ return NULL;
-+ return (char *) s;
-+}
-+
-+/**
-+ * strrchr - Find the last occurrence of a character in a string
-+ * @s: The string to be searched
-+ * @c: The character to search for
-+ */
-+char * strrchr(const char * s, int c)
-+{
-+ const char *p = s + strlen(s);
-+ do {
-+ if (*p == (char)c)
-+ return (char *)p;
-+ } while (--p >= s);
-+ return NULL;
-+}
-+
-+/**
-+ * strlen - Find the length of a string
-+ * @s: The string to be sized
-+ */
-+size_t strlen(const char * s)
-+{
-+ const char *sc;
-+
-+ for (sc = s; *sc != '\0'; ++sc)
-+ /* nothing */;
-+ return sc - s;
-+}
-+
-+/**
-+ * strnlen - Find the length of a length-limited string
-+ * @s: The string to be sized
-+ * @count: The maximum number of bytes to search
-+ */
-+size_t strnlen(const char * s, size_t count)
-+{
-+ const char *sc;
-+
-+ for (sc = s; count-- && *sc != '\0'; ++sc)
-+ /* nothing */;
-+ return sc - s;
-+}
-+
-+/**
-+ * strspn - Calculate the length of the initial substring of @s which only
-+ * contain letters in @accept
-+ * @s: The string to be searched
-+ * @accept: The string to search for
-+ */
-+size_t strspn(const char *s, const char *accept)
-+{
-+ const char *p;
-+ const char *a;
-+ size_t count = 0;
-+
-+ for (p = s; *p != '\0'; ++p) {
-+ for (a = accept; *a != '\0'; ++a) {
-+ if (*p == *a)
-+ break;
-+ }
-+ if (*a == '\0')
-+ return count;
-+ ++count;
-+ }
-+
-+ return count;
-+}
-+
-+/**
-+ * strpbrk - Find the first occurrence of a set of characters
-+ * @cs: The string to be searched
-+ * @ct: The characters to search for
-+ */
-+char * strpbrk(const char * cs,const char * ct)
-+{
-+ const char *sc1,*sc2;
-+
-+ for( sc1 = cs; *sc1 != '\0'; ++sc1) {
-+ for( sc2 = ct; *sc2 != '\0'; ++sc2) {
-+ if (*sc1 == *sc2)
-+ return (char *) sc1;
-+ }
-+ }
-+ return NULL;
-+}
-+
-+/**
-+ * strtok - Split a string into tokens
-+ * @s: The string to be searched
-+ * @ct: The characters to search for
-+ *
-+ * WARNING: strtok is deprecated, use strsep instead.
-+ */
-+char * strtok(char * s,const char * ct)
-+{
-+ char *sbegin, *send;
-+
-+ sbegin = s ? s : ___strtok;
-+ if (!sbegin) {
-+ return NULL;
-+ }
-+ sbegin += strspn(sbegin,ct);
-+ if (*sbegin == '\0') {
-+ ___strtok = NULL;
-+ return( NULL );
-+ }
-+ send = strpbrk( sbegin, ct);
-+ if (send && *send != '\0')
-+ *send++ = '\0';
-+ ___strtok = send;
-+ return (sbegin);
-+}
-+
-+/**
-+ * strsep - Split a string into tokens
-+ * @s: The string to be searched
-+ * @ct: The characters to search for
-+ *
-+ * strsep() updates @s to point after the token, ready for the next call.
-+ *
-+ * It returns empty tokens, too, behaving exactly like the libc function
-+ * of that name. In fact, it was stolen from glibc2 and de-fancy-fied.
-+ * Same semantics, slimmer shape. ;)
-+ */
-+char * strsep(char **s, const char *ct)
-+{
-+ char *sbegin = *s, *end;
-+
-+ if (sbegin == NULL)
-+ return NULL;
-+
-+ end = strpbrk(sbegin, ct);
-+ if (end)
-+ *end++ = '\0';
-+ *s = end;
-+
-+ return sbegin;
-+}
-+
-+/**
-+ * memset - Fill a region of memory with the given value
-+ * @s: Pointer to the start of the area.
-+ * @c: The byte to fill the area with
-+ * @count: The size of the area.
-+ *
-+ * Do not use memset() to access IO space, use memset_io() instead.
-+ */
-+void * memset(void * s,int c, size_t count)
-+{
-+ char *xs = (char *) s;
-+
-+ while (count--)
-+ *xs++ = c;
-+
-+ return s;
-+}
-+
-+/**
-+ * bcopy - Copy one area of memory to another
-+ * @src: Where to copy from
-+ * @dest: Where to copy to
-+ * @count: The size of the area.
-+ *
-+ * Note that this is the same as memcpy(), with the arguments reversed.
-+ * memcpy() is the standard, bcopy() is a legacy BSD function.
-+ *
-+ * You should not use this function to access IO space, use memcpy_toio()
-+ * or memcpy_fromio() instead.
-+ */
-+char * bcopy(const char * src, char * dest, int count)
-+{
-+ char *tmp = dest;
-+
-+ while (count--)
-+ *tmp++ = *src++;
-+
-+ return dest;
-+}
-+
-+/**
-+ * memcpy - Copy one area of memory to another
-+ * @dest: Where to copy to
-+ * @src: Where to copy from
-+ * @count: The size of the area.
-+ *
-+ * You should not use this function to access IO space, use memcpy_toio()
-+ * or memcpy_fromio() instead.
-+ */
-+void * memcpy(void * dest,const void *src,size_t count)
-+{
-+ char *tmp = (char *) dest, *s = (char *) src;
-+
-+ while (count--)
-+ *tmp++ = *s++;
-+
-+ return dest;
-+}
-+
-+/**
-+ * memmove - Copy one area of memory to another
-+ * @dest: Where to copy to
-+ * @src: Where to copy from
-+ * @count: The size of the area.
-+ *
-+ * Unlike memcpy(), memmove() copes with overlapping areas.
-+ */
-+void * memmove(void * dest,const void *src,size_t count)
-+{
-+ char *tmp, *s;
-+
-+ if (dest <= src) {
-+ tmp = (char *) dest;
-+ s = (char *) src;
-+ while (count--)
-+ *tmp++ = *s++;
-+ }
-+ else {
-+ tmp = (char *) dest + count;
-+ s = (char *) src + count;
-+ while (count--)
-+ *--tmp = *--s;
-+ }
-+
-+ return dest;
-+}
-+
-+/**
-+ * memcmp - Compare two areas of memory
-+ * @cs: One area of memory
-+ * @ct: Another area of memory
-+ * @count: The size of the area.
-+ */
-+int memcmp(const void * cs,const void * ct,size_t count)
-+{
-+ const unsigned char *su1, *su2;
-+ signed char res = 0;
-+
-+ for( su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
-+ if ((res = *su1 - *su2) != 0)
-+ break;
-+ return res;
-+}
-+
-+#ifndef __HAVE_ARCH_MEMSCAN
-+/**
-+ * memscan - Find a character in an area of memory.
-+ * @addr: The memory area
-+ * @c: The byte to search for
-+ * @size: The size of the area.
-+ *
-+ * returns the address of the first occurrence of @c, or 1 byte past
-+ * the area if @c is not found
-+ */
-+void * memscan(void * addr, int c, size_t size)
-+{
-+ unsigned char * p = (unsigned char *) addr;
-+ unsigned char * e = p + size;
-+
-+ while (p != e) {
-+ if (*p == c)
-+ return (void *) p;
-+ p++;
-+ }
-+
-+ return (void *) p;
-+}
-+#endif
-+
-+/**
-+ * strstr - Find the first substring in a %NUL terminated string
-+ * @s1: The string to be searched
-+ * @s2: The string to search for
-+ */
-+char * strstr(const char * s1,const char * s2)
-+{
-+ int l1, l2;
-+
-+ l2 = strlen(s2);
-+ if (!l2)
-+ return (char *) s1;
-+ l1 = strlen(s1);
-+ while (l1 >= l2) {
-+ l1--;
-+ if (!memcmp(s1,s2,l2))
-+ return (char *) s1;
-+ s1++;
-+ }
-+ return NULL;
-+}
-+
-+/**
-+ * memchr - Find a character in an area of memory.
-+ * @s: The memory area
-+ * @c: The byte to search for
-+ * @n: The size of the area.
-+ *
-+ * returns the address of the first occurrence of @c, or %NULL
-+ * if @c is not found
-+ */
-+void *memchr(const void *s, int c, size_t n)
-+{
-+ const unsigned char *p = s;
-+ while (n-- != 0) {
-+ if ((unsigned char)c == *p++) {
-+ return (void *)(p-1);
-+ }
-+ }
-+ return NULL;
-+}
-diff -Naru linux/arch/mips/zboot/csb250/head.S linux-new/arch/mips/zboot/csb250/head.S
---- linux/arch/mips/zboot/csb250/head.S 1969-12-31 19:00:00.000000000 -0500
-+++ linux-new/arch/mips/zboot/csb250/head.S 2003-12-18 14:26:20.000000000 -0500
-@@ -0,0 +1,157 @@
-+/*
-+ * arch/mips/kernel/head.S
-+ *
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright (C) 1994, 1995 Waldorf Electronics
-+ * Written by Ralf Baechle and Andreas Busse
-+ * Copyright (C) 1995 - 1999 Ralf Baechle
-+ * Copyright (C) 1996 Paul M. Antoine
-+ * Modified for DECStation and hence R3000 support by Paul M. Antoine
-+ * Further modifications by David S. Miller and Harald Koerfgen
-+ * Copyright (C) 1999 Silicon Graphics, Inc.
-+ *
-+ * Head.S contains the MIPS exception handler and startup code.
-+ *
-+ **************************************************************************
-+ * 9 Nov, 2000.
-+ * Added Cache Error exception handler and SBDDP EJTAG debug exception.
-+ *
-+ * Kevin Kissell, kevink@mips.com and Carsten Langgaard, carstenl@mips.com
-+ * Copyright (C) 2000 MIPS Technologies, Inc. All rights reserved.
-+ **************************************************************************
-+ */
-+#include <linux/config.h>
-+#include <linux/threads.h>
-+
-+#include <asm/asm.h>
-+#include <asm/cacheops.h>
-+#include <asm/mipsregs.h>
-+#include <asm/offset.h>
-+#include <asm/cachectl.h>
-+#include <asm/regdef.h>
-+
-+#define IndexInvalidate_I 0x00
-+#define IndexWriteBack_D 0x01
-+
-+ .set noreorder
-+ .cprestore
-+ LEAF(start)
-+start:
-+ bal locate
-+ nop
-+
-+ .globl asize /* Someday we'll put the initrd info here. */
-+asize: .word 0
-+ .word 0
-+ .word 0
-+ .word 0
-+
-+locate:
-+ subu s8, ra, 8 /* Where we were loaded */
-+ la sp, (.stack + 8192)
-+
-+ move s0, a0 /* Save boot rom start args */
-+ move s1, a1
-+ move s2, a2
-+ move s3, a3
-+
-+ la a0, start /* Where we were linked to run */
-+
-+ move a1, s8
-+ la a2, _edata
-+ subu t1, a2, a0
-+ srl t1, t1, 2
-+
-+ /* copy text section */
-+ li t0, 0
-+1: lw v0, 0(a1)
-+ nop
-+ sw v0, 0(a0)
-+ xor t0, t0, v0
-+ addu a0, 4
-+ bne a2, a0, 1b
-+ addu a1, 4
-+
-+ /* Clear BSS */
-+ la a0, _edata
-+ la a2, _end
-+2: sw zero, 0(a0)
-+ bne a2, a0, 2b
-+ addu a0, 4
-+
-+ /* push the D-Cache and invalidate I-Cache */
-+ li k0, 0x80000000 # start address
-+ li k1, 0x80004000 # end address (16KB I-Cache)
-+ subu k1, 128
-+
-+1:
-+ .set mips3
-+ cache IndexWriteBack_D, 0(k0)
-+ cache IndexWriteBack_D, 32(k0)
-+ cache IndexWriteBack_D, 64(k0)
-+ cache IndexWriteBack_D, 96(k0)
-+ cache IndexInvalidate_I, 0(k0)
-+ cache IndexInvalidate_I, 32(k0)
-+ cache IndexInvalidate_I, 64(k0)
-+ cache IndexInvalidate_I, 96(k0)
-+ .set mips0
-+
-+ bne k0, k1, 1b
-+ addu k0, k0, 128
-+ /* done */
-+
-+/* move a0, s8 /* load address */
-+ subu a0, s8, 0x1000 /* load address */
-+ move a1, t1 /* length in words */
-+ move a2, t0 /* checksum */
-+ move a3, sp
-+
-+ la ra, 1f
-+ la k0, decompress_kernel
-+ jr k0
-+ nop
-+1:
-+
-+ la a2, __ramdisk_begin
-+ la a3, initrd_size
-+ lw a0, 0(a2)
-+ lw a1, 0(a3)
-+ li k0, KERNEL_ENTRY
-+ jr k0
-+ nop
-+3:
-+ b 3b
-+ END(start)
-+
-+ LEAF(udelay)
-+udelay:
-+ END(udelay)
-+
-+
-+ LEAF(FlushCache)
-+ li k0, 0x80000000 # start address
-+ li k1, 0x80004000 # end address (16KB I-Cache)
-+ subu k1, 128
-+
-+1:
-+ .set mips3
-+ cache IndexWriteBack_D, 0(k0)
-+ cache IndexWriteBack_D, 32(k0)
-+ cache IndexWriteBack_D, 64(k0)
-+ cache IndexWriteBack_D, 96(k0)
-+ cache IndexInvalidate_I, 0(k0)
-+ cache IndexInvalidate_I, 32(k0)
-+ cache IndexInvalidate_I, 64(k0)
-+ cache IndexInvalidate_I, 96(k0)
-+ .set mips0
-+
-+ bne k0, k1, 1b
-+ addu k0, k0, 128
-+ jr ra
-+ nop
-+ END(FlushCache)
-+
-+ .comm .stack,4096*2,4
-diff -Naru linux/arch/mips/zboot/csb250/Makefile linux-new/arch/mips/zboot/csb250/Makefile
---- linux/arch/mips/zboot/csb250/Makefile 1969-12-31 19:00:00.000000000 -0500
-+++ linux-new/arch/mips/zboot/csb250/Makefile 2003-12-18 14:26:20.000000000 -0500
-@@ -0,0 +1,90 @@
-+# arch/mips/zboot/pb1xxx/Makefile
-+#
-+# Makefile for Cogent CSB250 Au1500 board.
-+# All of the boot loader code was derived from the ppc
-+# boot code.
-+#
-+# This program is free software; you can redistribute it and/or modify it
-+# 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.
-+
-+.c.s:
-+ $(CC) $(CFLAGS) -S -o $*.s $<
-+.s.o:
-+ $(AS) -o $*.o $<
-+.c.o:
-+ $(CC) $(CFLAGS) -D__BOOTER__ -c -o $*.o $<
-+.S.s:
-+ $(CPP) $(AFLAGS) -o $*.o $<
-+.S.o:
-+ $(CC) $(AFLAGS) -c -o $*.o $<
-+
-+#########################################################################
-+# START BOARD SPECIFIC VARIABLES
-+BNAME=csb250
-+
-+# These two variables control where the zImage is stored
-+# in flash and loaded in memory. It only controls how the srec
-+# file is generated, the code is the same.
-+RAM_RUN_ADDR = 0x80a00000
-+FLASH_LOAD_ADDR = 0xBFD00000
-+
-+# These two variables specify the free ram region
-+# that can be used for temporary malloc area
-+AVAIL_RAM_START=0x80400000
-+AVAIL_RAM_END=0x80800000
-+
-+# This one must match the LOADADDR in arch/mips/Makefile!
-+LOADADDR=0x80100000
-+# END BOARD SPECIFIC VARIABLES
-+#########################################################################
-+
-+OBJECTS := head.o ../common/misc-common.o ../common/misc-simple.o \
-+ ../common/au1k_uart.o ../common/string.o ../common/ctype.o
-+LIBS := ../lib/zlib.a
-+
-+ENTRY := ../utils/entry
-+OFFSET := ../utils/offset
-+SIZE := ../utils/size
-+
-+LD_ARGS := -T ../ld.script -Ttext $(RAM_RUN_ADDR) -Bstatic
-+OBJCOPY_ARGS = -O elf32-tradbigmips
-+
-+all: zImage
-+
-+clean:
-+ rm -rf *.o vmlinux* zvmlinux.* ../images/*.srec
-+
-+head.o: head.S $(TOPDIR)/vmlinux
-+ $(CC) $(AFLAGS) \
-+ -DKERNEL_ENTRY=$(shell sh $(ENTRY) $(NM) $(TOPDIR)/vmlinux ) \
-+ -c -o $*.o $<
-+
-+../common/misc-simple.o:
-+ $(CC) $(CFLAGS) -DINITRD_OFFSET=0 -DINITRD_SIZE=0 -DZIMAGE_OFFSET=0 \
-+ -DAVAIL_RAM_START=$(AVAIL_RAM_START) \
-+ -DAVAIL_RAM_END=$(AVAIL_RAM_END) \
-+ -DLOADADDR=$(LOADADDR) \
-+ -DZIMAGE_SIZE=0 -c -o $@ $*.c
-+
-+zvmlinux: $(OBJECTS) $(LIBS) ../ld.script ../images/vmlinux.gz ../common/dummy.o
-+ $(OBJCOPY) \
-+ --add-section=.image=../images/vmlinux.gz \
-+ --set-section-flags=.image=contents,alloc,load,readonly,data \
-+ ../common/dummy.o image.o
-+ $(LD) $(LD_ARGS) -o $@ $(OBJECTS) image.o $(LIBS)
-+ $(OBJCOPY) $(OBJCOPY_ARGS) $@ $@ -R .comment -R .stab -R .stabstr \
-+ -R .initrd -R .sysmap
-+
-+# Here we manipulate the image in order to get it the necessary
-+# srecord file we need.
-+zImage: zvmlinux
-+ mv zvmlinux ../images/zImage.$(BNAME)
-+ $(OBJCOPY) -O binary ../images/zImage.$(BNAME) ../images/$(BNAME).bin
-+
-+zImage.flash: zImage
-+ $(OBJCOPY) -O srec --adjust-vma 0x3ed00000 \
-+ ../images/zImage.$(BNAME) ../images/$(BNAME).flash.srec
-+
-+include $(TOPDIR)/Rules.make
-diff -Naru linux/arch/mips/zboot/images/Makefile linux-new/arch/mips/zboot/images/Makefile
---- linux/arch/mips/zboot/images/Makefile 1969-12-31 19:00:00.000000000 -0500
-+++ linux-new/arch/mips/zboot/images/Makefile 2003-12-18 14:26:20.000000000 -0500
-@@ -0,0 +1,10 @@
-+
-+include $(TOPDIR)/Rules.make
-+
-+vmlinux.gz: $(TOPDIR)/vmlinux
-+ $(OBJCOPY) -S -O binary $(TOPDIR)/vmlinux vmlinux
-+ gzip -vf vmlinux
-+
-+clean:
-+ rm -f vmlinux.* zImage.*
-+
-diff -Naru linux/arch/mips/zboot/include/nonstdio.h linux-new/arch/mips/zboot/include/nonstdio.h
---- linux/arch/mips/zboot/include/nonstdio.h 1969-12-31 19:00:00.000000000 -0500
-+++ linux-new/arch/mips/zboot/include/nonstdio.h 2003-12-18 14:26:20.000000000 -0500
-@@ -0,0 +1,18 @@
-+/*
-+ * Copyright (C) Paul Mackerras 1997.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it 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.
-+ */
-+typedef int FILE;
-+extern FILE *stdin, *stdout;
-+#define NULL ((void *)0)
-+#define EOF (-1)
-+#define fopen(n, m) NULL
-+#define fflush(f) 0
-+#define fclose(f) 0
-+extern char *fgets();
-+
-+#define perror(s) printf("%s: no files!\n", (s))
-diff -Naru linux/arch/mips/zboot/include/ns16550.h linux-new/arch/mips/zboot/include/ns16550.h
---- linux/arch/mips/zboot/include/ns16550.h 1969-12-31 19:00:00.000000000 -0500
-+++ linux-new/arch/mips/zboot/include/ns16550.h 2003-12-18 14:26:20.000000000 -0500
-@@ -0,0 +1,49 @@
-+/*
-+ * NS16550 Serial Port
-+ */
-+
-+/*
-+ * Figure out which file will have the definitons of COMx
-+ */
-+#if !defined(CONFIG_AU1X00_UART)
-+#error no serial.h
-+#endif
-+
-+/* Some machines have their uart registers 16 bytes apart. Most don't.
-+ * TODO: Make this work like drivers/char/serial does - Tom */
-+#if !defined(UART_REG_PAD)
-+#define UART_REG_PAD(x)
-+#endif
-+
-+struct NS16550
-+ {
-+ unsigned char rbr; /* 0 */
-+ UART_REG_PAD(rbr)
-+ unsigned char ier; /* 1 */
-+ UART_REG_PAD(ier)
-+ unsigned char fcr; /* 2 */
-+ UART_REG_PAD(fcr)
-+ unsigned char lcr; /* 3 */
-+ UART_REG_PAD(lcr)
-+ unsigned char mcr; /* 4 */
-+ UART_REG_PAD(mcr)
-+ unsigned char lsr; /* 5 */
-+ UART_REG_PAD(lsr)
-+ unsigned char msr; /* 6 */
-+ UART_REG_PAD(msr)
-+ unsigned char scr; /* 7 */
-+ };
-+
-+#define thr rbr
-+#define iir fcr
-+#define dll rbr
-+#define dlm ier
-+
-+#define LSR_DR 0x01 /* Data ready */
-+#define LSR_OE 0x02 /* Overrun */
-+#define LSR_PE 0x04 /* Parity error */
-+#define LSR_FE 0x08 /* Framing error */
-+#define LSR_BI 0x10 /* Break */
-+#define LSR_THRE 0x20 /* Xmit holding register empty */
-+#define LSR_TEMT 0x40 /* Xmitter empty */
-+#define LSR_ERR 0x80 /* Error */
-diff -Naru linux/arch/mips/zboot/include/pb1000_serial.h linux-new/arch/mips/zboot/include/pb1000_serial.h
---- linux/arch/mips/zboot/include/pb1000_serial.h 1969-12-31 19:00:00.000000000 -0500
-+++ linux-new/arch/mips/zboot/include/pb1000_serial.h 2003-12-18 14:26:20.000000000 -0500
-@@ -0,0 +1,20 @@
-+/*
-+ * arch/ppc/boot/include/sandpoint_serial.h
-+ *
-+ * Location of the COM ports on Motorola SPS Sandpoint machines
-+ *
-+ * Author: Mark A. Greer
-+ * mgreer@mvista.com
-+ *
-+ * Copyright 2001 MontaVista Software Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * 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.
-+ */
-+
-+#define COM1 0xfe0003f8
-+#define COM2 0xfe0002f8
-+#define COM3 0x00000000 /* No COM3 */
-+#define COM4 0x00000000 /* No COM4 */
-diff -Naru linux/arch/mips/zboot/include/zlib.h linux-new/arch/mips/zboot/include/zlib.h
---- linux/arch/mips/zboot/include/zlib.h 1969-12-31 19:00:00.000000000 -0500
-+++ linux-new/arch/mips/zboot/include/zlib.h 2003-12-18 14:26:21.000000000 -0500
-@@ -0,0 +1,432 @@
-+/* $Id$ */
-+
-+/*
-+ * This file is derived from zlib.h and zconf.h from the zlib-0.95
-+ * distribution by Jean-loup Gailly and Mark Adler, with some additions
-+ * by Paul Mackerras to aid in implementing Deflate compression and
-+ * decompression for PPP packets.
-+ */
-+
-+/*
-+ * ==FILEVERSION 960122==
-+ *
-+ * This marker is used by the Linux installation script to determine
-+ * whether an up-to-date version of this file is already installed.
-+ */
-+
-+/* zlib.h -- interface of the 'zlib' general purpose compression library
-+ version 0.95, Aug 16th, 1995.
-+
-+ Copyright (C) 1995 Jean-loup Gailly and Mark Adler
-+
-+ This software is provided 'as-is', without any express or implied
-+ warranty. In no event will the authors be held liable for any damages
-+ arising from the use of this software.
-+
-+ Permission is granted to anyone to use this software for any purpose,
-+ including commercial applications, and to alter it and redistribute it
-+ freely, subject to the following restrictions:
-+
-+ 1. The origin of this software must not be misrepresented; you must not
-+ claim that you wrote the original software. If you use this software
-+ in a product, an acknowledgment in the product documentation would be
-+ appreciated but is not required.
-+ 2. Altered source versions must be plainly marked as such, and must not be
-+ misrepresented as being the original software.
-+ 3. This notice may not be removed or altered from any source distribution.
-+
-+ Jean-loup Gailly Mark Adler
-+ gzip@prep.ai.mit.edu madler@alumni.caltech.edu
-+ */
-+
-+#ifndef _ZLIB_H
-+#define _ZLIB_H
-+
-+/* #include "zconf.h" */ /* included directly here */
-+
-+/* zconf.h -- configuration of the zlib compression library
-+ * Copyright (C) 1995 Jean-loup Gailly.
-+ * For conditions of distribution and use, see copyright notice in zlib.h
-+ */
-+
-+/* From: zconf.h,v 1.12 1995/05/03 17:27:12 jloup Exp */
-+
-+/*
-+ The library does not install any signal handler. It is recommended to
-+ add at least a handler for SIGSEGV when decompressing; the library checks
-+ the consistency of the input data whenever possible but may go nuts
-+ for some forms of corrupted input.
-+ */
-+
-+/*
-+ * Compile with -DMAXSEG_64K if the alloc function cannot allocate more
-+ * than 64k bytes at a time (needed on systems with 16-bit int).
-+ * Compile with -DUNALIGNED_OK if it is OK to access shorts or ints
-+ * at addresses which are not a multiple of their size.
-+ * Under DOS, -DFAR=far or -DFAR=__far may be needed.
-+ */
-+
-+#ifndef STDC
-+# if defined(MSDOS) || defined(__STDC__) || defined(__cplusplus)
-+# define STDC
-+# endif
-+#endif
-+
-+#ifdef __MWERKS__ /* Metrowerks CodeWarrior declares fileno() in unix.h */
-+# include <unix.h>
-+#endif
-+
-+/* Maximum value for memLevel in deflateInit2 */
-+#ifndef MAX_MEM_LEVEL
-+# ifdef MAXSEG_64K
-+# define MAX_MEM_LEVEL 8
-+# else
-+# define MAX_MEM_LEVEL 9
-+# endif
-+#endif
-+
-+#ifndef FAR
-+# define FAR
-+#endif
-+
-+/* Maximum value for windowBits in deflateInit2 and inflateInit2 */
-+#ifndef MAX_WBITS
-+# define MAX_WBITS 15 /* 32K LZ77 window */
-+#endif
-+
-+/* The memory requirements for deflate are (in bytes):
-+ 1 << (windowBits+2) + 1 << (memLevel+9)
-+ that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values)
-+ plus a few kilobytes for small objects. For example, if you want to reduce
-+ the default memory requirements from 256K to 128K, compile with
-+ make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
-+ Of course this will generally degrade compression (there's no free lunch).
-+
-+ The memory requirements for inflate are (in bytes) 1 << windowBits
-+ that is, 32K for windowBits=15 (default value) plus a few kilobytes
-+ for small objects.
-+*/
-+
-+ /* Type declarations */
-+
-+#ifndef OF /* function prototypes */
-+# ifdef STDC
-+# define OF(args) args
-+# else
-+# define OF(args) ()
-+# endif
-+#endif
-+
-+typedef unsigned char Byte; /* 8 bits */
-+typedef unsigned int uInt; /* 16 bits or more */
-+typedef unsigned long uLong; /* 32 bits or more */
-+
-+typedef Byte FAR Bytef;
-+typedef char FAR charf;
-+typedef int FAR intf;
-+typedef uInt FAR uIntf;
-+typedef uLong FAR uLongf;
-+
-+#ifdef STDC
-+ typedef void FAR *voidpf;
-+ typedef void *voidp;
-+#else
-+ typedef Byte FAR *voidpf;
-+ typedef Byte *voidp;
-+#endif
-+
-+/* end of original zconf.h */
-+
-+#define ZLIB_VERSION "0.95P"
-+
-+/*
-+ The 'zlib' compression library provides in-memory compression and
-+ decompression functions, including integrity checks of the uncompressed
-+ data. This version of the library supports only one compression method
-+ (deflation) but other algorithms may be added later and will have the same
-+ stream interface.
-+
-+ For compression the application must provide the output buffer and
-+ may optionally provide the input buffer for optimization. For decompression,
-+ the application must provide the input buffer and may optionally provide
-+ the output buffer for optimization.
-+
-+ Compression can be done in a single step if the buffers are large
-+ enough (for example if an input file is mmap'ed), or can be done by
-+ repeated calls of the compression function. In the latter case, the
-+ application must provide more input and/or consume the output
-+ (providing more output space) before each call.
-+*/
-+
-+typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
-+typedef void (*free_func) OF((voidpf opaque, voidpf address, uInt nbytes));
-+
-+struct internal_state;
-+
-+typedef struct z_stream_s {
-+ Bytef *next_in; /* next input byte */
-+ uInt avail_in; /* number of bytes available at next_in */
-+ uLong total_in; /* total nb of input bytes read so far */
-+
-+ Bytef *next_out; /* next output byte should be put there */
-+ uInt avail_out; /* remaining free space at next_out */
-+ uLong total_out; /* total nb of bytes output so far */
-+
-+ char *msg; /* last error message, NULL if no error */
-+ struct internal_state FAR *state; /* not visible by applications */
-+
-+ alloc_func zalloc; /* used to allocate the internal state */
-+ free_func zfree; /* used to free the internal state */
-+ voidp opaque; /* private data object passed to zalloc and zfree */
-+
-+ Byte data_type; /* best guess about the data type: ascii or binary */
-+
-+} z_stream;
-+
-+/*
-+ The application must update next_in and avail_in when avail_in has
-+ dropped to zero. It must update next_out and avail_out when avail_out
-+ has dropped to zero. The application must initialize zalloc, zfree and
-+ opaque before calling the init function. All other fields are set by the
-+ compression library and must not be updated by the application.
-+
-+ The opaque value provided by the application will be passed as the first
-+ parameter for calls of zalloc and zfree. This can be useful for custom
-+ memory management. The compression library attaches no meaning to the
-+ opaque value.
-+
-+ zalloc must return Z_NULL if there is not enough memory for the object.
-+ On 16-bit systems, the functions zalloc and zfree must be able to allocate
-+ exactly 65536 bytes, but will not be required to allocate more than this
-+ if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS,
-+ pointers returned by zalloc for objects of exactly 65536 bytes *must*
-+ have their offset normalized to zero. The default allocation function
-+ provided by this library ensures this (see zutil.c). To reduce memory
-+ requirements and avoid any allocation of 64K objects, at the expense of
-+ compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h).
-+
-+ The fields total_in and total_out can be used for statistics or
-+ progress reports. After compression, total_in holds the total size of
-+ the uncompressed data and may be saved for use in the decompressor
-+ (particularly if the decompressor wants to decompress everything in
-+ a single step).
-+*/
-+
-+ /* constants */
-+
-+#define Z_NO_FLUSH 0
-+#define Z_PARTIAL_FLUSH 1
-+#define Z_FULL_FLUSH 2
-+#define Z_SYNC_FLUSH 3 /* experimental: partial_flush + byte align */
-+#define Z_FINISH 4
-+#define Z_PACKET_FLUSH 5
-+/* See deflate() below for the usage of these constants */
-+
-+#define Z_OK 0
-+#define Z_STREAM_END 1
-+#define Z_ERRNO (-1)
-+#define Z_STREAM_ERROR (-2)
-+#define Z_DATA_ERROR (-3)
-+#define Z_MEM_ERROR (-4)
-+#define Z_BUF_ERROR (-5)
-+/* error codes for the compression/decompression functions */
-+
-+#define Z_BEST_SPEED 1
-+#define Z_BEST_COMPRESSION 9
-+#define Z_DEFAULT_COMPRESSION (-1)
-+/* compression levels */
-+
-+#define Z_FILTERED 1
-+#define Z_HUFFMAN_ONLY 2
-+#define Z_DEFAULT_STRATEGY 0
-+
-+#define Z_BINARY 0
-+#define Z_ASCII 1
-+#define Z_UNKNOWN 2
-+/* Used to set the data_type field */
-+
-+#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */
-+
-+extern char *zlib_version;
-+/* The application can compare zlib_version and ZLIB_VERSION for consistency.
-+ If the first character differs, the library code actually used is
-+ not compatible with the zlib.h header file used by the application.
-+ */
-+
-+ /* basic functions */
-+
-+extern int inflateInit OF((z_stream *strm));
-+/*
-+ Initializes the internal stream state for decompression. The fields
-+ zalloc and zfree must be initialized before by the caller. If zalloc and
-+ zfree are set to Z_NULL, inflateInit updates them to use default allocation
-+ functions.
-+
-+ inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not
-+ enough memory. msg is set to null if there is no error message.
-+ inflateInit does not perform any decompression: this will be done by
-+ inflate().
-+*/
-+
-+
-+extern int inflate OF((z_stream *strm, int flush));
-+/*
-+ Performs one or both of the following actions:
-+
-+ - Decompress more input starting at next_in and update next_in and avail_in
-+ accordingly. If not all input can be processed (because there is not
-+ enough room in the output buffer), next_in is updated and processing
-+ will resume at this point for the next call of inflate().
-+
-+ - Provide more output starting at next_out and update next_out and avail_out
-+ accordingly. inflate() always provides as much output as possible
-+ (until there is no more input data or no more space in the output buffer).
-+
-+ Before the call of inflate(), the application should ensure that at least
-+ one of the actions is possible, by providing more input and/or consuming
-+ more output, and updating the next_* and avail_* values accordingly.
-+ The application can consume the uncompressed output when it wants, for
-+ example when the output buffer is full (avail_out == 0), or after each
-+ call of inflate().
-+
-+ If the parameter flush is set to Z_PARTIAL_FLUSH or Z_PACKET_FLUSH,
-+ inflate flushes as much output as possible to the output buffer. The
-+ flushing behavior of inflate is not specified for values of the flush
-+ parameter other than Z_PARTIAL_FLUSH, Z_PACKET_FLUSH or Z_FINISH, but the
-+ current implementation actually flushes as much output as possible
-+ anyway. For Z_PACKET_FLUSH, inflate checks that once all the input data
-+ has been consumed, it is expecting to see the length field of a stored
-+ block; if not, it returns Z_DATA_ERROR.
-+
-+ inflate() should normally be called until it returns Z_STREAM_END or an
-+ error. However if all decompression is to be performed in a single step
-+ (a single call of inflate), the parameter flush should be set to
-+ Z_FINISH. In this case all pending input is processed and all pending
-+ output is flushed; avail_out must be large enough to hold all the
-+ uncompressed data. (The size of the uncompressed data may have been saved
-+ by the compressor for this purpose.) The next operation on this stream must
-+ be inflateEnd to deallocate the decompression state. The use of Z_FINISH
-+ is never required, but can be used to inform inflate that a faster routine
-+ may be used for the single inflate() call.
-+
-+ inflate() returns Z_OK if some progress has been made (more input
-+ processed or more output produced), Z_STREAM_END if the end of the
-+ compressed data has been reached and all uncompressed output has been
-+ produced, Z_DATA_ERROR if the input data was corrupted, Z_STREAM_ERROR if
-+ the stream structure was inconsistent (for example if next_in or next_out
-+ was NULL), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if no
-+ progress is possible or if there was not enough room in the output buffer
-+ when Z_FINISH is used. In the Z_DATA_ERROR case, the application may then
-+ call inflateSync to look for a good compression block. */
-+
-+
-+extern int inflateEnd OF((z_stream *strm));
-+/*
-+ All dynamically allocated data structures for this stream are freed.
-+ This function discards any unprocessed input and does not flush any
-+ pending output.
-+
-+ inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state
-+ was inconsistent. In the error case, msg may be set but then points to a
-+ static string (which must not be deallocated).
-+*/
-+
-+ /* advanced functions */
-+
-+extern int inflateInit2 OF((z_stream *strm,
-+ int windowBits));
-+/*
-+ This is another version of inflateInit with more compression options. The
-+ fields next_out, zalloc and zfree must be initialized before by the caller.
-+
-+ The windowBits parameter is the base two logarithm of the maximum window
-+ size (the size of the history buffer). It should be in the range 8..15 for
-+ this version of the library (the value 16 will be allowed soon). The
-+ default value is 15 if inflateInit is used instead. If a compressed stream
-+ with a larger window size is given as input, inflate() will return with
-+ the error code Z_DATA_ERROR instead of trying to allocate a larger window.
-+
-+ If next_out is not null, the library will use this buffer for the history
-+ buffer; the buffer must either be large enough to hold the entire output
-+ data, or have at least 1<<windowBits bytes. If next_out is null, the
-+ library will allocate its own buffer (and leave next_out null). next_in
-+ need not be provided here but must be provided by the application for the
-+ next call of inflate().
-+
-+ If the history buffer is provided by the application, next_out must
-+ never be changed by the application since the decompressor maintains
-+ history information inside this buffer from call to call; the application
-+ can only reset next_out to the beginning of the history buffer when
-+ avail_out is zero and all output has been consumed.
-+
-+ inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was
-+ not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as
-+ windowBits < 8). msg is set to null if there is no error message.
-+ inflateInit2 does not perform any decompression: this will be done by
-+ inflate().
-+*/
-+
-+extern int inflateSync OF((z_stream *strm));
-+/*
-+ Skips invalid compressed data until the special marker (see deflate()
-+ above) can be found, or until all available input is skipped. No output
-+ is provided.
-+
-+ inflateSync returns Z_OK if the special marker has been found, Z_BUF_ERROR
-+ if no more input was provided, Z_DATA_ERROR if no marker has been found,
-+ or Z_STREAM_ERROR if the stream structure was inconsistent. In the success
-+ case, the application may save the current current value of total_in which
-+ indicates where valid compressed data was found. In the error case, the
-+ application may repeatedly call inflateSync, providing more input each time,
-+ until success or end of the input data.
-+*/
-+
-+extern int inflateReset OF((z_stream *strm));
-+/*
-+ This function is equivalent to inflateEnd followed by inflateInit,
-+ but does not free and reallocate all the internal decompression state.
-+ The stream will keep attributes that may have been set by inflateInit2.
-+
-+ inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
-+ stream state was inconsistent (such as zalloc or state being NULL).
-+*/
-+
-+extern int inflateIncomp OF((z_stream *strm));
-+/*
-+ This function adds the data at next_in (avail_in bytes) to the output
-+ history without performing any output. There must be no pending output,
-+ and the decompressor must be expecting to see the start of a block.
-+ Calling this function is equivalent to decompressing a stored block
-+ containing the data at next_in (except that the data is not output).
-+*/
-+
-+ /* checksum functions */
-+
-+/*
-+ This function is not related to compression but is exported
-+ anyway because it might be useful in applications using the
-+ compression library.
-+*/
-+
-+extern uLong adler32 OF((uLong adler, Bytef *buf, uInt len));
-+
-+/*
-+ Update a running Adler-32 checksum with the bytes buf[0..len-1] and
-+ return the updated checksum. If buf is NULL, this function returns
-+ the required initial value for the checksum.
-+ An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
-+ much faster. Usage example:
-+
-+ uLong adler = adler32(0L, Z_NULL, 0);
-+
-+ while (read_buffer(buffer, length) != EOF) {
-+ adler = adler32(adler, buffer, length);
-+ }
-+ if (adler != original_adler) error();
-+*/
-+
-+#ifndef _Z_UTIL_H
-+ struct internal_state {int dummy;}; /* hack for buggy compilers */
-+#endif
-+
-+#endif /* _ZLIB_H */
-diff -Naru linux/arch/mips/zboot/ld.script linux-new/arch/mips/zboot/ld.script
---- linux/arch/mips/zboot/ld.script 1969-12-31 19:00:00.000000000 -0500
-+++ linux-new/arch/mips/zboot/ld.script 2003-12-18 14:26:21.000000000 -0500
-@@ -0,0 +1,151 @@
-+OUTPUT_ARCH(mips)
-+ENTRY(start)
-+SECTIONS
-+{
-+ /* Read-only sections, merged into text segment: */
-+ /* . = 0x81000000; */
-+ .init : { *(.init) } =0
-+ .text :
-+ {
-+ _ftext = . ;
-+ *(.text)
-+ *(.rodata)
-+ *(.rodata1)
-+ /* .gnu.warning sections are handled specially by elf32.em. */
-+ *(.gnu.warning)
-+ } =0
-+ .kstrtab : { *(.kstrtab) }
-+
-+ . = ALIGN(16); /* Exception table */
-+ __start___ex_table = .;
-+ __ex_table : { *(__ex_table) }
-+ __stop___ex_table = .;
-+
-+ __start___dbe_table = .; /* Exception table for data bus errors */
-+ __dbe_table : { *(__dbe_table) }
-+ __stop___dbe_table = .;
-+
-+ __start___ksymtab = .; /* Kernel symbol table */
-+ __ksymtab : { *(__ksymtab) }
-+ __stop___ksymtab = .;
-+
-+ _etext = .;
-+
-+ . = ALIGN(8192);
-+ .data.init_task : { *(.data.init_task) }
-+
-+ /* Startup code */
-+ . = ALIGN(4096);
-+ __init_begin = .;
-+ .text.init : { *(.text.init) }
-+ .data.init : { *(.data.init) }
-+ . = ALIGN(16);
-+ __setup_start = .;
-+ .setup.init : { *(.setup.init) }
-+ __setup_end = .;
-+ __initcall_start = .;
-+ .initcall.init : { *(.initcall.init) }
-+ __initcall_end = .;
-+ . = ALIGN(4096); /* Align double page for init_task_union */
-+ __init_end = .;
-+
-+ . = ALIGN(4096);
-+ .data.page_aligned : { *(.data.idt) }
-+
-+ . = ALIGN(32);
-+ .data.cacheline_aligned : { *(.data.cacheline_aligned) }
-+
-+ .fini : { *(.fini) } =0
-+ .reginfo : { *(.reginfo) }
-+ /* Adjust the address for the data segment. We want to adjust up to
-+ the same address within the page on the next page up. It would
-+ be more correct to do this:
-+ . = .;
-+ The current expression does not correctly handle the case of a
-+ text segment ending precisely at the end of a page; it causes the
-+ data segment to skip a page. The above expression does not have
-+ this problem, but it will currently (2/95) cause BFD to allocate
-+ a single segment, combining both text and data, for this case.
-+ This will prevent the text segment from being shared among
-+ multiple executions of the program; I think that is more
-+ important than losing a page of the virtual address space (note
-+ that no actual memory is lost; the page which is skipped can not
-+ be referenced). */
-+ . = .;
-+ .data :
-+ {
-+ _fdata = . ;
-+ *(.data)
-+
-+ /* Put the compressed image here, so bss is on the end. */
-+ __image_begin = .;
-+ *(.image)
-+ __image_end = .;
-+ /* Align the initial ramdisk image (INITRD) on page boundaries. */
-+ . = ALIGN(4096);
-+ __ramdisk_begin = .;
-+ *(.initrd)
-+ __ramdisk_end = .;
-+ . = ALIGN(4096);
-+
-+ CONSTRUCTORS
-+ }
-+ .data1 : { *(.data1) }
-+ _gp = . + 0x8000;
-+ .lit8 : { *(.lit8) }
-+ .lit4 : { *(.lit4) }
-+ .ctors : { *(.ctors) }
-+ .dtors : { *(.dtors) }
-+ .got : { *(.got.plt) *(.got) }
-+ .dynamic : { *(.dynamic) }
-+ /* We want the small data sections together, so single-instruction offsets
-+ can access them all, and initialized data all before uninitialized, so
-+ we can shorten the on-disk segment size. */
-+ .sdata : { *(.sdata) }
-+ . = ALIGN(4);
-+ _edata = .;
-+ PROVIDE (edata = .);
-+
-+ __bss_start = .;
-+ _fbss = .;
-+ .sbss : { *(.sbss) *(.scommon) }
-+ .bss :
-+ {
-+ *(.dynbss)
-+ *(.bss)
-+ *(COMMON)
-+ . = ALIGN(4);
-+ _end = . ;
-+ PROVIDE (end = .);
-+ }
-+
-+ /* Sections to be discarded */
-+ /DISCARD/ :
-+ {
-+ *(.text.exit)
-+ *(.data.exit)
-+ *(.exitcall.exit)
-+ }
-+
-+ /* This is the MIPS specific mdebug section. */
-+ .mdebug : { *(.mdebug) }
-+ /* These are needed for ELF backends which have not yet been
-+ converted to the new style linker. */
-+ .stab 0 : { *(.stab) }
-+ .stabstr 0 : { *(.stabstr) }
-+ /* DWARF debug sections.
-+ Symbols in the .debug DWARF section are relative to the beginning of the
-+ section so we begin .debug at 0. It's not clear yet what needs to happen
-+ for the others. */
-+ .debug 0 : { *(.debug) }
-+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
-+ .debug_aranges 0 : { *(.debug_aranges) }
-+ .debug_pubnames 0 : { *(.debug_pubnames) }
-+ .debug_sfnames 0 : { *(.debug_sfnames) }
-+ .line 0 : { *(.line) }
-+ /* These must appear regardless of . */
-+ .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) }
-+ .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) }
-+ .comment : { *(.comment) }
-+ .note : { *(.note) }
-+}
-diff -Naru linux/arch/mips/zboot/lib/Makefile linux-new/arch/mips/zboot/lib/Makefile
---- linux/arch/mips/zboot/lib/Makefile 1969-12-31 19:00:00.000000000 -0500
-+++ linux-new/arch/mips/zboot/lib/Makefile 2003-12-18 14:26:21.000000000 -0500
-@@ -0,0 +1,9 @@
-+#
-+# Makefile for some libs needed by zImage.
-+#
-+
-+L_TARGET := zlib.a
-+
-+obj-y := zlib.o
-+
-+include $(TOPDIR)/Rules.make
-diff -Naru linux/arch/mips/zboot/lib/zlib.c linux-new/arch/mips/zboot/lib/zlib.c
---- linux/arch/mips/zboot/lib/zlib.c 1969-12-31 19:00:00.000000000 -0500
-+++ linux-new/arch/mips/zboot/lib/zlib.c 2003-12-18 14:26:21.000000000 -0500
-@@ -0,0 +1,2148 @@
-+/*
-+ * This file is derived from various .h and .c files from the zlib-0.95
-+ * distribution by Jean-loup Gailly and Mark Adler, with some additions
-+ * by Paul Mackerras to aid in implementing Deflate compression and
-+ * decompression for PPP packets. See zlib.h for conditions of
-+ * distribution and use.
-+ *
-+ * Changes that have been made include:
-+ * - changed functions not used outside this file to "local"
-+ * - added minCompression parameter to deflateInit2
-+ * - added Z_PACKET_FLUSH (see zlib.h for details)
-+ * - added inflateIncomp
-+ *
-+ * $Id$
-+ */
-+
-+/*+++++*/
-+/* zutil.h -- internal interface and configuration of the compression library
-+ * Copyright (C) 1995 Jean-loup Gailly.
-+ * For conditions of distribution and use, see copyright notice in zlib.h
-+ */
-+
-+/* WARNING: this file should *not* be used by applications. It is
-+ part of the implementation of the compression library and is
-+ subject to change. Applications should only use zlib.h.
-+ */
-+
-+/* From: zutil.h,v 1.9 1995/05/03 17:27:12 jloup Exp */
-+
-+#define _Z_UTIL_H
-+
-+#include "zlib.h"
-+
-+#ifndef local
-+# define local static
-+#endif
-+/* compile with -Dlocal if your debugger can't find static symbols */
-+
-+#define FAR
-+
-+typedef unsigned char uch;
-+typedef uch FAR uchf;
-+typedef unsigned short ush;
-+typedef ush FAR ushf;
-+typedef unsigned long ulg;
-+
-+extern char *z_errmsg[]; /* indexed by 1-zlib_error */
-+
-+#define ERR_RETURN(strm,err) return (strm->msg=z_errmsg[1-err], err)
-+/* To be used only when the state is known to be valid */
-+
-+#ifndef NULL
-+#define NULL ((void *) 0)
-+#endif
-+
-+ /* common constants */
-+
-+#define DEFLATED 8
-+
-+#ifndef DEF_WBITS
-+# define DEF_WBITS MAX_WBITS
-+#endif
-+/* default windowBits for decompression. MAX_WBITS is for compression only */
-+
-+#if MAX_MEM_LEVEL >= 8
-+# define DEF_MEM_LEVEL 8
-+#else
-+# define DEF_MEM_LEVEL MAX_MEM_LEVEL
-+#endif
-+/* default memLevel */
-+
-+#define STORED_BLOCK 0
-+#define STATIC_TREES 1
-+#define DYN_TREES 2
-+/* The three kinds of block type */
-+
-+#define MIN_MATCH 3
-+#define MAX_MATCH 258
-+/* The minimum and maximum match lengths */
-+
-+ /* functions */
-+
-+#include <linux/string.h>
-+#define zmemcpy memcpy
-+#define zmemzero(dest, len) memset(dest, 0, len)
-+
-+/* Diagnostic functions */
-+#ifdef DEBUG_ZLIB
-+# include <stdio.h>
-+# ifndef verbose
-+# define verbose 0
-+# endif
-+# define Assert(cond,msg) {if(!(cond)) z_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
-+
-+
-+typedef uLong (*check_func) OF((uLong check, Bytef *buf, uInt len));
-+
-+/* voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); */
-+/* void zcfree OF((voidpf opaque, voidpf ptr)); */
-+
-+#define ZALLOC(strm, items, size) \
-+ (*((strm)->zalloc))((strm)->opaque, (items), (size))
-+#define ZFREE(strm, addr, size) \
-+ (*((strm)->zfree))((strm)->opaque, (voidpf)(addr), (size))
-+#define TRY_FREE(s, p, n) {if (p) ZFREE(s, p, n);}
-+
-+/* deflate.h -- internal compression state
-+ * Copyright (C) 1995 Jean-loup Gailly
-+ * For conditions of distribution and use, see copyright notice in zlib.h
-+ */
-+
-+/* WARNING: this file should *not* be used by applications. It is
-+ part of the implementation of the compression library and is
-+ subject to change. Applications should only use zlib.h.
-+ */
-+
-+/*+++++*/
-+/* infblock.h -- header to use infblock.c
-+ * Copyright (C) 1995 Mark Adler
-+ * For conditions of distribution and use, see copyright notice in zlib.h
-+ */
-+
-+/* WARNING: this file should *not* be used by applications. It is
-+ part of the implementation of the compression library and is
-+ subject to change. Applications should only use zlib.h.
-+ */
-+
-+struct inflate_blocks_state;
-+typedef struct inflate_blocks_state FAR inflate_blocks_statef;
-+
-+local inflate_blocks_statef * inflate_blocks_new OF((
-+ z_stream *z,
-+ check_func c, /* check function */
-+ uInt w)); /* window size */
-+
-+local int inflate_blocks OF((
-+ inflate_blocks_statef *,
-+ z_stream *,
-+ int)); /* initial return code */
-+
-+local void inflate_blocks_reset OF((
-+ inflate_blocks_statef *,
-+ z_stream *,
-+ uLongf *)); /* check value on output */
-+
-+local int inflate_blocks_free OF((
-+ inflate_blocks_statef *,
-+ z_stream *,
-+ uLongf *)); /* check value on output */
-+
-+local int inflate_addhistory OF((
-+ inflate_blocks_statef *,
-+ z_stream *));
-+
-+local int inflate_packet_flush OF((
-+ inflate_blocks_statef *));
-+
-+/*+++++*/
-+/* inftrees.h -- header to use inftrees.c
-+ * Copyright (C) 1995 Mark Adler
-+ * For conditions of distribution and use, see copyright notice in zlib.h
-+ */
-+
-+/* WARNING: this file should *not* be used by applications. It is
-+ part of the implementation of the compression library and is
-+ subject to change. Applications should only use zlib.h.
-+ */
-+
-+/* Huffman code lookup table entry--this entry is four bytes for machines
-+ that have 16-bit pointers (e.g. PC's in the small or medium model). */
-+
-+typedef struct inflate_huft_s FAR inflate_huft;
-+
-+struct inflate_huft_s {
-+ union {
-+ struct {
-+ Byte Exop; /* number of extra bits or operation */
-+ Byte Bits; /* number of bits in this code or subcode */
-+ } what;
-+ uInt Nalloc; /* number of these allocated here */
-+ Bytef *pad; /* pad structure to a power of 2 (4 bytes for */
-+ } word; /* 16-bit, 8 bytes for 32-bit machines) */
-+ union {
-+ uInt Base; /* literal, length base, or distance base */
-+ inflate_huft *Next; /* pointer to next level of table */
-+ } more;
-+};
-+
-+#ifdef DEBUG_ZLIB
-+ local uInt inflate_hufts;
-+#endif
-+
-+local int inflate_trees_bits OF((
-+ uIntf *, /* 19 code lengths */
-+ uIntf *, /* bits tree desired/actual depth */
-+ inflate_huft * FAR *, /* bits tree result */
-+ z_stream *)); /* for zalloc, zfree functions */
-+
-+local int inflate_trees_dynamic OF((
-+ uInt, /* number of literal/length codes */
-+ uInt, /* number of distance codes */
-+ uIntf *, /* that many (total) code lengths */
-+ uIntf *, /* literal desired/actual bit depth */
-+ uIntf *, /* distance desired/actual bit depth */
-+ inflate_huft * FAR *, /* literal/length tree result */
-+ inflate_huft * FAR *, /* distance tree result */
-+ z_stream *)); /* for zalloc, zfree functions */
-+
-+local int inflate_trees_fixed OF((
-+ uIntf *, /* literal desired/actual bit depth */
-+ uIntf *, /* distance desired/actual bit depth */
-+ inflate_huft * FAR *, /* literal/length tree result */
-+ inflate_huft * FAR *)); /* distance tree result */
-+
-+local int inflate_trees_free OF((
-+ inflate_huft *, /* tables to free */
-+ z_stream *)); /* for zfree function */
-+
-+
-+/*+++++*/
-+/* infcodes.h -- header to use infcodes.c
-+ * Copyright (C) 1995 Mark Adler
-+ * For conditions of distribution and use, see copyright notice in zlib.h
-+ */
-+
-+/* WARNING: this file should *not* be used by applications. It is
-+ part of the implementation of the compression library and is
-+ subject to change. Applications should only use zlib.h.
-+ */
-+
-+struct inflate_codes_state;
-+typedef struct inflate_codes_state FAR inflate_codes_statef;
-+
-+local inflate_codes_statef *inflate_codes_new OF((
-+ uInt, uInt,
-+ inflate_huft *, inflate_huft *,
-+ z_stream *));
-+
-+local int inflate_codes OF((
-+ inflate_blocks_statef *,
-+ z_stream *,
-+ int));
-+
-+local void inflate_codes_free OF((
-+ inflate_codes_statef *,
-+ z_stream *));
-+
-+
-+/*+++++*/
-+/* inflate.c -- zlib interface to inflate modules
-+ * Copyright (C) 1995 Mark Adler
-+ * For conditions of distribution and use, see copyright notice in zlib.h
-+ */
-+
-+/* inflate private state */
-+struct internal_state {
-+
-+ /* mode */
-+ enum {
-+ METHOD, /* waiting for method byte */
-+ FLAG, /* waiting for flag byte */
-+ BLOCKS, /* decompressing blocks */
-+ CHECK4, /* four check bytes to go */
-+ CHECK3, /* three check bytes to go */
-+ CHECK2, /* two check bytes to go */
-+ CHECK1, /* one check byte to go */
-+ DONE, /* finished check, done */
-+ BAD} /* got an error--stay here */
-+ mode; /* current inflate mode */
-+
-+ /* mode dependent information */
-+ union {
-+ uInt method; /* if FLAGS, method byte */
-+ struct {
-+ uLong was; /* computed check value */
-+ uLong need; /* stream check value */
-+ } check; /* if CHECK, check values to compare */
-+ uInt marker; /* if BAD, inflateSync's marker bytes count */
-+ } sub; /* submode */
-+
-+ /* mode independent information */
-+ int nowrap; /* flag for no wrapper */
-+ uInt wbits; /* log2(window size) (8..15, defaults to 15) */
-+ inflate_blocks_statef
-+ *blocks; /* current inflate_blocks state */
-+
-+};
-+
-+
-+int inflateReset(z)
-+z_stream *z;
-+{
-+ uLong c;
-+
-+ if (z == Z_NULL || z->state == Z_NULL)
-+ return Z_STREAM_ERROR;
-+ z->total_in = z->total_out = 0;
-+ z->msg = Z_NULL;
-+ z->state->mode = z->state->nowrap ? BLOCKS : METHOD;
-+ inflate_blocks_reset(z->state->blocks, z, &c);
-+ Trace((stderr, "inflate: reset\n"));
-+ return Z_OK;
-+}
-+
-+
-+int inflateEnd(z)
-+z_stream *z;
-+{
-+ uLong c;
-+
-+ if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL)
-+ return Z_STREAM_ERROR;
-+ if (z->state->blocks != Z_NULL)
-+ inflate_blocks_free(z->state->blocks, z, &c);
-+ ZFREE(z, z->state, sizeof(struct internal_state));
-+ z->state = Z_NULL;
-+ Trace((stderr, "inflate: end\n"));
-+ return Z_OK;
-+}
-+
-+
-+int inflateInit2(z, w)
-+z_stream *z;
-+int w;
-+{
-+ /* initialize state */
-+ if (z == Z_NULL)
-+ return Z_STREAM_ERROR;
-+/* if (z->zalloc == Z_NULL) z->zalloc = zcalloc; */
-+/* if (z->zfree == Z_NULL) z->zfree = zcfree; */
-+ if ((z->state = (struct internal_state FAR *)
-+ ZALLOC(z,1,sizeof(struct internal_state))) == Z_NULL)
-+ return Z_MEM_ERROR;
-+ z->state->blocks = Z_NULL;
-+
-+ /* handle undocumented nowrap option (no zlib header or check) */
-+ z->state->nowrap = 0;
-+ if (w < 0)
-+ {
-+ w = - w;
-+ z->state->nowrap = 1;
-+ }
-+
-+ /* set window size */
-+ if (w < 8 || w > 15)
-+ {
-+ inflateEnd(z);
-+ return Z_STREAM_ERROR;
-+ }
-+ z->state->wbits = (uInt)w;
-+
-+ /* create inflate_blocks state */
-+ if ((z->state->blocks =
-+ inflate_blocks_new(z, z->state->nowrap ? Z_NULL : adler32, 1 << w))
-+ == Z_NULL)
-+ {
-+ inflateEnd(z);
-+ return Z_MEM_ERROR;
-+ }
-+ Trace((stderr, "inflate: allocated\n"));
-+
-+ /* reset state */
-+ inflateReset(z);
-+ return Z_OK;
-+}
-+
-+
-+int inflateInit(z)
-+z_stream *z;
-+{
-+ return inflateInit2(z, DEF_WBITS);
-+}
-+
-+
-+#define NEEDBYTE {if(z->avail_in==0)goto empty;r=Z_OK;}
-+#define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++)
-+
-+int inflate(z, f)
-+z_stream *z;
-+int f;
-+{
-+ int r;
-+ uInt b;
-+
-+ if (z == Z_NULL || z->next_in == Z_NULL)
-+ return Z_STREAM_ERROR;
-+ r = Z_BUF_ERROR;
-+ while (1) switch (z->state->mode)
-+ {
-+ case METHOD:
-+ NEEDBYTE
-+ if (((z->state->sub.method = NEXTBYTE) & 0xf) != DEFLATED)
-+ {
-+ z->state->mode = BAD;
-+ z->msg = "unknown compression method";
-+ z->state->sub.marker = 5; /* can't try inflateSync */
-+ break;
-+ }
-+ if ((z->state->sub.method >> 4) + 8 > z->state->wbits)
-+ {
-+ z->state->mode = BAD;
-+ z->msg = "invalid window size";
-+ z->state->sub.marker = 5; /* can't try inflateSync */
-+ break;
-+ }
-+ z->state->mode = FLAG;
-+ case FLAG:
-+ NEEDBYTE
-+ if ((b = NEXTBYTE) & 0x20)
-+ {
-+ z->state->mode = BAD;
-+ z->msg = "invalid reserved bit";
-+ z->state->sub.marker = 5; /* can't try inflateSync */
-+ break;
-+ }
-+ if (((z->state->sub.method << 8) + b) % 31)
-+ {
-+ z->state->mode = BAD;
-+ z->msg = "incorrect header check";
-+ z->state->sub.marker = 5; /* can't try inflateSync */
-+ break;
-+ }
-+ Trace((stderr, "inflate: zlib header ok\n"));
-+ z->state->mode = BLOCKS;
-+ case BLOCKS:
-+ r = inflate_blocks(z->state->blocks, z, r);
-+ if (f == Z_PACKET_FLUSH && z->avail_in == 0 && z->avail_out != 0)
-+ r = inflate_packet_flush(z->state->blocks);
-+ if (r == Z_DATA_ERROR)
-+ {
-+ z->state->mode = BAD;
-+ z->state->sub.marker = 0; /* can try inflateSync */
-+ break;
-+ }
-+ if (r != Z_STREAM_END)
-+ return r;
-+ r = Z_OK;
-+ inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was);
-+ if (z->state->nowrap)
-+ {
-+ z->state->mode = DONE;
-+ break;
-+ }
-+ z->state->mode = CHECK4;
-+ case CHECK4:
-+ NEEDBYTE
-+ z->state->sub.check.need = (uLong)NEXTBYTE << 24;
-+ z->state->mode = CHECK3;
-+ case CHECK3:
-+ NEEDBYTE
-+ z->state->sub.check.need += (uLong)NEXTBYTE << 16;
-+ z->state->mode = CHECK2;
-+ case CHECK2:
-+ NEEDBYTE
-+ z->state->sub.check.need += (uLong)NEXTBYTE << 8;
-+ z->state->mode = CHECK1;
-+ case CHECK1:
-+ NEEDBYTE
-+ z->state->sub.check.need += (uLong)NEXTBYTE;
-+
-+ if (z->state->sub.check.was != z->state->sub.check.need)
-+ {
-+ z->state->mode = BAD;
-+ z->msg = "incorrect data check";
-+ z->state->sub.marker = 5; /* can't try inflateSync */
-+ break;
-+ }
-+ Trace((stderr, "inflate: zlib check ok\n"));
-+ z->state->mode = DONE;
-+ case DONE:
-+ return Z_STREAM_END;
-+ case BAD:
-+ return Z_DATA_ERROR;
-+ default:
-+ return Z_STREAM_ERROR;
-+ }
-+
-+ empty:
-+ if (f != Z_PACKET_FLUSH)
-+ return r;
-+ z->state->mode = BAD;
-+ z->state->sub.marker = 0; /* can try inflateSync */
-+ return Z_DATA_ERROR;
-+}
-+
-+/*
-+ * This subroutine adds the data at next_in/avail_in to the output history
-+ * without performing any output. The output buffer must be "caught up";
-+ * i.e. no pending output (hence s->read equals s->write), and the state must
-+ * be BLOCKS (i.e. we should be willing to see the start of a series of
-+ * BLOCKS). On exit, the output will also be caught up, and the checksum
-+ * will have been updated if need be.
-+ */
-+
-+int inflateIncomp(z)
-+z_stream *z;
-+{
-+ if (z->state->mode != BLOCKS)
-+ return Z_DATA_ERROR;
-+ return inflate_addhistory(z->state->blocks, z);
-+}
-+
-+
-+int inflateSync(z)
-+z_stream *z;
-+{
-+ uInt n; /* number of bytes to look at */
-+ Bytef *p; /* pointer to bytes */
-+ uInt m; /* number of marker bytes found in a row */
-+ uLong r, w; /* temporaries to save total_in and total_out */
-+
-+ /* set up */
-+ if (z == Z_NULL || z->state == Z_NULL)
-+ return Z_STREAM_ERROR;
-+ if (z->state->mode != BAD)
-+ {
-+ z->state->mode = BAD;
-+ z->state->sub.marker = 0;
-+ }
-+ if ((n = z->avail_in) == 0)
-+ return Z_BUF_ERROR;
-+ p = z->next_in;
-+ m = z->state->sub.marker;
-+
-+ /* search */
-+ while (n && m < 4)
-+ {
-+ if (*p == (Byte)(m < 2 ? 0 : 0xff))
-+ m++;
-+ else if (*p)
-+ m = 0;
-+ else
-+ m = 4 - m;
-+ p++, n--;
-+ }
-+
-+ /* restore */
-+ z->total_in += p - z->next_in;
-+ z->next_in = p;
-+ z->avail_in = n;
-+ z->state->sub.marker = m;
-+
-+ /* return no joy or set up to restart on a new block */
-+ if (m != 4)
-+ return Z_DATA_ERROR;
-+ r = z->total_in; w = z->total_out;
-+ inflateReset(z);
-+ z->total_in = r; z->total_out = w;
-+ z->state->mode = BLOCKS;
-+ return Z_OK;
-+}
-+
-+#undef NEEDBYTE
-+#undef NEXTBYTE
-+
-+/*+++++*/
-+/* infutil.h -- types and macros common to blocks and codes
-+ * Copyright (C) 1995 Mark Adler
-+ * For conditions of distribution and use, see copyright notice in zlib.h
-+ */
-+
-+/* WARNING: this file should *not* be used by applications. It is
-+ part of the implementation of the compression library and is
-+ subject to change. Applications should only use zlib.h.
-+ */
-+
-+/* inflate blocks semi-private state */
-+struct inflate_blocks_state {
-+
-+ /* mode */
-+ enum {
-+ TYPE, /* get type bits (3, including end bit) */
-+ LENS, /* get lengths for stored */
-+ STORED, /* processing stored block */
-+ TABLE, /* get table lengths */
-+ BTREE, /* get bit lengths tree for a dynamic block */
-+ DTREE, /* get length, distance trees for a dynamic block */
-+ CODES, /* processing fixed or dynamic block */
-+ DRY, /* output remaining window bytes */
-+ DONEB, /* finished last block, done */
-+ BADB} /* got a data error--stuck here */
-+ mode; /* current inflate_block mode */
-+
-+ /* mode dependent information */
-+ union {
-+ uInt left; /* if STORED, bytes left to copy */
-+ struct {
-+ uInt table; /* table lengths (14 bits) */
-+ uInt index; /* index into blens (or border) */
-+ uIntf *blens; /* bit lengths of codes */
-+ uInt bb; /* bit length tree depth */
-+ inflate_huft *tb; /* bit length decoding tree */
-+ int nblens; /* # elements allocated at blens */
-+ } trees; /* if DTREE, decoding info for trees */
-+ struct {
-+ inflate_huft *tl, *td; /* trees to free */
-+ inflate_codes_statef
-+ *codes;
-+ } decode; /* if CODES, current state */
-+ } sub; /* submode */
-+ uInt last; /* true if this block is the last block */
-+
-+ /* mode independent information */
-+ uInt bitk; /* bits in bit buffer */
-+ uLong bitb; /* bit buffer */
-+ Bytef *window; /* sliding window */
-+ Bytef *end; /* one byte after sliding window */
-+ Bytef *read; /* window read pointer */
-+ Bytef *write; /* window write pointer */
-+ check_func checkfn; /* check function */
-+ uLong check; /* check on output */
-+
-+};
-+
-+
-+/* defines for inflate input/output */
-+/* update pointers and return */
-+#define UPDBITS {s->bitb=b;s->bitk=k;}
-+#define UPDIN {z->avail_in=n;z->total_in+=p-z->next_in;z->next_in=p;}
-+#define UPDOUT {s->write=q;}
-+#define UPDATE {UPDBITS UPDIN UPDOUT}
-+#define LEAVE {UPDATE return inflate_flush(s,z,r);}
-+/* get bytes and bits */
-+#define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;}
-+#define NEEDBYTE {if(n)r=Z_OK;else LEAVE}
-+#define NEXTBYTE (n--,*p++)
-+#define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}}
-+#define DUMPBITS(j) {b>>=(j);k-=(j);}
-+/* output bytes */
-+#define WAVAIL (q<s->read?s->read-q-1:s->end-q)
-+#define LOADOUT {q=s->write;m=WAVAIL;}
-+#define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=WAVAIL;}}
-+#define FLUSH {UPDOUT r=inflate_flush(s,z,r); LOADOUT}
-+#define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE}}r=Z_OK;}
-+#define OUTBYTE(a) {*q++=(Byte)(a);m--;}
-+/* load local pointers */
-+#define LOAD {LOADIN LOADOUT}
-+
-+/*
-+ * The IBM 150 firmware munges the data right after _etext[]. This
-+ * protects it. -- Cort
-+ */
-+local uInt protect_mask[] = {0, 0, 0, 0, 0, 0, 0, 0, 0 ,0 ,0 ,0};
-+/* And'ing with mask[n] masks the lower n bits */
-+local uInt inflate_mask[] = {
-+ 0x0000,
-+ 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff,
-+ 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff
-+};
-+
-+/* copy as much as possible from the sliding window to the output area */
-+local int inflate_flush OF((
-+ inflate_blocks_statef *,
-+ z_stream *,
-+ int));
-+
-+/*+++++*/
-+/* inffast.h -- header to use inffast.c
-+ * Copyright (C) 1995 Mark Adler
-+ * For conditions of distribution and use, see copyright notice in zlib.h
-+ */
-+
-+/* WARNING: this file should *not* be used by applications. It is
-+ part of the implementation of the compression library and is
-+ subject to change. Applications should only use zlib.h.
-+ */
-+
-+local int inflate_fast OF((
-+ uInt,
-+ uInt,
-+ inflate_huft *,
-+ inflate_huft *,
-+ inflate_blocks_statef *,
-+ z_stream *));
-+
-+
-+/*+++++*/
-+/* infblock.c -- interpret and process block types to last block
-+ * Copyright (C) 1995 Mark Adler
-+ * For conditions of distribution and use, see copyright notice in zlib.h
-+ */
-+
-+/* Table for deflate from PKZIP's appnote.txt. */
-+local uInt border[] = { /* Order of the bit length code lengths */
-+ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
-+
-+/*
-+ Notes beyond the 1.93a appnote.txt:
-+
-+ 1. Distance pointers never point before the beginning of the output
-+ stream.
-+ 2. Distance pointers can point back across blocks, up to 32k away.
-+ 3. There is an implied maximum of 7 bits for the bit length table and
-+ 15 bits for the actual data.
-+ 4. If only one code exists, then it is encoded using one bit. (Zero
-+ would be more efficient, but perhaps a little confusing.) If two
-+ codes exist, they are coded using one bit each (0 and 1).
-+ 5. There is no way of sending zero distance codes--a dummy must be
-+ sent if there are none. (History: a pre 2.0 version of PKZIP would
-+ store blocks with no distance codes, but this was discovered to be
-+ too harsh a criterion.) Valid only for 1.93a. 2.04c does allow
-+ zero distance codes, which is sent as one code of zero bits in
-+ length.
-+ 6. There are up to 286 literal/length codes. Code 256 represents the
-+ end-of-block. Note however that the static length tree defines
-+ 288 codes just to fill out the Huffman codes. Codes 286 and 287
-+ cannot be used though, since there is no length base or extra bits
-+ defined for them. Similarily, there are up to 30 distance codes.
-+ However, static trees define 32 codes (all 5 bits) to fill out the
-+ Huffman codes, but the last two had better not show up in the data.
-+ 7. Unzip can check dynamic Huffman blocks for complete code sets.
-+ The exception is that a single code would not be complete (see #4).
-+ 8. The five bits following the block type is really the number of
-+ literal codes sent minus 257.
-+ 9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits
-+ (1+6+6). Therefore, to output three times the length, you output
-+ three codes (1+1+1), whereas to output four times the same length,
-+ you only need two codes (1+3). Hmm.
-+ 10. In the tree reconstruction algorithm, Code = Code + Increment
-+ only if BitLength(i) is not zero. (Pretty obvious.)
-+ 11. Correction: 4 Bits: # of Bit Length codes - 4 (4 - 19)
-+ 12. Note: length code 284 can represent 227-258, but length code 285
-+ really is 258. The last length deserves its own, short code
-+ since it gets used a lot in very redundant files. The length
-+ 258 is special since 258 - 3 (the min match length) is 255.
-+ 13. The literal/length and distance code bit lengths are read as a
-+ single stream of lengths. It is possible (and advantageous) for
-+ a repeat code (16, 17, or 18) to go across the boundary between
-+ the two sets of lengths.
-+ */
-+
-+
-+local void inflate_blocks_reset(s, z, c)
-+inflate_blocks_statef *s;
-+z_stream *z;
-+uLongf *c;
-+{
-+ if (s->checkfn != Z_NULL)
-+ *c = s->check;
-+ if (s->mode == BTREE || s->mode == DTREE)
-+ ZFREE(z, s->sub.trees.blens, s->sub.trees.nblens * sizeof(uInt));
-+ if (s->mode == CODES)
-+ {
-+ inflate_codes_free(s->sub.decode.codes, z);
-+ inflate_trees_free(s->sub.decode.td, z);
-+ inflate_trees_free(s->sub.decode.tl, z);
-+ }
-+ s->mode = TYPE;
-+ s->bitk = 0;
-+ s->bitb = 0;
-+ s->read = s->write = s->window;
-+ if (s->checkfn != Z_NULL)
-+ s->check = (*s->checkfn)(0L, Z_NULL, 0);
-+ Trace((stderr, "inflate: blocks reset\n"));
-+}
-+
-+
-+local inflate_blocks_statef *inflate_blocks_new(z, c, w)
-+z_stream *z;
-+check_func c;
-+uInt w;
-+{
-+ inflate_blocks_statef *s;
-+
-+ if ((s = (inflate_blocks_statef *)ZALLOC
-+ (z,1,sizeof(struct inflate_blocks_state))) == Z_NULL)
-+ return s;
-+ if ((s->window = (Bytef *)ZALLOC(z, 1, w)) == Z_NULL)
-+ {
-+ ZFREE(z, s, sizeof(struct inflate_blocks_state));
-+ return Z_NULL;
-+ }
-+ s->end = s->window + w;
-+ s->checkfn = c;
-+ s->mode = TYPE;
-+ Trace((stderr, "inflate: blocks allocated\n"));
-+ inflate_blocks_reset(s, z, &s->check);
-+ return s;
-+}
-+
-+
-+local int inflate_blocks(s, z, r)
-+inflate_blocks_statef *s;
-+z_stream *z;
-+int r;
-+{
-+ uInt t; /* temporary storage */
-+ uLong b; /* bit buffer */
-+ uInt k; /* bits in bit buffer */
-+ Bytef *p; /* input data pointer */
-+ uInt n; /* bytes available there */
-+ Bytef *q; /* output window write pointer */
-+ uInt m; /* bytes to end of window or read pointer */
-+
-+ /* copy input/output information to locals (UPDATE macro restores) */
-+ LOAD
-+
-+ /* process input based on current state */
-+ while (1) switch (s->mode)
-+ {
-+ case TYPE:
-+ NEEDBITS(3)
-+ t = (uInt)b & 7;
-+ s->last = t & 1;
-+ switch (t >> 1)
-+ {
-+ case 0: /* stored */
-+ Trace((stderr, "inflate: stored block%s\n",
-+ s->last ? " (last)" : ""));
-+ DUMPBITS(3)
-+ t = k & 7; /* go to byte boundary */
-+ DUMPBITS(t)
-+ s->mode = LENS; /* get length of stored block */
-+ break;
-+ case 1: /* fixed */
-+ Trace((stderr, "inflate: fixed codes block%s\n",
-+ s->last ? " (last)" : ""));
-+ {
-+ uInt bl, bd;
-+ inflate_huft *tl, *td;
-+
-+ inflate_trees_fixed(&bl, &bd, &tl, &td);
-+ s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z);
-+ if (s->sub.decode.codes == Z_NULL)
-+ {
-+ r = Z_MEM_ERROR;
-+ LEAVE
-+ }
-+ s->sub.decode.tl = Z_NULL; /* don't try to free these */
-+ s->sub.decode.td = Z_NULL;
-+ }
-+ DUMPBITS(3)
-+ s->mode = CODES;
-+ break;
-+ case 2: /* dynamic */
-+ Trace((stderr, "inflate: dynamic codes block%s\n",
-+ s->last ? " (last)" : ""));
-+ DUMPBITS(3)
-+ s->mode = TABLE;
-+ break;
-+ case 3: /* illegal */
-+ DUMPBITS(3)
-+ s->mode = BADB;
-+ z->msg = "invalid block type";
-+ r = Z_DATA_ERROR;
-+ LEAVE
-+ }
-+ break;
-+ case LENS:
-+ NEEDBITS(32)
-+ if (((~b) >> 16) != (b & 0xffff))
-+ {
-+ s->mode = BADB;
-+ z->msg = "invalid stored block lengths";
-+ r = Z_DATA_ERROR;
-+ LEAVE
-+ }
-+ s->sub.left = (uInt)b & 0xffff;
-+ b = k = 0; /* dump bits */
-+ Tracev((stderr, "inflate: stored length %u\n", s->sub.left));
-+ s->mode = s->sub.left ? STORED : TYPE;
-+ break;
-+ case STORED:
-+ if (n == 0)
-+ LEAVE
-+ NEEDOUT
-+ t = s->sub.left;
-+ if (t > n) t = n;
-+ if (t > m) t = m;
-+ zmemcpy(q, p, t);
-+ p += t; n -= t;
-+ q += t; m -= t;
-+ if ((s->sub.left -= t) != 0)
-+ break;
-+ Tracev((stderr, "inflate: stored end, %lu total out\n",
-+ z->total_out + (q >= s->read ? q - s->read :
-+ (s->end - s->read) + (q - s->window))));
-+ s->mode = s->last ? DRY : TYPE;
-+ break;
-+ case TABLE:
-+ NEEDBITS(14)
-+ s->sub.trees.table = t = (uInt)b & 0x3fff;
-+#ifndef PKZIP_BUG_WORKAROUND
-+ if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29)
-+ {
-+ s->mode = BADB;
-+ z->msg = "too many length or distance symbols";
-+ r = Z_DATA_ERROR;
-+ LEAVE
-+ }
-+#endif
-+ t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f);
-+ if (t < 19)
-+ t = 19;
-+ if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL)
-+ {
-+ r = Z_MEM_ERROR;
-+ LEAVE
-+ }
-+ s->sub.trees.nblens = t;
-+ DUMPBITS(14)
-+ s->sub.trees.index = 0;
-+ Tracev((stderr, "inflate: table sizes ok\n"));
-+ s->mode = BTREE;
-+ case BTREE:
-+ while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10))
-+ {
-+ NEEDBITS(3)
-+ s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7;
-+ DUMPBITS(3)
-+ }
-+ while (s->sub.trees.index < 19)
-+ s->sub.trees.blens[border[s->sub.trees.index++]] = 0;
-+ s->sub.trees.bb = 7;
-+ t = inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb,
-+ &s->sub.trees.tb, z);
-+ if (t != Z_OK)
-+ {
-+ r = t;
-+ if (r == Z_DATA_ERROR)
-+ s->mode = BADB;
-+ LEAVE
-+ }
-+ s->sub.trees.index = 0;
-+ Tracev((stderr, "inflate: bits tree ok\n"));
-+ s->mode = DTREE;
-+ case DTREE:
-+ while (t = s->sub.trees.table,
-+ s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f))
-+ {
-+ inflate_huft *h;
-+ uInt i, j, c;
-+
-+ t = s->sub.trees.bb;
-+ NEEDBITS(t)
-+ h = s->sub.trees.tb + ((uInt)b & inflate_mask[t]);
-+ t = h->word.what.Bits;
-+ c = h->more.Base;
-+ if (c < 16)
-+ {
-+ DUMPBITS(t)
-+ s->sub.trees.blens[s->sub.trees.index++] = c;
-+ }
-+ else /* c == 16..18 */
-+ {
-+ i = c == 18 ? 7 : c - 14;
-+ j = c == 18 ? 11 : 3;
-+ NEEDBITS(t + i)
-+ DUMPBITS(t)
-+ j += (uInt)b & inflate_mask[i];
-+ DUMPBITS(i)
-+ i = s->sub.trees.index;
-+ t = s->sub.trees.table;
-+ if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) ||
-+ (c == 16 && i < 1))
-+ {
-+ s->mode = BADB;
-+ z->msg = "invalid bit length repeat";
-+ r = Z_DATA_ERROR;
-+ LEAVE
-+ }
-+ c = c == 16 ? s->sub.trees.blens[i - 1] : 0;
-+ do {
-+ s->sub.trees.blens[i++] = c;
-+ } while (--j);
-+ s->sub.trees.index = i;
-+ }
-+ }
-+ inflate_trees_free(s->sub.trees.tb, z);
-+ s->sub.trees.tb = Z_NULL;
-+ {
-+ uInt bl, bd;
-+ inflate_huft *tl, *td;
-+ inflate_codes_statef *c;
-+
-+ bl = 9; /* must be <= 9 for lookahead assumptions */
-+ bd = 6; /* must be <= 9 for lookahead assumptions */
-+ t = s->sub.trees.table;
-+ t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f),
-+ s->sub.trees.blens, &bl, &bd, &tl, &td, z);
-+ if (t != Z_OK)
-+ {
-+ if (t == (uInt)Z_DATA_ERROR)
-+ s->mode = BADB;
-+ r = t;
-+ LEAVE
-+ }
-+ Tracev((stderr, "inflate: trees ok\n"));
-+ if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL)
-+ {
-+ inflate_trees_free(td, z);
-+ inflate_trees_free(tl, z);
-+ r = Z_MEM_ERROR;
-+ LEAVE
-+ }
-+ ZFREE(z, s->sub.trees.blens, s->sub.trees.nblens * sizeof(uInt));
-+ s->sub.decode.codes = c;
-+ s->sub.decode.tl = tl;
-+ s->sub.decode.td = td;
-+ }
-+ s->mode = CODES;
-+ case CODES:
-+ UPDATE
-+ if ((r = inflate_codes(s, z, r)) != Z_STREAM_END)
-+ return inflate_flush(s, z, r);
-+ r = Z_OK;
-+ inflate_codes_free(s->sub.decode.codes, z);
-+ inflate_trees_free(s->sub.decode.td, z);
-+ inflate_trees_free(s->sub.decode.tl, z);
-+ LOAD
-+ Tracev((stderr, "inflate: codes end, %lu total out\n",
-+ z->total_out + (q >= s->read ? q - s->read :
-+ (s->end - s->read) + (q - s->window))));
-+ if (!s->last)
-+ {
-+ s->mode = TYPE;
-+ break;
-+ }
-+ if (k > 7) /* return unused byte, if any */
-+ {
-+ Assert(k < 16, "inflate_codes grabbed too many bytes")
-+ k -= 8;
-+ n++;
-+ p--; /* can always return one */
-+ }
-+ s->mode = DRY;
-+ case DRY:
-+ FLUSH
-+ if (s->read != s->write)
-+ LEAVE
-+ s->mode = DONEB;
-+ case DONEB:
-+ r = Z_STREAM_END;
-+ LEAVE
-+ case BADB:
-+ r = Z_DATA_ERROR;
-+ LEAVE
-+ default:
-+ r = Z_STREAM_ERROR;
-+ LEAVE
-+ }
-+}
-+
-+
-+local int inflate_blocks_free(s, z, c)
-+inflate_blocks_statef *s;
-+z_stream *z;
-+uLongf *c;
-+{
-+ inflate_blocks_reset(s, z, c);
-+ ZFREE(z, s->window, s->end - s->window);
-+ ZFREE(z, s, sizeof(struct inflate_blocks_state));
-+ Trace((stderr, "inflate: blocks freed\n"));
-+ return Z_OK;
-+}
-+
-+/*
-+ * This subroutine adds the data at next_in/avail_in to the output history
-+ * without performing any output. The output buffer must be "caught up";
-+ * i.e. no pending output (hence s->read equals s->write), and the state must
-+ * be BLOCKS (i.e. we should be willing to see the start of a series of
-+ * BLOCKS). On exit, the output will also be caught up, and the checksum
-+ * will have been updated if need be.
-+ */
-+local int inflate_addhistory(s, z)
-+inflate_blocks_statef *s;
-+z_stream *z;
-+{
-+ uLong b; /* bit buffer */ /* NOT USED HERE */
-+ uInt k; /* bits in bit buffer */ /* NOT USED HERE */
-+ uInt t; /* temporary storage */
-+ Bytef *p; /* input data pointer */
-+ uInt n; /* bytes available there */
-+ Bytef *q; /* output window write pointer */
-+ uInt m; /* bytes to end of window or read pointer */
-+
-+ if (s->read != s->write)
-+ return Z_STREAM_ERROR;
-+ if (s->mode != TYPE)
-+ return Z_DATA_ERROR;
-+
-+ /* we're ready to rock */
-+ LOAD
-+ /* while there is input ready, copy to output buffer, moving
-+ * pointers as needed.
-+ */
-+ while (n) {
-+ t = n; /* how many to do */
-+ /* is there room until end of buffer? */
-+ if (t > m) t = m;
-+ /* update check information */
-+ if (s->checkfn != Z_NULL)
-+ s->check = (*s->checkfn)(s->check, q, t);
-+ zmemcpy(q, p, t);
-+ q += t;
-+ p += t;
-+ n -= t;
-+ z->total_out += t;
-+ s->read = q; /* drag read pointer forward */
-+/* WRAP */ /* expand WRAP macro by hand to handle s->read */
-+ if (q == s->end) {
-+ s->read = q = s->window;
-+ m = WAVAIL;
-+ }
-+ }
-+ UPDATE
-+ return Z_OK;
-+}
-+
-+
-+/*
-+ * At the end of a Deflate-compressed PPP packet, we expect to have seen
-+ * a `stored' block type value but not the (zero) length bytes.
-+ */
-+local int inflate_packet_flush(s)
-+ inflate_blocks_statef *s;
-+{
-+ if (s->mode != LENS)
-+ return Z_DATA_ERROR;
-+ s->mode = TYPE;
-+ return Z_OK;
-+}
-+
-+
-+/*+++++*/
-+/* inftrees.c -- generate Huffman trees for efficient decoding
-+ * Copyright (C) 1995 Mark Adler
-+ * For conditions of distribution and use, see copyright notice in zlib.h
-+ */
-+
-+/* simplify the use of the inflate_huft type with some defines */
-+#define base more.Base
-+#define next more.Next
-+#define exop word.what.Exop
-+#define bits word.what.Bits
-+
-+
-+local int huft_build OF((
-+ uIntf *, /* code lengths in bits */
-+ uInt, /* number of codes */
-+ uInt, /* number of "simple" codes */
-+ uIntf *, /* list of base values for non-simple codes */
-+ uIntf *, /* list of extra bits for non-simple codes */
-+ inflate_huft * FAR*,/* result: starting table */
-+ uIntf *, /* maximum lookup bits (returns actual) */
-+ z_stream *)); /* for zalloc function */
-+
-+local voidpf falloc OF((
-+ voidpf, /* opaque pointer (not used) */
-+ uInt, /* number of items */
-+ uInt)); /* size of item */
-+
-+local void ffree OF((
-+ voidpf q, /* opaque pointer (not used) */
-+ voidpf p, /* what to free (not used) */
-+ uInt n)); /* number of bytes (not used) */
-+
-+/* Tables for deflate from PKZIP's appnote.txt. */
-+local uInt cplens[] = { /* Copy lengths for literal codes 257..285 */
-+ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
-+ 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
-+ /* actually lengths - 2; also see note #13 above about 258 */
-+local uInt cplext[] = { /* Extra bits for literal codes 257..285 */
-+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
-+ 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 192, 192}; /* 192==invalid */
-+local uInt cpdist[] = { /* Copy offsets for distance codes 0..29 */
-+ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
-+ 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
-+ 8193, 12289, 16385, 24577};
-+local uInt cpdext[] = { /* Extra bits for distance codes */
-+ 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
-+ 7, 7, 8, 8, 9, 9, 10, 10, 11, 11,
-+ 12, 12, 13, 13};
-+
-+/*
-+ Huffman code decoding is performed using a multi-level table lookup.
-+ The fastest way to decode is to simply build a lookup table whose
-+ size is determined by the longest code. However, the time it takes
-+ to build this table can also be a factor if the data being decoded
-+ is not very long. The most common codes are necessarily the
-+ shortest codes, so those codes dominate the decoding time, and hence
-+ the speed. The idea is you can have a shorter table that decodes the
-+ shorter, more probable codes, and then point to subsidiary tables for
-+ the longer codes. The time it costs to decode the longer codes is
-+ then traded against the time it takes to make longer tables.
-+
-+ This results of this trade are in the variables lbits and dbits
-+ below. lbits is the number of bits the first level table for literal/
-+ length codes can decode in one step, and dbits is the same thing for
-+ the distance codes. Subsequent tables are also less than or equal to
-+ those sizes. These values may be adjusted either when all of the
-+ codes are shorter than that, in which case the longest code length in
-+ bits is used, or when the shortest code is *longer* than the requested
-+ table size, in which case the length of the shortest code in bits is
-+ used.
-+
-+ There are two different values for the two tables, since they code a
-+ different number of possibilities each. The literal/length table
-+ codes 286 possible values, or in a flat code, a little over eight
-+ bits. The distance table codes 30 possible values, or a little less
-+ than five bits, flat. The optimum values for speed end up being
-+ about one bit more than those, so lbits is 8+1 and dbits is 5+1.
-+ The optimum values may differ though from machine to machine, and
-+ possibly even between compilers. Your mileage may vary.
-+ */
-+
-+
-+/* If BMAX needs to be larger than 16, then h and x[] should be uLong. */
-+#define BMAX 15 /* maximum bit length of any code */
-+#define N_MAX 288 /* maximum number of codes in any set */
-+
-+#ifdef DEBUG_ZLIB
-+ uInt inflate_hufts;
-+#endif
-+
-+local int huft_build(b, n, s, d, e, t, m, zs)
-+uIntf *b; /* code lengths in bits (all assumed <= BMAX) */
-+uInt n; /* number of codes (assumed <= N_MAX) */
-+uInt s; /* number of simple-valued codes (0..s-1) */
-+uIntf *d; /* list of base values for non-simple codes */
-+uIntf *e; /* list of extra bits for non-simple codes */
-+inflate_huft * FAR *t; /* result: starting table */
-+uIntf *m; /* maximum lookup bits, returns actual */
-+z_stream *zs; /* for zalloc function */
-+/* Given a list of code lengths and a maximum table size, make a set of
-+ tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR
-+ if the given code set is incomplete (the tables are still built in this
-+ case), Z_DATA_ERROR if the input is invalid (all zero length codes or an
-+ over-subscribed set of lengths), or Z_MEM_ERROR if not enough memory. */
-+{
-+
-+ uInt a; /* counter for codes of length k */
-+ uInt c[BMAX+1]; /* bit length count table */
-+ uInt f; /* i repeats in table every f entries */
-+ int g; /* maximum code length */
-+ int h; /* table level */
-+ register uInt i; /* counter, current code */
-+ register uInt j; /* counter */
-+ register int k; /* number of bits in current code */
-+ int l; /* bits per table (returned in m) */
-+ register uIntf *p; /* pointer into c[], b[], or v[] */
-+ inflate_huft *q; /* points to current table */
-+ struct inflate_huft_s r; /* table entry for structure assignment */
-+ inflate_huft *u[BMAX]; /* table stack */
-+ uInt v[N_MAX]; /* values in order of bit length */
-+ register int w; /* bits before this table == (l * h) */
-+ uInt x[BMAX+1]; /* bit offsets, then code stack */
-+ uIntf *xp; /* pointer into x */
-+ int y; /* number of dummy codes added */
-+ uInt z; /* number of entries in current table */
-+
-+
-+ /* Generate counts for each bit length */
-+ p = c;
-+#define C0 *p++ = 0;
-+#define C2 C0 C0 C0 C0
-+#define C4 C2 C2 C2 C2
-+ C4 /* clear c[]--assume BMAX+1 is 16 */
-+ p = b; i = n;
-+ do {
-+ c[*p++]++; /* assume all entries <= BMAX */
-+ } while (--i);
-+ if (c[0] == n) /* null input--all zero length codes */
-+ {
-+ *t = (inflate_huft *)Z_NULL;
-+ *m = 0;
-+ return Z_OK;
-+ }
-+
-+
-+ /* Find minimum and maximum length, bound *m by those */
-+ l = *m;
-+ for (j = 1; j <= BMAX; j++)
-+ if (c[j])
-+ break;
-+ k = j; /* minimum code length */
-+ if ((uInt)l < j)
-+ l = j;
-+ for (i = BMAX; i; i--)
-+ if (c[i])
-+ break;
-+ g = i; /* maximum code length */
-+ if ((uInt)l > i)
-+ l = i;
-+ *m = l;
-+
-+
-+ /* Adjust last length count to fill out codes, if needed */
-+ for (y = 1 << j; j < i; j++, y <<= 1)
-+ if ((y -= c[j]) < 0)
-+ return Z_DATA_ERROR;
-+ if ((y -= c[i]) < 0)
-+ return Z_DATA_ERROR;
-+ c[i] += y;
-+
-+
-+ /* Generate starting offsets into the value table for each length */
-+ x[1] = j = 0;
-+ p = c + 1; xp = x + 2;
-+ while (--i) { /* note that i == g from above */
-+ *xp++ = (j += *p++);
-+ }
-+
-+
-+ /* Make a table of values in order of bit lengths */
-+ p = b; i = 0;
-+ do {
-+ if ((j = *p++) != 0)
-+ v[x[j]++] = i;
-+ } while (++i < n);
-+
-+
-+ /* Generate the Huffman codes and for each, make the table entries */
-+ x[0] = i = 0; /* first Huffman code is zero */
-+ p = v; /* grab values in bit order */
-+ h = -1; /* no tables yet--level -1 */
-+ w = -l; /* bits decoded == (l * h) */
-+ u[0] = (inflate_huft *)Z_NULL; /* just to keep compilers happy */
-+ q = (inflate_huft *)Z_NULL; /* ditto */
-+ z = 0; /* ditto */
-+
-+ /* go through the bit lengths (k already is bits in shortest code) */
-+ for (; k <= g; k++)
-+ {
-+ a = c[k];
-+ while (a--)
-+ {
-+ /* here i is the Huffman code of length k bits for value *p */
-+ /* make tables up to required level */
-+ while (k > w + l)
-+ {
-+ h++;
-+ w += l; /* previous table always l bits */
-+
-+ /* compute minimum size table less than or equal to l bits */
-+ z = (z = g - w) > (uInt)l ? l : z; /* table size upper limit */
-+ if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */
-+ { /* too few codes for k-w bit table */
-+ f -= a + 1; /* deduct codes from patterns left */
-+ xp = c + k;
-+ if (j < z)
-+ while (++j < z) /* try smaller tables up to z bits */
-+ {
-+ if ((f <<= 1) <= *++xp)
-+ break; /* enough codes to use up j bits */
-+ f -= *xp; /* else deduct codes from patterns */
-+ }
-+ }
-+ z = 1 << j; /* table entries for j-bit table */
-+
-+ /* allocate and link in new table */
-+ if ((q = (inflate_huft *)ZALLOC
-+ (zs,z + 1,sizeof(inflate_huft))) == Z_NULL)
-+ {
-+ if (h)
-+ inflate_trees_free(u[0], zs);
-+ return Z_MEM_ERROR; /* not enough memory */
-+ }
-+ q->word.Nalloc = z + 1;
-+#ifdef DEBUG_ZLIB
-+ inflate_hufts += z + 1;
-+#endif
-+ *t = q + 1; /* link to list for huft_free() */
-+ *(t = &(q->next)) = Z_NULL;
-+ u[h] = ++q; /* table starts after link */
-+
-+ /* connect to last table, if there is one */
-+ if (h)
-+ {
-+ x[h] = i; /* save pattern for backing up */
-+ r.bits = (Byte)l; /* bits to dump before this table */
-+ r.exop = (Byte)j; /* bits in this table */
-+ r.next = q; /* pointer to this table */
-+ j = i >> (w - l); /* (get around Turbo C bug) */
-+ u[h-1][j] = r; /* connect to last table */
-+ }
-+ }
-+
-+ /* set up table entry in r */
-+ r.bits = (Byte)(k - w);
-+ if (p >= v + n)
-+ r.exop = 128 + 64; /* out of values--invalid code */
-+ else if (*p < s)
-+ {
-+ r.exop = (Byte)(*p < 256 ? 0 : 32 + 64); /* 256 is end-of-block */
-+ r.base = *p++; /* simple code is just the value */
-+ }
-+ else
-+ {
-+ r.exop = (Byte)e[*p - s] + 16 + 64; /* non-simple--look up in lists */
-+ r.base = d[*p++ - s];
-+ }
-+
-+ /* fill code-like entries with r */
-+ f = 1 << (k - w);
-+ for (j = i >> w; j < z; j += f)
-+ q[j] = r;
-+
-+ /* backwards increment the k-bit code i */
-+ for (j = 1 << (k - 1); i & j; j >>= 1)
-+ i ^= j;
-+ i ^= j;
-+
-+ /* backup over finished tables */
-+ while ((i & ((1 << w) - 1)) != x[h])
-+ {
-+ h--; /* don't need to update q */
-+ w -= l;
-+ }
-+ }
-+ }
-+
-+
-+ /* Return Z_BUF_ERROR if we were given an incomplete table */
-+ return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK;
-+}
-+
-+
-+local int inflate_trees_bits(c, bb, tb, z)
-+uIntf *c; /* 19 code lengths */
-+uIntf *bb; /* bits tree desired/actual depth */
-+inflate_huft * FAR *tb; /* bits tree result */
-+z_stream *z; /* for zfree function */
-+{
-+ int r;
-+
-+ r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL, tb, bb, z);
-+ if (r == Z_DATA_ERROR)
-+ z->msg = "oversubscribed dynamic bit lengths tree";
-+ else if (r == Z_BUF_ERROR)
-+ {
-+ inflate_trees_free(*tb, z);
-+ z->msg = "incomplete dynamic bit lengths tree";
-+ r = Z_DATA_ERROR;
-+ }
-+ return r;
-+}
-+
-+
-+local int inflate_trees_dynamic(nl, nd, c, bl, bd, tl, td, z)
-+uInt nl; /* number of literal/length codes */
-+uInt nd; /* number of distance codes */
-+uIntf *c; /* that many (total) code lengths */
-+uIntf *bl; /* literal desired/actual bit depth */
-+uIntf *bd; /* distance desired/actual bit depth */
-+inflate_huft * FAR *tl; /* literal/length tree result */
-+inflate_huft * FAR *td; /* distance tree result */
-+z_stream *z; /* for zfree function */
-+{
-+ int r;
-+
-+ /* build literal/length tree */
-+ if ((r = huft_build(c, nl, 257, cplens, cplext, tl, bl, z)) != Z_OK)
-+ {
-+ if (r == Z_DATA_ERROR)
-+ z->msg = "oversubscribed literal/length tree";
-+ else if (r == Z_BUF_ERROR)
-+ {
-+ inflate_trees_free(*tl, z);
-+ z->msg = "incomplete literal/length tree";
-+ r = Z_DATA_ERROR;
-+ }
-+ return r;
-+ }
-+
-+ /* build distance tree */
-+ if ((r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, z)) != Z_OK)
-+ {
-+ if (r == Z_DATA_ERROR)
-+ z->msg = "oversubscribed literal/length tree";
-+ else if (r == Z_BUF_ERROR) {
-+#ifdef PKZIP_BUG_WORKAROUND
-+ r = Z_OK;
-+ }
-+#else
-+ inflate_trees_free(*td, z);
-+ z->msg = "incomplete literal/length tree";
-+ r = Z_DATA_ERROR;
-+ }
-+ inflate_trees_free(*tl, z);
-+ return r;
-+#endif
-+ }
-+
-+ /* done */
-+ return Z_OK;
-+}
-+
-+
-+/* build fixed tables only once--keep them here */
-+local int fixed_lock = 0;
-+local int fixed_built = 0;
-+#define FIXEDH 530 /* number of hufts used by fixed tables */
-+local uInt fixed_left = FIXEDH;
-+local inflate_huft fixed_mem[FIXEDH];
-+local uInt fixed_bl;
-+local uInt fixed_bd;
-+local inflate_huft *fixed_tl;
-+local inflate_huft *fixed_td;
-+
-+
-+local voidpf falloc(q, n, s)
-+voidpf q; /* opaque pointer (not used) */
-+uInt n; /* number of items */
-+uInt s; /* size of item */
-+{
-+ Assert(s == sizeof(inflate_huft) && n <= fixed_left,
-+ "inflate_trees falloc overflow");
-+ if (q) s++; /* to make some compilers happy */
-+ fixed_left -= n;
-+ return (voidpf)(fixed_mem + fixed_left);
-+}
-+
-+
-+local void ffree(q, p, n)
-+voidpf q;
-+voidpf p;
-+uInt n;
-+{
-+ Assert(0, "inflate_trees ffree called!");
-+ if (q) q = p; /* to make some compilers happy */
-+}
-+
-+
-+local int inflate_trees_fixed(bl, bd, tl, td)
-+uIntf *bl; /* literal desired/actual bit depth */
-+uIntf *bd; /* distance desired/actual bit depth */
-+inflate_huft * FAR *tl; /* literal/length tree result */
-+inflate_huft * FAR *td; /* distance tree result */
-+{
-+ /* build fixed tables if not built already--lock out other instances */
-+ while (++fixed_lock > 1)
-+ fixed_lock--;
-+ if (!fixed_built)
-+ {
-+ int k; /* temporary variable */
-+ unsigned c[288]; /* length list for huft_build */
-+ z_stream z; /* for falloc function */
-+
-+ /* set up fake z_stream for memory routines */
-+ z.zalloc = falloc;
-+ z.zfree = ffree;
-+ z.opaque = Z_NULL;
-+
-+ /* literal table */
-+ for (k = 0; k < 144; k++)
-+ c[k] = 8;
-+ for (; k < 256; k++)
-+ c[k] = 9;
-+ for (; k < 280; k++)
-+ c[k] = 7;
-+ for (; k < 288; k++)
-+ c[k] = 8;
-+ fixed_bl = 7;
-+ huft_build(c, 288, 257, cplens, cplext, &fixed_tl, &fixed_bl, &z);
-+
-+ /* distance table */
-+ for (k = 0; k < 30; k++)
-+ c[k] = 5;
-+ fixed_bd = 5;
-+ huft_build(c, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd, &z);
-+
-+ /* done */
-+ fixed_built = 1;
-+ }
-+ fixed_lock--;
-+ *bl = fixed_bl;
-+ *bd = fixed_bd;
-+ *tl = fixed_tl;
-+ *td = fixed_td;
-+ return Z_OK;
-+}
-+
-+
-+local int inflate_trees_free(t, z)
-+inflate_huft *t; /* table to free */
-+z_stream *z; /* for zfree function */
-+/* Free the malloc'ed tables built by huft_build(), which makes a linked
-+ list of the tables it made, with the links in a dummy first entry of
-+ each table. */
-+{
-+ register inflate_huft *p, *q;
-+
-+ /* Go through linked list, freeing from the malloced (t[-1]) address. */
-+ p = t;
-+ while (p != Z_NULL)
-+ {
-+ q = (--p)->next;
-+ ZFREE(z, p, p->word.Nalloc * sizeof(inflate_huft));
-+ p = q;
-+ }
-+ return Z_OK;
-+}
-+
-+/*+++++*/
-+/* infcodes.c -- process literals and length/distance pairs
-+ * Copyright (C) 1995 Mark Adler
-+ * For conditions of distribution and use, see copyright notice in zlib.h
-+ */
-+
-+/* simplify the use of the inflate_huft type with some defines */
-+#define base more.Base
-+#define next more.Next
-+#define exop word.what.Exop
-+#define bits word.what.Bits
-+
-+/* inflate codes private state */
-+struct inflate_codes_state {
-+
-+ /* mode */
-+ enum { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */
-+ START, /* x: set up for LEN */
-+ LEN, /* i: get length/literal/eob next */
-+ LENEXT, /* i: getting length extra (have base) */
-+ DIST, /* i: get distance next */
-+ DISTEXT, /* i: getting distance extra */
-+ COPY, /* o: copying bytes in window, waiting for space */
-+ LIT, /* o: got literal, waiting for output space */
-+ WASH, /* o: got eob, possibly still output waiting */
-+ END, /* x: got eob and all data flushed */
-+ BADCODE} /* x: got error */
-+ mode; /* current inflate_codes mode */
-+
-+ /* mode dependent information */
-+ uInt len;
-+ union {
-+ struct {
-+ inflate_huft *tree; /* pointer into tree */
-+ uInt need; /* bits needed */
-+ } code; /* if LEN or DIST, where in tree */
-+ uInt lit; /* if LIT, literal */
-+ struct {
-+ uInt get; /* bits to get for extra */
-+ uInt dist; /* distance back to copy from */
-+ } copy; /* if EXT or COPY, where and how much */
-+ } sub; /* submode */
-+
-+ /* mode independent information */
-+ Byte lbits; /* ltree bits decoded per branch */
-+ Byte dbits; /* dtree bits decoder per branch */
-+ inflate_huft *ltree; /* literal/length/eob tree */
-+ inflate_huft *dtree; /* distance tree */
-+
-+};
-+
-+
-+local inflate_codes_statef *inflate_codes_new(bl, bd, tl, td, z)
-+uInt bl, bd;
-+inflate_huft *tl, *td;
-+z_stream *z;
-+{
-+ inflate_codes_statef *c;
-+
-+ if ((c = (inflate_codes_statef *)
-+ ZALLOC(z,1,sizeof(struct inflate_codes_state))) != Z_NULL)
-+ {
-+ c->mode = START;
-+ c->lbits = (Byte)bl;
-+ c->dbits = (Byte)bd;
-+ c->ltree = tl;
-+ c->dtree = td;
-+ Tracev((stderr, "inflate: codes new\n"));
-+ }
-+ return c;
-+}
-+
-+
-+local int inflate_codes(s, z, r)
-+inflate_blocks_statef *s;
-+z_stream *z;
-+int r;
-+{
-+ uInt j; /* temporary storage */
-+ inflate_huft *t; /* temporary pointer */
-+ uInt e; /* extra bits or operation */
-+ uLong b; /* bit buffer */
-+ uInt k; /* bits in bit buffer */
-+ Bytef *p; /* input data pointer */
-+ uInt n; /* bytes available there */
-+ Bytef *q; /* output window write pointer */
-+ uInt m; /* bytes to end of window or read pointer */
-+ Bytef *f; /* pointer to copy strings from */
-+ inflate_codes_statef *c = s->sub.decode.codes; /* codes state */
-+
-+ /* copy input/output information to locals (UPDATE macro restores) */
-+ LOAD
-+
-+ /* process input and output based on current state */
-+ while (1) switch (c->mode)
-+ { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */
-+ case START: /* x: set up for LEN */
-+#ifndef SLOW
-+ if (m >= 258 && n >= 10)
-+ {
-+ UPDATE
-+ r = inflate_fast(c->lbits, c->dbits, c->ltree, c->dtree, s, z);
-+ LOAD
-+ if (r != Z_OK)
-+ {
-+ c->mode = r == Z_STREAM_END ? WASH : BADCODE;
-+ break;
-+ }
-+ }
-+#endif /* !SLOW */
-+ c->sub.code.need = c->lbits;
-+ c->sub.code.tree = c->ltree;
-+ c->mode = LEN;
-+ case LEN: /* i: get length/literal/eob next */
-+ j = c->sub.code.need;
-+ NEEDBITS(j)
-+ t = c->sub.code.tree + ((uInt)b & inflate_mask[j]);
-+ DUMPBITS(t->bits)
-+ e = (uInt)(t->exop);
-+ if (e == 0) /* literal */
-+ {
-+ c->sub.lit = t->base;
-+ Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
-+ "inflate: literal '%c'\n" :
-+ "inflate: literal 0x%02x\n", t->base));
-+ c->mode = LIT;
-+ break;
-+ }
-+ if (e & 16) /* length */
-+ {
-+ c->sub.copy.get = e & 15;
-+ c->len = t->base;
-+ c->mode = LENEXT;
-+ break;
-+ }
-+ if ((e & 64) == 0) /* next table */
-+ {
-+ c->sub.code.need = e;
-+ c->sub.code.tree = t->next;
-+ break;
-+ }
-+ if (e & 32) /* end of block */
-+ {
-+ Tracevv((stderr, "inflate: end of block\n"));
-+ c->mode = WASH;
-+ break;
-+ }
-+ c->mode = BADCODE; /* invalid code */
-+ z->msg = "invalid literal/length code";
-+ r = Z_DATA_ERROR;
-+ LEAVE
-+ case LENEXT: /* i: getting length extra (have base) */
-+ j = c->sub.copy.get;
-+ NEEDBITS(j)
-+ c->len += (uInt)b & inflate_mask[j];
-+ DUMPBITS(j)
-+ c->sub.code.need = c->dbits;
-+ c->sub.code.tree = c->dtree;
-+ Tracevv((stderr, "inflate: length %u\n", c->len));
-+ c->mode = DIST;
-+ case DIST: /* i: get distance next */
-+ j = c->sub.code.need;
-+ NEEDBITS(j)
-+ t = c->sub.code.tree + ((uInt)b & inflate_mask[j]);
-+ DUMPBITS(t->bits)
-+ e = (uInt)(t->exop);
-+ if (e & 16) /* distance */
-+ {
-+ c->sub.copy.get = e & 15;
-+ c->sub.copy.dist = t->base;
-+ c->mode = DISTEXT;
-+ break;
-+ }
-+ if ((e & 64) == 0) /* next table */
-+ {
-+ c->sub.code.need = e;
-+ c->sub.code.tree = t->next;
-+ break;
-+ }
-+ c->mode = BADCODE; /* invalid code */
-+ z->msg = "invalid distance code";
-+ r = Z_DATA_ERROR;
-+ LEAVE
-+ case DISTEXT: /* i: getting distance extra */
-+ j = c->sub.copy.get;
-+ NEEDBITS(j)
-+ c->sub.copy.dist += (uInt)b & inflate_mask[j];
-+ DUMPBITS(j)
-+ Tracevv((stderr, "inflate: distance %u\n", c->sub.copy.dist));
-+ c->mode = COPY;
-+ case COPY: /* o: copying bytes in window, waiting for space */
-+#ifndef __TURBOC__ /* Turbo C bug for following expression */
-+ f = (uInt)(q - s->window) < c->sub.copy.dist ?
-+ s->end - (c->sub.copy.dist - (q - s->window)) :
-+ q - c->sub.copy.dist;
-+#else
-+ f = q - c->sub.copy.dist;
-+ if ((uInt)(q - s->window) < c->sub.copy.dist)
-+ f = s->end - (c->sub.copy.dist - (q - s->window));
-+#endif
-+ while (c->len)
-+ {
-+ NEEDOUT
-+ OUTBYTE(*f++)
-+ if (f == s->end)
-+ f = s->window;
-+ c->len--;
-+ }
-+ c->mode = START;
-+ break;
-+ case LIT: /* o: got literal, waiting for output space */
-+ NEEDOUT
-+ OUTBYTE(c->sub.lit)
-+ c->mode = START;
-+ break;
-+ case WASH: /* o: got eob, possibly more output */
-+ FLUSH
-+ if (s->read != s->write)
-+ LEAVE
-+ c->mode = END;
-+ case END:
-+ r = Z_STREAM_END;
-+ LEAVE
-+ case BADCODE: /* x: got error */
-+ r = Z_DATA_ERROR;
-+ LEAVE
-+ default:
-+ r = Z_STREAM_ERROR;
-+ LEAVE
-+ }
-+}
-+
-+
-+local void inflate_codes_free(c, z)
-+inflate_codes_statef *c;
-+z_stream *z;
-+{
-+ ZFREE(z, c, sizeof(struct inflate_codes_state));
-+ Tracev((stderr, "inflate: codes free\n"));
-+}
-+
-+/*+++++*/
-+/* inflate_util.c -- data and routines common to blocks and codes
-+ * Copyright (C) 1995 Mark Adler
-+ * For conditions of distribution and use, see copyright notice in zlib.h
-+ */
-+
-+/* copy as much as possible from the sliding window to the output area */
-+local int inflate_flush(s, z, r)
-+inflate_blocks_statef *s;
-+z_stream *z;
-+int r;
-+{
-+ uInt n;
-+ Bytef *p, *q;
-+
-+ /* local copies of source and destination pointers */
-+ p = z->next_out;
-+ q = s->read;
-+
-+ /* compute number of bytes to copy as far as end of window */
-+ n = (uInt)((q <= s->write ? s->write : s->end) - q);
-+ if (n > z->avail_out) n = z->avail_out;
-+ if (n && r == Z_BUF_ERROR) r = Z_OK;
-+
-+ /* update counters */
-+ z->avail_out -= n;
-+ z->total_out += n;
-+
-+ /* update check information */
-+ if (s->checkfn != Z_NULL)
-+ s->check = (*s->checkfn)(s->check, q, n);
-+
-+ /* copy as far as end of window */
-+ zmemcpy(p, q, n);
-+ p += n;
-+ q += n;
-+
-+ /* see if more to copy at beginning of window */
-+ if (q == s->end)
-+ {
-+ /* wrap pointers */
-+ q = s->window;
-+ if (s->write == s->end)
-+ s->write = s->window;
-+
-+ /* compute bytes to copy */
-+ n = (uInt)(s->write - q);
-+ if (n > z->avail_out) n = z->avail_out;
-+ if (n && r == Z_BUF_ERROR) r = Z_OK;
-+
-+ /* update counters */
-+ z->avail_out -= n;
-+ z->total_out += n;
-+
-+ /* update check information */
-+ if (s->checkfn != Z_NULL)
-+ s->check = (*s->checkfn)(s->check, q, n);
-+
-+ /* copy */
-+ zmemcpy(p, q, n);
-+ p += n;
-+ q += n;
-+ }
-+
-+ /* update pointers */
-+ z->next_out = p;
-+ s->read = q;
-+
-+ /* done */
-+ return r;
-+}
-+
-+
-+/*+++++*/
-+/* inffast.c -- process literals and length/distance pairs fast
-+ * Copyright (C) 1995 Mark Adler
-+ * For conditions of distribution and use, see copyright notice in zlib.h
-+ */
-+
-+/* simplify the use of the inflate_huft type with some defines */
-+#define base more.Base
-+#define next more.Next
-+#define exop word.what.Exop
-+#define bits word.what.Bits
-+
-+/* macros for bit input with no checking and for returning unused bytes */
-+#define GRABBITS(j) {while(k<(j)){b|=((uLong)NEXTBYTE)<<k;k+=8;}}
-+#define UNGRAB {n+=(c=k>>3);p-=c;k&=7;}
-+
-+/* Called with number of bytes left to write in window at least 258
-+ (the maximum string length) and number of input bytes available
-+ at least ten. The ten bytes are six bytes for the longest length/
-+ distance pair plus four bytes for overloading the bit buffer. */
-+
-+local int inflate_fast(bl, bd, tl, td, s, z)
-+uInt bl, bd;
-+inflate_huft *tl, *td;
-+inflate_blocks_statef *s;
-+z_stream *z;
-+{
-+ inflate_huft *t; /* temporary pointer */
-+ uInt e; /* extra bits or operation */
-+ uLong b; /* bit buffer */
-+ uInt k; /* bits in bit buffer */
-+ Bytef *p; /* input data pointer */
-+ uInt n; /* bytes available there */
-+ Bytef *q; /* output window write pointer */
-+ uInt m; /* bytes to end of window or read pointer */
-+ uInt ml; /* mask for literal/length tree */
-+ uInt md; /* mask for distance tree */
-+ uInt c; /* bytes to copy */
-+ uInt d; /* distance back to copy from */
-+ Bytef *r; /* copy source pointer */
-+
-+ /* load input, output, bit values */
-+ LOAD
-+
-+ /* initialize masks */
-+ ml = inflate_mask[bl];
-+ md = inflate_mask[bd];
-+
-+ /* do until not enough input or output space for fast loop */
-+ do { /* assume called with m >= 258 && n >= 10 */
-+ /* get literal/length code */
-+ GRABBITS(20) /* max bits for literal/length code */
-+ if ((e = (t = tl + ((uInt)b & ml))->exop) == 0)
-+ {
-+ DUMPBITS(t->bits)
-+ Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
-+ "inflate: * literal '%c'\n" :
-+ "inflate: * literal 0x%02x\n", t->base));
-+ *q++ = (Byte)t->base;
-+ m--;
-+ continue;
-+ }
-+ do {
-+ DUMPBITS(t->bits)
-+ if (e & 16)
-+ {
-+ /* get extra bits for length */
-+ e &= 15;
-+ c = t->base + ((uInt)b & inflate_mask[e]);
-+ DUMPBITS(e)
-+ Tracevv((stderr, "inflate: * length %u\n", c));
-+
-+ /* decode distance base of block to copy */
-+ GRABBITS(15); /* max bits for distance code */
-+ e = (t = td + ((uInt)b & md))->exop;
-+ do {
-+ DUMPBITS(t->bits)
-+ if (e & 16)
-+ {
-+ /* get extra bits to add to distance base */
-+ e &= 15;
-+ GRABBITS(e) /* get extra bits (up to 13) */
-+ d = t->base + ((uInt)b & inflate_mask[e]);
-+ DUMPBITS(e)
-+ Tracevv((stderr, "inflate: * distance %u\n", d));
-+
-+ /* do the copy */
-+ m -= c;
-+ if ((uInt)(q - s->window) >= d) /* offset before dest */
-+ { /* just copy */
-+ r = q - d;
-+ *q++ = *r++; c--; /* minimum count is three, */
-+ *q++ = *r++; c--; /* so unroll loop a little */
-+ }
-+ else /* else offset after destination */
-+ {
-+ e = d - (q - s->window); /* bytes from offset to end */
-+ r = s->end - e; /* pointer to offset */
-+ if (c > e) /* if source crosses, */
-+ {
-+ c -= e; /* copy to end of window */
-+ do {
-+ *q++ = *r++;
-+ } while (--e);
-+ r = s->window; /* copy rest from start of window */
-+ }
-+ }
-+ do { /* copy all or what's left */
-+ *q++ = *r++;
-+ } while (--c);
-+ break;
-+ }
-+ else if ((e & 64) == 0)
-+ e = (t = t->next + ((uInt)b & inflate_mask[e]))->exop;
-+ else
-+ {
-+ z->msg = "invalid distance code";
-+ UNGRAB
-+ UPDATE
-+ return Z_DATA_ERROR;
-+ }
-+ } while (1);
-+ break;
-+ }
-+ if ((e & 64) == 0)
-+ {
-+ if ((e = (t = t->next + ((uInt)b & inflate_mask[e]))->exop) == 0)
-+ {
-+ DUMPBITS(t->bits)
-+ Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
-+ "inflate: * literal '%c'\n" :
-+ "inflate: * literal 0x%02x\n", t->base));
-+ *q++ = (Byte)t->base;
-+ m--;
-+ break;
-+ }
-+ }
-+ else if (e & 32)
-+ {
-+ Tracevv((stderr, "inflate: * end of block\n"));
-+ UNGRAB
-+ UPDATE
-+ return Z_STREAM_END;
-+ }
-+ else
-+ {
-+ z->msg = "invalid literal/length code";
-+ UNGRAB
-+ UPDATE
-+ return Z_DATA_ERROR;
-+ }
-+ } while (1);
-+ } while (m >= 258 && n >= 10);
-+
-+ /* not enough input or output--restore pointers and return */
-+ UNGRAB
-+ UPDATE
-+ return Z_OK;
-+}
-+
-+
-+/*+++++*/
-+/* zutil.c -- target dependent utility functions for the compression library
-+ * Copyright (C) 1995 Jean-loup Gailly.
-+ * For conditions of distribution and use, see copyright notice in zlib.h
-+ */
-+
-+/* From: zutil.c,v 1.8 1995/05/03 17:27:12 jloup Exp */
-+
-+char *zlib_version = ZLIB_VERSION;
-+
-+char *z_errmsg[] = {
-+"stream end", /* Z_STREAM_END 1 */
-+"", /* Z_OK 0 */
-+"file error", /* Z_ERRNO (-1) */
-+"stream error", /* Z_STREAM_ERROR (-2) */
-+"data error", /* Z_DATA_ERROR (-3) */
-+"insufficient memory", /* Z_MEM_ERROR (-4) */
-+"buffer error", /* Z_BUF_ERROR (-5) */
-+""};
-+
-+
-+/*+++++*/
-+/* adler32.c -- compute the Adler-32 checksum of a data stream
-+ * Copyright (C) 1995 Mark Adler
-+ * For conditions of distribution and use, see copyright notice in zlib.h
-+ */
-+
-+/* From: adler32.c,v 1.6 1995/05/03 17:27:08 jloup Exp */
-+
-+#define BASE 65521L /* largest prime smaller than 65536 */
-+#define NMAX 5552
-+/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
-+
-+#define DO1(buf) {s1 += *buf++; s2 += s1;}
-+#define DO2(buf) DO1(buf); DO1(buf);
-+#define DO4(buf) DO2(buf); DO2(buf);
-+#define DO8(buf) DO4(buf); DO4(buf);
-+#define DO16(buf) DO8(buf); DO8(buf);
-+
-+/* ========================================================================= */
-+uLong adler32(adler, buf, len)
-+ uLong adler;
-+ Bytef *buf;
-+ uInt len;
-+{
-+ unsigned long s1 = adler & 0xffff;
-+ unsigned long s2 = (adler >> 16) & 0xffff;
-+ int k;
-+
-+ if (buf == Z_NULL) return 1L;
-+
-+ while (len > 0) {
-+ k = len < NMAX ? len : NMAX;
-+ len -= k;
-+ while (k >= 16) {
-+ DO16(buf);
-+ k -= 16;
-+ }
-+ if (k != 0) do {
-+ DO1(buf);
-+ } while (--k);
-+ s1 %= BASE;
-+ s2 %= BASE;
-+ }
-+ return (s2 << 16) | s1;
-+}
-diff -Naru linux/arch/mips/zboot/Makefile linux-new/arch/mips/zboot/Makefile
---- linux/arch/mips/zboot/Makefile 1969-12-31 19:00:00.000000000 -0500
-+++ linux-new/arch/mips/zboot/Makefile 2003-12-18 14:26:21.000000000 -0500
-@@ -0,0 +1,79 @@
-+#
-+# arch/mips/zboot/Makefile
-+#
-+# This file is subject to the terms and conditions of the GNU General Public
-+# License. See the file "COPYING" in the main directory of this archive
-+# for more details.
-+
-+# Adapted for MIPS Pete Popov, Dan Malek
-+#
-+# Copyright (C) 1994 by Linus Torvalds
-+# Adapted for PowerPC by Gary Thomas
-+# modified by Cort (cort@cs.nmt.edu)
-+#
-+
-+.c.s:
-+ $(CC) $(CFLAGS) -S -o $*.s $<
-+.s.o:
-+ $(AS) -o $*.o $<
-+.c.o:
-+ $(CC) $(CFLAGS) -c -o $*.o $<
-+.S.s:
-+ $(CPP) $(AFLAGS) -o $*.o $<
-+.S.o:
-+ $(CC) $(AFLAGS) -c -o $*.o $<
-+
-+GZIP_FLAGS = -v9f
-+
-+CFLAGS := $(CPPFLAGS) -O2 -D__BOOTER__ \
-+ -fomit-frame-pointer -fno-strict-aliasing -fno-common \
-+ -G 0 -mno-abicalls -fno-pic -mcpu=r4600 -mips2 \
-+ -I$(TOPDIR)/arch/$(ARCH)/zboot/include \
-+ -I$(TOPDIR)/include/asm
-+AFLAGS += -D__BOOTER__
-+
-+BOOT_TARGETS = zImage zImage.initrd zImage.flash zImage.initrd.flash
-+
-+lib/zlib.a:
-+ $(MAKE) -C lib
-+
-+images/vmlinux.gz: $(TOPDIR)/vmlinux
-+ $(MAKE) -C images vmlinux.gz
-+
-+$(BOOT_TARGETS): lib/zlib.a images/vmlinux.gz
-+ifdef CONFIG_MIPS_PB1000
-+ $(MAKE) -C pb1xxx $@
-+endif
-+ifdef CONFIG_MIPS_PB1500
-+ $(MAKE) -C pb1xxx $@
-+endif
-+ifdef CONFIG_MIPS_PB1100
-+ $(MAKE) -C pb1xxx $@
-+endif
-+ifdef CONFIG_MIPS_DB1000
-+ $(MAKE) -C pb1xxx $@
-+endif
-+ifdef CONFIG_MIPS_DB1100
-+ $(MAKE) -C pb1xxx $@
-+endif
-+ifdef CONFIG_MIPS_DB1500
-+ $(MAKE) -C pb1xxx $@
-+endif
-+ifdef CONFIG_MIPS_BOSPORUS
-+ $(MAKE) -C pb1xxx $@
-+endif
-+ifdef CONFIG_COGENT_CSB250
-+ $(MAKE) -C csb250 $@
-+endif
-+ifdef CONFIG_MIPS_XXS1500
-+BOOT_DIR = xxs1500
-+endif
-+
-+# Do the dirs
-+clean:
-+ $(MAKE) -C common clean
-+ $(MAKE) -C images clean
-+ $(MAKE) -C pb1xxx clean
-+ $(MAKE) -C xxs1500 clean
-+
-+include $(TOPDIR)/Rules.make
-diff -Naru linux/arch/mips/zboot/pb1xxx/head.S linux-new/arch/mips/zboot/pb1xxx/head.S
---- linux/arch/mips/zboot/pb1xxx/head.S 1969-12-31 19:00:00.000000000 -0500
-+++ linux-new/arch/mips/zboot/pb1xxx/head.S 2003-12-18 14:26:21.000000000 -0500
-@@ -0,0 +1,149 @@
-+/*
-+ * arch/mips/kernel/head.S
-+ *
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright (C) 1994, 1995 Waldorf Electronics
-+ * Written by Ralf Baechle and Andreas Busse
-+ * Copyright (C) 1995 - 1999 Ralf Baechle
-+ * Copyright (C) 1996 Paul M. Antoine
-+ * Modified for DECStation and hence R3000 support by Paul M. Antoine
-+ * Further modifications by David S. Miller and Harald Koerfgen
-+ * Copyright (C) 1999 Silicon Graphics, Inc.
-+ *
-+ * Head.S contains the MIPS exception handler and startup code.
-+ *
-+ **************************************************************************
-+ * 9 Nov, 2000.
-+ * Added Cache Error exception handler and SBDDP EJTAG debug exception.
-+ *
-+ * Kevin Kissell, kevink@mips.com and Carsten Langgaard, carstenl@mips.com
-+ * Copyright (C) 2000 MIPS Technologies, Inc. All rights reserved.
-+ **************************************************************************
-+ */
-+#include <linux/config.h>
-+#include <linux/threads.h>
-+
-+#include <asm/asm.h>
-+#include <asm/cacheops.h>
-+#include <asm/mipsregs.h>
-+#include <asm/offset.h>
-+#include <asm/cachectl.h>
-+#include <asm/regdef.h>
-+
-+#define IndexInvalidate_I 0x00
-+#define IndexWriteBack_D 0x01
-+
-+ .set noreorder
-+ .cprestore
-+ LEAF(start)
-+start:
-+ bal locate
-+ nop
-+locate:
-+ subu s8, ra, 8 /* Where we were loaded */
-+ la sp, (.stack + 8192)
-+
-+ move s0, a0 /* Save boot rom start args */
-+ move s1, a1
-+ move s2, a2
-+ move s3, a3
-+
-+ la a0, start /* Where we were linked to run */
-+
-+ move a1, s8
-+ la a2, _edata
-+ subu t1, a2, a0
-+ srl t1, t1, 2
-+
-+ /* copy text section */
-+ li t0, 0
-+1: lw v0, 0(a1)
-+ nop
-+ sw v0, 0(a0)
-+ xor t0, t0, v0
-+ addu a0, 4
-+ bne a2, a0, 1b
-+ addu a1, 4
-+
-+ /* Clear BSS */
-+ la a0, _edata
-+ la a2, _end
-+2: sw zero, 0(a0)
-+ bne a2, a0, 2b
-+ addu a0, 4
-+
-+ /* push the D-Cache and invalidate I-Cache */
-+ li k0, 0x80000000 # start address
-+ li k1, 0x80004000 # end address (16KB I-Cache)
-+ subu k1, 128
-+
-+1:
-+ .set mips3
-+ cache IndexWriteBack_D, 0(k0)
-+ cache IndexWriteBack_D, 32(k0)
-+ cache IndexWriteBack_D, 64(k0)
-+ cache IndexWriteBack_D, 96(k0)
-+ cache IndexInvalidate_I, 0(k0)
-+ cache IndexInvalidate_I, 32(k0)
-+ cache IndexInvalidate_I, 64(k0)
-+ cache IndexInvalidate_I, 96(k0)
-+ .set mips0
-+
-+ bne k0, k1, 1b
-+ addu k0, k0, 128
-+ /* done */
-+
-+ move a0, s8 /* load address */
-+ move a1, t1 /* length in words */
-+ move a2, t0 /* checksum */
-+ move a3, sp
-+
-+ la ra, 1f
-+ la k0, decompress_kernel
-+ jr k0
-+ nop
-+1:
-+
-+ move a0, s0
-+ move a1, s1
-+ move a2, s2
-+ move a3, s3
-+ li k0, KERNEL_ENTRY
-+ jr k0
-+ nop
-+3:
-+ b 3b
-+ END(start)
-+
-+ LEAF(udelay)
-+udelay:
-+ END(udelay)
-+
-+
-+ LEAF(FlushCache)
-+ li k0, 0x80000000 # start address
-+ li k1, 0x80004000 # end address (16KB I-Cache)
-+ subu k1, 128
-+
-+1:
-+ .set mips3
-+ cache IndexWriteBack_D, 0(k0)
-+ cache IndexWriteBack_D, 32(k0)
-+ cache IndexWriteBack_D, 64(k0)
-+ cache IndexWriteBack_D, 96(k0)
-+ cache IndexInvalidate_I, 0(k0)
-+ cache IndexInvalidate_I, 32(k0)
-+ cache IndexInvalidate_I, 64(k0)
-+ cache IndexInvalidate_I, 96(k0)
-+ .set mips0
-+
-+ bne k0, k1, 1b
-+ addu k0, k0, 128
-+ jr ra
-+ nop
-+ END(FlushCache)
-+
-+ .comm .stack,4096*2,4
-diff -Naru linux/arch/mips/zboot/pb1xxx/Makefile linux-new/arch/mips/zboot/pb1xxx/Makefile
---- linux/arch/mips/zboot/pb1xxx/Makefile 1969-12-31 19:00:00.000000000 -0500
-+++ linux-new/arch/mips/zboot/pb1xxx/Makefile 2003-12-18 14:26:21.000000000 -0500
-@@ -0,0 +1,123 @@
-+# arch/mips/zboot/pb1xxx/Makefile
-+#
-+# Makefile for Alchemy Semiconductor Pb1[015]00 boards.
-+# All of the boot loader code was derived from the ppc
-+# boot code.
-+#
-+# Copyright 2001,2002 MontaVista Software Inc.
-+#
-+# Author: Mark A. Greer
-+# mgreer@mvista.com
-+# Ported and modified for mips support by
-+# Pete Popov <ppopov@mvista.com>
-+#
-+# This program is free software; you can redistribute it and/or modify it
-+# 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.
-+
-+.c.s:
-+ $(CC) $(CFLAGS) -S -o $*.s $<
-+.s.o:
-+ $(AS) -o $*.o $<
-+.c.o:
-+ $(CC) $(CFLAGS) -D__BOOTER__ -c -o $*.o $<
-+.S.s:
-+ $(CPP) $(AFLAGS) -o $*.o $<
-+.S.o:
-+ $(CC) $(AFLAGS) -c -o $*.o $<
-+
-+#########################################################################
-+# START BOARD SPECIFIC VARIABLES
-+ifdef CONFIG_MIPS_PB1000
-+BNAME=pb1000
-+endif
-+
-+ifdef CONFIG_MIPS_PB1100
-+BNAME=pb1100
-+endif
-+
-+ifdef CONFIG_MIPS_PB1500
-+BNAME=pb1500
-+endif
-+
-+ifdef CONFIG_MIPS_DB1000
-+BNAME=db1000
-+endif
-+
-+ifdef CONFIG_MIPS_DB1100
-+BNAME=db1100
-+endif
-+
-+ifdef CONFIG_MIPS_DB1500
-+BNAME=db1500
-+endif
-+
-+ifdef CONFIG_MIPS_BOSPORUS
-+BNAME=bosporus
-+endif
-+
-+# These two variables control where the zImage is stored
-+# in flash and loaded in memory. It only controls how the srec
-+# file is generated, the code is the same.
-+RAM_RUN_ADDR = 0x81000000
-+FLASH_LOAD_ADDR = 0xBFD00000
-+
-+# These two variables specify the free ram region
-+# that can be used for temporary malloc area
-+AVAIL_RAM_START=0x80400000
-+AVAIL_RAM_END=0x80800000
-+
-+# This one must match the LOADADDR in arch/mips/Makefile!
-+LOADADDR=0x80100000
-+# END BOARD SPECIFIC VARIABLES
-+#########################################################################
-+
-+OBJECTS := head.o ../common/misc-common.o ../common/misc-simple.o \
-+ ../common/au1k_uart.o ../common/string.o ../common/ctype.o
-+LIBS := ../lib/zlib.a
-+
-+ENTRY := ../utils/entry
-+OFFSET := ../utils/offset
-+SIZE := ../utils/size
-+
-+LD_ARGS := -T ../ld.script -Ttext $(RAM_RUN_ADDR) -Bstatic
-+OBJCOPY_ARGS = -O elf32-tradlittlemips
-+
-+all: zImage
-+
-+clean:
-+ rm -rf *.o vmlinux* zvmlinux.* ../images/*.srec
-+
-+head.o: head.S $(TOPDIR)/vmlinux
-+ $(CC) $(AFLAGS) \
-+ -DKERNEL_ENTRY=$(shell sh $(ENTRY) $(NM) $(TOPDIR)/vmlinux ) \
-+ -c -o $*.o $<
-+
-+../common/misc-simple.o:
-+ $(CC) $(CFLAGS) -DINITRD_OFFSET=0 -DINITRD_SIZE=0 -DZIMAGE_OFFSET=0 \
-+ -DAVAIL_RAM_START=$(AVAIL_RAM_START) \
-+ -DAVAIL_RAM_END=$(AVAIL_RAM_END) \
-+ -DLOADADDR=$(LOADADDR) \
-+ -DZIMAGE_SIZE=0 -c -o $@ $*.c
-+
-+zvmlinux: $(OBJECTS) $(LIBS) ../ld.script ../images/vmlinux.gz ../common/dummy.o
-+ $(OBJCOPY) \
-+ --add-section=.image=../images/vmlinux.gz \
-+ --set-section-flags=.image=contents,alloc,load,readonly,data \
-+ ../common/dummy.o image.o
-+ $(LD) $(LD_ARGS) -o $@ $(OBJECTS) image.o $(LIBS)
-+ $(OBJCOPY) $(OBJCOPY_ARGS) $@ $@ -R .comment -R .stab -R .stabstr \
-+ -R .initrd -R .sysmap
-+
-+# Here we manipulate the image in order to get it the necessary
-+# srecord file we need.
-+zImage: zvmlinux
-+ mv zvmlinux ../images/zImage.$(BNAME)
-+ $(OBJCOPY) -O srec ../images/zImage.$(BNAME) ../images/$(BNAME).srec
-+
-+zImage.flash: zImage
-+ $(OBJCOPY) -O srec --adjust-vma 0x3ed00000 \
-+ ../images/zImage.$(BNAME) ../images/$(BNAME).flash.srec
-+
-+include $(TOPDIR)/Rules.make
-diff -Naru linux/arch/mips/zboot/utils/entry linux-new/arch/mips/zboot/utils/entry
---- linux/arch/mips/zboot/utils/entry 1969-12-31 19:00:00.000000000 -0500
-+++ linux-new/arch/mips/zboot/utils/entry 2003-12-18 14:26:21.000000000 -0500
-@@ -0,0 +1,12 @@
-+#!/bin/sh
-+
-+# grab the kernel_entry address from the vmlinux elf image
-+entry=`$1 $2 | grep kernel_entry`
-+
-+fs=`echo $entry | grep ffffffff` # check toolchain output
-+
-+if [ -n "$fs" ]; then
-+ echo "0x"`$1 $2 | grep kernel_entry | cut -c9- | awk '{print $1}'`
-+else
-+ echo "0x"`$1 $2 | grep kernel_entry | cut -c1- | awk '{print $1}'`
-+fi
-diff -Naru linux/arch/mips/zboot/utils/offset linux-new/arch/mips/zboot/utils/offset
---- linux/arch/mips/zboot/utils/offset 1969-12-31 19:00:00.000000000 -0500
-+++ linux-new/arch/mips/zboot/utils/offset 2003-12-18 14:26:21.000000000 -0500
-@@ -0,0 +1,3 @@
-+#!/bin/sh
-+
-+echo "0x"`$1 -h $2 | grep $3 | grep -v zvmlinux| awk '{print $6}'`
-diff -Naru linux/arch/mips/zboot/utils/size linux-new/arch/mips/zboot/utils/size
---- linux/arch/mips/zboot/utils/size 1969-12-31 19:00:00.000000000 -0500
-+++ linux-new/arch/mips/zboot/utils/size 2003-12-18 14:26:21.000000000 -0500
-@@ -0,0 +1,4 @@
-+#!/bin/sh
-+
-+OFFSET=`$1 -h $2 | grep $3 | grep -v zvmlinux | awk '{print $3}'`
-+echo "0x"$OFFSET
-diff -Naru linux/arch/mips/zboot/xxs1500/head.S linux-new/arch/mips/zboot/xxs1500/head.S
---- linux/arch/mips/zboot/xxs1500/head.S 1969-12-31 19:00:00.000000000 -0500
-+++ linux-new/arch/mips/zboot/xxs1500/head.S 2003-12-18 14:26:21.000000000 -0500
-@@ -0,0 +1,137 @@
-+/*
-+ * arch/mips/kernel/head.S
-+ *
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright (C) 1994, 1995 Waldorf Electronics
-+ * Written by Ralf Baechle and Andreas Busse
-+ * Copyright (C) 1995 - 1999 Ralf Baechle
-+ * Copyright (C) 1996 Paul M. Antoine
-+ * Modified for DECStation and hence R3000 support by Paul M. Antoine
-+ * Further modifications by David S. Miller and Harald Koerfgen
-+ * Copyright (C) 1999 Silicon Graphics, Inc.
-+ *
-+ * Head.S contains the MIPS exception handler and startup code.
-+ *
-+ **************************************************************************
-+ * 9 Nov, 2000.
-+ * Added Cache Error exception handler and SBDDP EJTAG debug exception.
-+ *
-+ * Kevin Kissell, kevink@mips.com and Carsten Langgaard, carstenl@mips.com
-+ * Copyright (C) 2000 MIPS Technologies, Inc. All rights reserved.
-+ **************************************************************************
-+ */
-+#include <linux/config.h>
-+#include <linux/threads.h>
-+
-+#include <asm/asm.h>
-+#include <asm/cacheops.h>
-+#include <asm/mipsregs.h>
-+#include <asm/offset.h>
-+#include <asm/cachectl.h>
-+#include <asm/regdef.h>
-+
-+#define IndexInvalidate_I 0x00
-+
-+ .set noreorder
-+ .cprestore
-+ LEAF(start)
-+start:
-+
-+locate:
-+ la sp, .stack
-+ move s0, a0
-+ move s1, a1
-+ move s2, a2
-+ move s3, a3
-+
-+ la a0, start
-+
-+ li a1, FLASH_LOAD_ADDR
-+ la a2, _edata
-+ subu t1, a2, a0
-+ srl t1, t1, 2
-+
-+ /* copy text section */
-+ li t0, 0
-+1: lw v0, 0(a1)
-+ nop
-+ sw v0, 0(a0)
-+ xor t0, t0, v0
-+ addu a0, 4
-+ bne a2, a0, 1b
-+ addu a1, 4
-+
-+ /* Clear BSS */
-+ la a0, _edata
-+ la a2, _end
-+2: sw zero, 0(a0)
-+ bne a2, a0, 2b
-+ addu a0, 4
-+
-+ /* flush the I-Cache */
-+ li k0, 0x80000000 # start address
-+ li k1, 0x80004000 # end address (16KB I-Cache)
-+ subu k1, 128
-+
-+1:
-+ .set mips3
-+ cache IndexInvalidate_I, 0(k0)
-+ cache IndexInvalidate_I, 32(k0)
-+ cache IndexInvalidate_I, 64(k0)
-+ cache IndexInvalidate_I, 96(k0)
-+ .set mips0
-+
-+ bne k0, k1, 1b
-+ addu k0, k0, 128
-+ /* done */
-+
-+ li a0, FLASH_LOAD_ADDR /* load address */
-+ move a1, t1 /* length in words */
-+ move a2, t0 /* checksum */
-+ move a3, sp
-+
-+ la ra, 1f
-+ la k0, decompress_kernel
-+ jr k0
-+ nop
-+1:
-+
-+ move a0, s0
-+ move a1, s1
-+ move a2, s2
-+ move a3, s3
-+ li k0, KERNEL_ENTRY
-+ jr k0
-+ nop
-+3:
-+ b 3b
-+ END(start)
-+
-+ LEAF(udelay)
-+udelay:
-+ END(udelay)
-+
-+
-+ LEAF(FlushCache)
-+ li k0, 0x80000000 # start address
-+ li k1, 0x80004000 # end address (16KB I-Cache)
-+ subu k1, 128
-+
-+1:
-+ .set mips3
-+ cache IndexInvalidate_I, 0(k0)
-+ cache IndexInvalidate_I, 32(k0)
-+ cache IndexInvalidate_I, 64(k0)
-+ cache IndexInvalidate_I, 96(k0)
-+ .set mips0
-+
-+ bne k0, k1, 1b
-+ addu k0, k0, 128
-+ jr ra
-+ nop
-+ END(FlushCache)
-+
-+ .comm .stack,4096*2,4
-diff -Naru linux/arch/mips/zboot/xxs1500/ld.script linux-new/arch/mips/zboot/xxs1500/ld.script
---- linux/arch/mips/zboot/xxs1500/ld.script 1969-12-31 19:00:00.000000000 -0500
-+++ linux-new/arch/mips/zboot/xxs1500/ld.script 2003-12-18 14:26:21.000000000 -0500
-@@ -0,0 +1,147 @@
-+OUTPUT_ARCH(mips)
-+ENTRY(start)
-+SECTIONS
-+{
-+ /* Read-only sections, merged into text segment: */
-+ /* . = 0x81000000; */
-+ .init : { *(.init) } =0
-+ .text :
-+ {
-+ _ftext = . ;
-+ *(.text)
-+ *(.rodata)
-+ *(.rodata1)
-+ /* .gnu.warning sections are handled specially by elf32.em. */
-+ *(.gnu.warning)
-+ } =0
-+ .kstrtab : { *(.kstrtab) }
-+
-+ . = ALIGN(16); /* Exception table */
-+ __start___ex_table = .;
-+ __ex_table : { *(__ex_table) }
-+ __stop___ex_table = .;
-+
-+ __start___dbe_table = .; /* Exception table for data bus errors */
-+ __dbe_table : { *(__dbe_table) }
-+ __stop___dbe_table = .;
-+
-+ __start___ksymtab = .; /* Kernel symbol table */
-+ __ksymtab : { *(__ksymtab) }
-+ __stop___ksymtab = .;
-+
-+ _etext = .;
-+
-+ . = ALIGN(8192);
-+ .data.init_task : { *(.data.init_task) }
-+
-+ /* Startup code */
-+ . = ALIGN(4096);
-+ __init_begin = .;
-+ .text.init : { *(.text.init) }
-+ .data.init : { *(.data.init) }
-+ . = ALIGN(16);
-+ __setup_start = .;
-+ .setup.init : { *(.setup.init) }
-+ __setup_end = .;
-+ __initcall_start = .;
-+ .initcall.init : { *(.initcall.init) }
-+ __initcall_end = .;
-+ . = ALIGN(4096); /* Align double page for init_task_union */
-+ __init_end = .;
-+
-+ . = ALIGN(4096);
-+ .data.page_aligned : { *(.data.idt) }
-+
-+ . = ALIGN(32);
-+ .data.cacheline_aligned : { *(.data.cacheline_aligned) }
-+
-+ .fini : { *(.fini) } =0
-+ .reginfo : { *(.reginfo) }
-+ /* Adjust the address for the data segment. We want to adjust up to
-+ the same address within the page on the next page up. It would
-+ be more correct to do this:
-+ . = .;
-+ The current expression does not correctly handle the case of a
-+ text segment ending precisely at the end of a page; it causes the
-+ data segment to skip a page. The above expression does not have
-+ this problem, but it will currently (2/95) cause BFD to allocate
-+ a single segment, combining both text and data, for this case.
-+ This will prevent the text segment from being shared among
-+ multiple executions of the program; I think that is more
-+ important than losing a page of the virtual address space (note
-+ that no actual memory is lost; the page which is skipped can not
-+ be referenced). */
-+ . = .;
-+ .data :
-+ {
-+ _fdata = . ;
-+ *(.data)
-+
-+ /* Align the initial ramdisk image (INITRD) on page boundaries. */
-+ . = ALIGN(4096);
-+ __rd_start = .;
-+ *(.initrd)
-+ __rd_end = .;
-+ . = ALIGN(4096);
-+
-+ CONSTRUCTORS
-+ }
-+ .data1 : { *(.data1) }
-+ _gp = . + 0x8000;
-+ .lit8 : { *(.lit8) }
-+ .lit4 : { *(.lit4) }
-+ .ctors : { *(.ctors) }
-+ .dtors : { *(.dtors) }
-+ .got : { *(.got.plt) *(.got) }
-+ .dynamic : { *(.dynamic) }
-+ /* We want the small data sections together, so single-instruction offsets
-+ can access them all, and initialized data all before uninitialized, so
-+ we can shorten the on-disk segment size. */
-+ .sdata : { *(.sdata) }
-+ . = ALIGN(4);
-+ _edata = .;
-+ PROVIDE (edata = .);
-+
-+ __bss_start = .;
-+ _fbss = .;
-+ .sbss : { *(.sbss) *(.scommon) }
-+ .bss :
-+ {
-+ *(.dynbss)
-+ *(.bss)
-+ *(COMMON)
-+ . = ALIGN(4);
-+ _end = . ;
-+ PROVIDE (end = .);
-+ }
-+
-+ /* Sections to be discarded */
-+ /DISCARD/ :
-+ {
-+ *(.text.exit)
-+ *(.data.exit)
-+ *(.exitcall.exit)
-+ }
-+
-+ /* This is the MIPS specific mdebug section. */
-+ .mdebug : { *(.mdebug) }
-+ /* These are needed for ELF backends which have not yet been
-+ converted to the new style linker. */
-+ .stab 0 : { *(.stab) }
-+ .stabstr 0 : { *(.stabstr) }
-+ /* DWARF debug sections.
-+ Symbols in the .debug DWARF section are relative to the beginning of the
-+ section so we begin .debug at 0. It's not clear yet what needs to happen
-+ for the others. */
-+ .debug 0 : { *(.debug) }
-+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
-+ .debug_aranges 0 : { *(.debug_aranges) }
-+ .debug_pubnames 0 : { *(.debug_pubnames) }
-+ .debug_sfnames 0 : { *(.debug_sfnames) }
-+ .line 0 : { *(.line) }
-+ /* These must appear regardless of . */
-+ .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) }
-+ .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) }
-+ .comment : { *(.comment) }
-+ .note : { *(.note) }
-+}
-diff -Naru linux/arch/mips/zboot/xxs1500/Makefile linux-new/arch/mips/zboot/xxs1500/Makefile
---- linux/arch/mips/zboot/xxs1500/Makefile 1969-12-31 19:00:00.000000000 -0500
-+++ linux-new/arch/mips/zboot/xxs1500/Makefile 2003-12-18 14:26:21.000000000 -0500
-@@ -0,0 +1,123 @@
-+# arch/mips/compressed/alchemy/Makefile
-+#
-+# Makefile for Alchemy Semiconductor Pb1[015]00 boards.
-+# All of the boot loader code was derived from the ppc
-+# boot code.
-+#
-+# Copyright 2001,2002 MontaVista Software Inc.
-+#
-+# Author: Mark A. Greer
-+# mgreer@mvista.com
-+# Ported and modified for mips support by
-+# Pete Popov <ppopov@mvista.com>
-+#
-+# This program is free software; you can redistribute it and/or modify it
-+# 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.
-+
-+.c.s:
-+ $(CC) $(CFLAGS) -S -o $*.s $<
-+.s.o:
-+ $(AS) -o $*.o $<
-+.c.o:
-+ $(CC) $(CFLAGS) -D__BOOTER__ -c -o $*.o $<
-+.S.s:
-+ $(CPP) $(AFLAGS) -o $*.o $<
-+.S.o:
-+ $(CC) $(AFLAGS) -c -o $*.o $<
-+
-+#########################################################################
-+# START BOARD SPECIFIC VARIABLES
-+BNAME=xxs1500
-+
-+
-+# These two variables control where the zImage is stored
-+# in flash and loaded in memory. If you change either one,
-+# be sure to make the appropriate change to the zImage
-+# rule.
-+RAM_LOAD_ADDR = 0x81000000
-+FLASH_LOAD_ADDR = 0xBF000000
-+
-+# These two variables specify the free ram region
-+# that can be used for temporary malloc area
-+AVAIL_RAM_START=0x80400000
-+AVAIL_RAM_END=0x80800000
-+
-+# This one must match the LOADADDR in arch/mips/Makefile!
-+LOADADDR=0x80100000
-+# END BOARD SPECIFIC VARIABLES
-+#########################################################################
-+
-+ZLINKFLAGS = -T ld.script -Ttext $(RAM_LOAD_ADDR)
-+
-+OBJECTS := head.o ../common/misc-common.o ../common/misc-simple.o \
-+ ../common/au1k_uart.o ../common/string.o ../common/ctype.o
-+LIBS := ../lib/zlib.a
-+
-+ENTRY := ../utils/entry
-+OFFSET := ../utils/offset
-+SIZE := ../utils/size
-+
-+all: zImage
-+
-+clean:
-+ rm -rf *.o vmlinux* zvmlinux.*
-+
-+head.o: head.S $(TOPDIR)/vmlinux
-+ $(CC) -DFLASH_LOAD_ADDR=$(FLASH_LOAD_ADDR) $(AFLAGS) \
-+ -DKERNEL_ENTRY=$(shell sh $(ENTRY) $(NM) $(TOPDIR)/vmlinux ) \
-+ -c -o $*.o $<
-+
-+../common/misc-simple.o:
-+ $(CC) $(CFLAGS) -DINITRD_OFFSET=0 -DINITRD_SIZE=0 -DZIMAGE_OFFSET=0 \
-+ -DAVAIL_RAM_START=$(AVAIL_RAM_START) \
-+ -DAVAIL_RAM_END=$(AVAIL_RAM_END) \
-+ -DLOADADDR=$(LOADADDR) \
-+ -DZIMAGE_SIZE=0 -c -o $@ $*.c
-+
-+# This is the first pass at building the boot loader image,
-+# without knowing the file offset where the vmlinuz.gz
-+# kernel will end up. We build this image, check the offset,
-+# and then rebuild it with the correct offset and size
-+# passed to mips-simple.c
-+zvmlinux.no: $(OBJECTS) $(LIBS) ../images/vmlinux.gz
-+ $(LD) $(ZLINKFLAGS) -o $@.tmp $(OBJECTS) $(LIBS)
-+ $(OBJCOPY) -R .comment \
-+ --add-section=image=../images/vmlinux.gz \
-+ $@.tmp $@
-+ # rm -f $@.tmp
-+
-+
-+# This is the final image we build, now that we know what
-+# the vmlinuz.gz offset is.
-+zvmlinux: $(OBJECTS) $(LIBS) ../images/vmlinux.gz zvmlinux.no
-+ $(CC) $(CFLAGS) -DINITRD_OFFSET=0 -DINITRD_SIZE=0 \
-+ -DZIMAGE_OFFSET=$(shell sh $(OFFSET) $(OBJDUMP) $@.no image) \
-+ -DZIMAGE_SIZE=$(shell sh $(SIZE) $(OBJDUMP) $@.no image) \
-+ -D__BOOTER__ \
-+ -DAVAIL_RAM_START=$(AVAIL_RAM_START) \
-+ -DAVAIL_RAM_END=$(AVAIL_RAM_END) \
-+ -DLOADADDR=$(LOADADDR) \
-+ -c -o ../common/misc-simple.o ../common/misc-simple.c
-+ $(LD) $(ZLINKFLAGS) -o $@.tmp $(OBJECTS) $(LIBS)
-+ $(OBJCOPY) -R .comment \
-+ --add-section=image=../images/vmlinux.gz \
-+ $@.tmp $@
-+ $(OBJCOPY) --adjust-section-vma=image+$(RAM_LOAD_ADDR) $@
-+ $(OBJCOPY) --adjust-section-vma=image+$(shell sh $(OFFSET) \
-+ $(OBJDUMP) $@.no image ) $@
-+ # rm -f $@.tmp
-+ # rm -f $@.no
-+
-+
-+# Here we manipulate the image in order to get it the necessary
-+# srecord file we need.
-+zImage: zvmlinux
-+ mv zvmlinux ../images/$@.$(BNAME)
-+ $(OBJCOPY) --set-section-flags=image=alloc,load,code ../images/$@.$(BNAME)
-+ $(OBJCOPY) -O srec --adjust-vma 0x3e000000 \
-+ ../images/$@.$(BNAME) ../images/$@.$(BNAME).srec
-+ # rm ../images/vmlinux.gz
-+
-+include $(TOPDIR)/Rules.make