diff options
author | Poul-Henning Kamp <phk@FreeBSD.org> | 1995-05-29 01:38:07 +0000 |
---|---|---|
committer | Poul-Henning Kamp <phk@FreeBSD.org> | 1995-05-29 01:38:07 +0000 |
commit | 13eb7024472c9956978c0610cee0cdf0b5e0b59e (patch) | |
tree | 3d2dde3941e8f71c784ec431290b2aa4d131233d /sys/i386/boot/kzipboot/malloc.c | |
parent | b82e26f63a208bf2b57226417da64bb2e11b95ae (diff) | |
download | src-13eb7024472c9956978c0610cee0cdf0b5e0b59e.tar.gz src-13eb7024472c9956978c0610cee0cdf0b5e0b59e.zip |
Reduce the amount of bss the kzip stuff uses by moving big buffers into
the first Mb of memory. Makes 4Mb machines more happy.
Notes
Notes:
svn path=/head/; revision=8827
Diffstat (limited to 'sys/i386/boot/kzipboot/malloc.c')
-rw-r--r-- | sys/i386/boot/kzipboot/malloc.c | 187 |
1 files changed, 8 insertions, 179 deletions
diff --git a/sys/i386/boot/kzipboot/malloc.c b/sys/i386/boot/kzipboot/malloc.c index ef574586257a..b540ec1bc54b 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 */ |