vserver 1.9.3
[linux-2.6.git] / arch / ppc / boot / openfirmware / common.c
index 7119506..9e69527 100644 (file)
@@ -7,10 +7,10 @@
  * 2 of the License, or (at your option) any later version.
  */
 
-#include "zlib.h"
 #include "nonstdio.h"
 #include "of1275.h"
 #include <linux/string.h>
+#include <linux/zlib.h>
 #include <asm/bootinfo.h>
 #include <asm/page.h>
 
@@ -30,12 +30,11 @@ struct memchunk {
 
 static struct memchunk *freechunks;
 
-static void *zalloc(void *x, unsigned items, unsigned size)
+static void *zalloc(unsigned size)
 {
     void *p;
     struct memchunk **mpp, *mp;
 
-    size *= items;
     size = (size + 7) & -8;
     heap_use += size;
     if (heap_use > heap_max)
@@ -57,74 +56,57 @@ static void *zalloc(void *x, unsigned items, unsigned size)
     return p;
 }
 
-static void zfree(void *x, void *addr, unsigned nb)
-{
-    struct memchunk *mp = addr;
-
-    nb = (nb + 7) & -8;
-    heap_use -= nb;
-    if (avail_ram == addr + nb) {
-       avail_ram = addr;
-       return;
-    }
-    mp->size = nb;
-    mp->next = freechunks;
-    freechunks = mp;
-}
-
 #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) {
-       printf("bad gzipped data\n\r");
-       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) {
-       printf("gunzip: ran out of data in header\n\r");
-       exit();
-    }
+       z_stream s;
+       int r, i, flags;
+
+       /* skip header */
+       i = 10;
+       flags = src[3];
+       if (src[2] != Z_DEFLATED || (flags & RESERVED) != 0) {
+               printf("bad gzipped data\n\r");
+               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) {
+               printf("gunzip: ran out of data in header\n\r");
+               exit();
+       }
 
-    s.zalloc = zalloc;
-    s.zfree = zfree;
-    r = inflateInit2(&s, -MAX_WBITS);
-    if (r != Z_OK) {
-       printf("inflateInit2 returned %d\n\r", r);
-       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) {
-       printf("inflate returned %d msg: %s\n\r", r, s.msg);
-       exit();
-    }
-    *lenp = s.next_out - (unsigned char *) dst;
-    inflateEnd(&s);
+       /* Initialize ourself. */
+       s.workspace = zalloc(zlib_inflate_workspacesize());
+       r = zlib_inflateInit2(&s, -MAX_WBITS);
+       if (r != Z_OK) {
+               printf("zlib_inflateInit2 returned %d\n\r", r);
+               exit();
+       }
+       s.next_in = src + i;
+       s.avail_in = *lenp - i;
+       s.next_out = dst;
+       s.avail_out = dstlen;
+       r = zlib_inflate(&s, Z_FINISH);
+       if (r != Z_OK && r != Z_STREAM_END) {
+               printf("inflate returned %d msg: %s\n\r", r, s.msg);
+               exit();
+       }
+       *lenp = s.next_out - (unsigned char *) dst;
+       zlib_inflateEnd(&s);
 }
 
 /* Make a bi_rec in OF.  We need to be passed a name for BI_BOOTLOADER_ID,