diff options
author | phk <phk@FreeBSD.org> | 1995-05-29 01:38:07 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 1995-05-29 01:38:07 +0000 |
commit | 570995b82cb452800f4827f23ce59bc9dd8cf989 (patch) | |
tree | 3d2dde3941e8f71c784ec431290b2aa4d131233d | |
parent | afa4cca26620e9217d7aafa58be6ce5c50dd2b87 (diff) | |
download | FreeBSD-src-570995b82cb452800f4827f23ce59bc9dd8cf989.zip FreeBSD-src-570995b82cb452800f4827f23ce59bc9dd8cf989.tar.gz |
Reduce the amount of bss the kzip stuff uses by moving big buffers into
the first Mb of memory. Makes 4Mb machines more happy.
-rw-r--r-- | sys/i386/boot/kzipboot/Makefile | 4 | ||||
-rw-r--r-- | sys/i386/boot/kzipboot/boot.c | 21 | ||||
-rw-r--r-- | sys/i386/boot/kzipboot/gzip.h | 12 | ||||
-rw-r--r-- | sys/i386/boot/kzipboot/malloc.c | 187 | ||||
-rw-r--r-- | sys/i386/boot/kzipboot/misc.c | 4 | ||||
-rw-r--r-- | sys/i386/boot/kzipboot/unzip.c | 40 |
6 files changed, 32 insertions, 236 deletions
diff --git a/sys/i386/boot/kzipboot/Makefile b/sys/i386/boot/kzipboot/Makefile index 3ed6f52..0884fbd 100644 --- a/sys/i386/boot/kzipboot/Makefile +++ b/sys/i386/boot/kzipboot/Makefile @@ -1,4 +1,4 @@ -# $Id$ +# $Id: Makefile,v 1.1 1995/04/15 08:23:31 phk Exp $ PROG= kzip.o SRCS= head.S boot.c unzip.c misc.c malloc.c inflate.c @@ -15,7 +15,7 @@ CSEG = 0x8 STRIP= # very important!! don't let kzip.o be stripped CFLAGS+= -DKADDR=$(KADDR) -DCSEG=$(CSEG) -CFLAGS+= -DUSE_KERNEL_INFLATE -DKZIP -DCOMCONSOLE=0x3F8 +CFLAGS+= -DKZIP -DCOMCONSOLE=0x3F8 kzip.o: ${OBJS} $(LD) -r -x -o kzip.o $(OBJS) diff --git a/sys/i386/boot/kzipboot/boot.c b/sys/i386/boot/kzipboot/boot.c index 2c91fe4..7a15e4e 100644 --- a/sys/i386/boot/kzipboot/boot.c +++ b/sys/i386/boot/kzipboot/boot.c @@ -16,21 +16,13 @@ unsigned int port; unsigned char bios[0x100]; extern int end, edata; +void *storage; +void *inbuf; +void *outbuf; +void *window; void decompress_kernel (void *dest); -#if 0 -inline void outb (unsigned short x, unsigned char y) -{ - asm volatile ("outb %0, %1" : : "a" (y) , "d" (x)); -} - -inline unsigned char inb (unsigned short x, unsigned char y) -{ - asm volatile ("inb %0, %1" : : "a" (y) , "d" (x)); -} -#endif - int memcmp (const void *arg1, const void *arg2, unsigned len) { unsigned char *a = (unsigned char*) arg1; @@ -108,6 +100,11 @@ void boot (int howto) for (p = &edata; p < &end; ++p) *p = 0; + inbuf = (void *)0x20000; + outbuf = (void *)0x30000; + window = (void *)0x40000; + storage = (void *)0x50000; + if (!(use_serial = (howto & RB_SERIAL))) { /* Test for monochrome video adapter */ if ((*((unsigned char*) 0x410) & 0x30) == 0x30) diff --git a/sys/i386/boot/kzipboot/gzip.h b/sys/i386/boot/kzipboot/gzip.h index 0ad5ce35..e578532 100644 --- a/sys/i386/boot/kzipboot/gzip.h +++ b/sys/i386/boot/kzipboot/gzip.h @@ -7,9 +7,6 @@ */ typedef unsigned char uchar; -#ifndef USE_KERNEL_INFLATE -typedef unsigned short ushort; -#endif typedef unsigned long ulong; #define NULL 0 @@ -45,9 +42,9 @@ typedef unsigned long ulong; extern int method; /* compression method */ -extern uchar inbuf[]; /* input buffer */ -extern uchar outbuf[]; /* output buffer */ -extern uchar window[]; /* Sliding window and suffix table (unlzw) */ +extern uchar *inbuf; /* input buffer */ +extern uchar *outbuf; /* output buffer */ +extern uchar *window; /* Sliding window and suffix table (unlzw) */ extern unsigned insize; /* valid bytes in inbuf */ extern unsigned inptr; /* index of next byte to be processed in inbuf */ @@ -65,9 +62,6 @@ extern void clear_bufs (void); extern void fill_inbuf (void); extern void flush_window (void); extern void error (char *m); -#ifndef USE_KERNEL_INFLATE -extern int inflate (void); -#endif static inline uchar get_byte () { diff --git a/sys/i386/boot/kzipboot/malloc.c b/sys/i386/boot/kzipboot/malloc.c index ef57458..b540ec1 100644 --- a/sys/i386/boot/kzipboot/malloc.c +++ b/sys/i386/boot/kzipboot/malloc.c @@ -31,180 +31,23 @@ * SUCH DAMAGE. */ -/* - * malloc.c (Caltech) 2/21/82 - * Chris Kingsley, kingsley@cit-20. - * - * This is a very fast storage allocator. It allocates blocks of a small - * number of different sizes, and keeps free lists of each size. Blocks that - * don't exactly fit are passed up to the next larger size. In this - * implementation, the available sizes are 2^n-4 (or 2^n-10) bytes long. - * This is designed for use in a virtual memory environment. - * - * Modified for stand-alone use (for kzip) by Gary Jennejohn - 12FEB95 - */ -#ifdef USE_KERNEL_INFLATE - #include <sys/types.h> -#define NULL 0 - -/* - * The overhead on a block is at least 4 bytes. When free, this space - * contains a pointer to the next free block, and the bottom two bits must - * be zero. When in use, the first byte is set to MAGIC, and the second - * byte is the size index. The remaining bytes are for alignment. - * If range checking is enabled then a second word holds the size of the - * requested block, less 1, rounded up to a multiple of sizeof(RMAGIC). - * The order of elements is critical: ov_magic must overlay the low order - * bits of ov_next, and ov_magic can not be a valid ov_next bit pattern. - */ -union overhead { - union overhead *ov_next; /* when free */ - struct { - u_char ovu_magic; /* magic number */ - u_char ovu_index; /* bucket # */ - } ovu; -#define ov_magic ovu.ovu_magic -#define ov_index ovu.ovu_index -#define ov_rmagic ovu.ovu_rmagic -#define ov_size ovu.ovu_size -}; - -#define MAGIC 0xef /* magic # on accounting info */ -#define RMAGIC 0x5555 /* magic # on range info */ - -#define RSLOP 0 - -/* - * nextf[i] is the pointer to the next free block of size 2^(i+3). The - * smallest allocatable block is 8 bytes. The overhead information - * precedes the data area returned to the user. - */ -#define NBUCKETS 30 -static union overhead *nextf[NBUCKETS]; - -static int pagesz; /* page size */ -static int pagebucket; /* page size bucket */ - -#define STORAGE 40960 /* must be at least this big to handle GENERIC */ -unsigned char storage [STORAGE]; -int next_free; /* need this to emulate sbrk() */ - -#define ASSERT(p) - -static void morecore (int); +extern unsigned char *storage; void * malloc(nbytes, junk1, junk2) /* junk? not used */ size_t nbytes; int junk1, junk2; { - register union overhead *op; - register int bucket, n; - register unsigned amt; - - /* - * First time malloc is called, setup page size and - * align break pointer so all data will be page aligned. - */ - if (pagesz == 0) { - pagesz = n = 4096; - op = (union overhead *)storage; - n = n - sizeof (*op) - ((int)op & (n - 1)); - if (n < 0) - n += pagesz; - if (n > STORAGE) - return (NULL); - - next_free = n; - - bucket = 0; - amt = 8; - while (pagesz > amt) { - amt <<= 1; - bucket++; - } - pagebucket = bucket; - } - /* - * Convert amount of memory requested into closest block size - * stored in hash buckets which satisfies request. - * Account for space used per block for accounting. - */ - if (nbytes <= (n = pagesz - sizeof (*op) - RSLOP)) { - amt = 8; /* size of first bucket */ - bucket = 0; - n = -(sizeof (*op) + RSLOP); - } else { - amt = pagesz; - bucket = pagebucket; - } - while (nbytes > amt + n) { - amt <<= 1; - if (amt == 0) - return (NULL); - bucket++; - } - /* - * If nothing in hash bucket right now, - * request more memory from the system. - */ - if ((op = nextf[bucket]) == NULL) { - morecore(bucket); - if ((op = nextf[bucket]) == NULL) - return (NULL); + unsigned char *p = storage; + storage += nbytes; + if (storage >= 0xa0000) { + putstr("warning: malloc wrapped\n\r"); + p = (unsigned char *)0x50000; + storage = p + nbytes; } - - /* remove from linked list */ - nextf[bucket] = op->ov_next; - op->ov_magic = MAGIC; - op->ov_index = bucket; - return ((char *)(op + 1)); -} - -/* - * Allocate more memory to the indicated bucket. - */ -static void -morecore(bucket) - int bucket; -{ - register union overhead *op; - register int sz; /* size of desired block */ - int amt; /* amount to allocate */ - int nblks; /* how many blocks we get */ - - /* - * sbrk_size <= 0 only for big, FLUFFY, requests (about - * 2^30 bytes on a VAX, I think) or for a negative arg. - */ - sz = 1 << (bucket + 3); - - if (sz <= 0) - return; - - if (sz < pagesz) { - amt = pagesz; - nblks = amt / sz; - } else { - amt = sz + pagesz; - nblks = 1; - } - /* no more room! */ - if (amt > (STORAGE - next_free)) - return; - op = (union overhead *)&storage [next_free]; - next_free += amt; - /* - * Add new memory allocated to that on - * free list for this hash bucket. - */ - nextf[bucket] = op; - while (--nblks > 0) { - op->ov_next = (union overhead *)((caddr_t)op + sz); - op = (union overhead *)((caddr_t)op + sz); - } + return p; } void @@ -212,18 +55,4 @@ free(cp, junk) /* junk not used */ void *cp; int junk; { - register int size; - register union overhead *op; - - if (cp == NULL) - return; - op = (union overhead *)((caddr_t)cp - sizeof (union overhead)); - if (op->ov_magic != MAGIC) - return; /* sanity */ - size = op->ov_index; - ASSERT(size < NBUCKETS); - op->ov_next = nextf[size]; /* also clobbers ov_magic */ - nextf[size] = op; } - -#endif /* USE_KERNEL_INFLATE */ diff --git a/sys/i386/boot/kzipboot/misc.c b/sys/i386/boot/kzipboot/misc.c index 13396f4..adf0e0d 100644 --- a/sys/i386/boot/kzipboot/misc.c +++ b/sys/i386/boot/kzipboot/misc.c @@ -9,10 +9,6 @@ #include "gzip.h" -uchar inbuf [INBUFSIZ]; -uchar outbuf [OUTBUFSIZ+OUTBUF_EXTRA]; -uchar window [WSIZE]; - unsigned outcnt; unsigned insize; unsigned inptr; diff --git a/sys/i386/boot/kzipboot/unzip.c b/sys/i386/boot/kzipboot/unzip.c index b3a9b5a..5883bc0 100644 --- a/sys/i386/boot/kzipboot/unzip.c +++ b/sys/i386/boot/kzipboot/unzip.c @@ -20,10 +20,8 @@ #include "gzip.h" -#ifdef USE_KERNEL_INFLATE #include <sys/types.h> #include <sys/inflate.h> -#endif /* PKZIP header definitions */ #define LOCSIG 0x04034b50L /* four-byte lead-in (lsb first) */ @@ -74,7 +72,6 @@ void check_zipfile() pkzip = 1; } -#ifdef USE_KERNEL_INFLATE int Flush (void *nu, u_char *buf, u_long cnt) { @@ -91,8 +88,6 @@ NextByte (void *nu) struct inflate infl; /* put it into the BSS */ -#endif - /* * Unzip in to out. This routine works on both gzip and pkzip files. * @@ -106,7 +101,7 @@ void unzip() ulong orig_crc = 0; /* original crc */ ulong orig_len = 0; /* original uncompressed length */ uchar buf[EXTHDR]; /* extended local header */ - int n; + int n, res; crc = 0xffffffffL; /* initialize crc */ @@ -115,31 +110,16 @@ void unzip() orig_len = LG(inbuf + LOCLEN); } - /* Decompress */ - if (method == DEFLATED) { -#ifdef USE_KERNEL_INFLATE - int res; - infl.gz_input = NextByte; - infl.gz_output = Flush; - infl.gz_slide = window; - res = inflate (&infl); -#else - int res = inflate(); -#endif - if (res == 3) - error("out of memory"); - else if (res != 0) - error("invalid compressed format"); - - } else if (pkzip && method == STORED) { - register ulong n = LG(inbuf + LOCLEN); - - if (n != LG(inbuf + LOCSIZ)) - error("length mismatch"); - while (n--) - put_char(get_byte()); - } else + if (method != DEFLATED) error("internal error, invalid method"); + infl.gz_input = NextByte; + infl.gz_output = Flush; + infl.gz_slide = window; + res = inflate (&infl); + if (res == 3) + error("out of memory"); + else if (res != 0) + error("invalid compressed format"); /* Get the crc and original length */ if (!pkzip) { |