diff options
Diffstat (limited to 'lkm/vinum/memory.c')
-rw-r--r-- | lkm/vinum/memory.c | 198 |
1 files changed, 0 insertions, 198 deletions
diff --git a/lkm/vinum/memory.c b/lkm/vinum/memory.c deleted file mode 100644 index e77af7e..0000000 --- a/lkm/vinum/memory.c +++ /dev/null @@ -1,198 +0,0 @@ -/*- - * Copyright (c) 1997, 1998 - * Nan Yang Computer Services Limited. All rights reserved. - * - * This software is distributed under the so-called ``Berkeley - * License'': - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Nan Yang Computer - * Services Limited. - * 4. Neither the name of the Company nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * 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 company or contributors 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. - * - * $Id: memory.c,v 1.17 1998/09/29 05:18:09 grog Exp grog $ - */ - -#define REALLYKERNEL -#define USES_VM -#include "vinumhdr.h" - -extern jmp_buf command_fail; /* return on a failed command */ - -#ifdef DEBUG -#include "request.h" -extern struct rqinfo rqinfo[]; -extern struct rqinfo *rqip; -#endif - -#if __FreeBSD__ >= 3 -/* Why aren't these declared anywhere? XXX */ -int setjmp(jmp_buf); -void longjmp(jmp_buf, int); -#endif - -void freedatabuf(struct mc *me); -caddr_t allocdatabuf(struct mc *me); - -void -expand_table(void **table, int oldsize, int newsize) -{ - if (newsize > oldsize) { - int *temp; - - temp = (int *) Malloc(newsize); /* allocate a new table */ - CHECKALLOC(temp, "vinum: Can't expand table\n"); - if (*table != NULL) { /* already something there, */ - bcopy((char *) *table, (char *) temp, oldsize); /* copy it to the old table */ - Free(*table); - } - *table = temp; - } -} - -#if DEBUG /* XXX debug */ -#define MALLOCENTRIES 16384 -int malloccount = 0; -int highwater = 0; /* highest index ever allocated */ -static struct mc malloced[MALLOCENTRIES]; - -static total_malloced; - -caddr_t -MMalloc(int size, char *file, int line) -{ - caddr_t result; - int i; - static int seq = 0; - int s; - struct mc me; /* information to pass to allocdatabuf */ - - if (malloccount >= MALLOCENTRIES) { /* too many */ - printf("vinum: can't allocate table space to trace memory allocation"); - return 0; /* can't continue */ - } - result = malloc(size, M_DEVBUF, M_WAITOK); /* use malloc for smaller and irregular stuff */ - if (result == NULL) - printf("vinum: can't allocate %d bytes from %s:%d\n", size, file, line); - else { - me.flags = 0; /* allocation via malloc */ - s = splhigh(); - for (i = 0; i < malloccount; i++) { - if (((result + size) > malloced[i].address) - && (result < malloced[i].address + malloced[i].size)) /* overlap */ - Debugger("Malloc overlap"); - } - if (result) { - char *f = index(file, '/'); /* chop off dirname if present */ - - if (f == NULL) - f = file; - i = malloccount++; - total_malloced += size; - malloced[i].address = result; - malloced[i].size = size; - malloced[i].line = line; - malloced[i].seq = seq++; - malloced[i].flags = me.flags; - malloced[i].databuf = me.databuf; /* only used with kva alloc */ - bcopy(f, malloced[i].file, min(strlen(f) + 1, 16)); - } - if (malloccount > highwater) - highwater = malloccount; - splx(s); - } - return result; -} - -void -FFree(void *mem, char *file, int line) -{ - int i; - int s; - - s = splhigh(); - for (i = 0; i < malloccount; i++) { - if ((caddr_t) mem == malloced[i].address) { /* found it */ - bzero(mem, malloced[i].size); /* XXX */ - free(mem, M_DEVBUF); - malloccount--; - total_malloced -= malloced[i].size; - if (i < malloccount) /* more coming after */ - bcopy(&malloced[i + 1], &malloced[i], (malloccount - i) * sizeof(struct mc)); - splx(s); - return; - } - } - splx(s); - printf("Freeing unallocated data at 0x%08x from %s, line %d\n", (int) mem, file, line); - Debugger("Free"); -} - -void -vinum_meminfo(caddr_t data) -{ - struct meminfo *m = (struct meminfo *) data; - - m->mallocs = malloccount; - m->total_malloced = total_malloced; - m->malloced = malloced; - m->highwater = highwater; -} - -int -vinum_mallocinfo(caddr_t data) -{ - struct mc *m = (struct mc *) data; - unsigned int ent = *(int *) data; /* 1st word is index */ - - if (ent >= malloccount) - return ENOENT; - m->address = malloced[ent].address; - m->size = malloced[ent].size; - m->line = malloced[ent].line; - m->seq = malloced[ent].seq; - bcopy(malloced[ent].file, m->file, 16); - return 0; -} - -/* return the nth request trace buffer entry. This - * is indexed back from the current entry (which - * has index 0) */ -int -vinum_rqinfo(caddr_t data) -{ - struct rqinfo *rq = (struct rqinfo *) data; - int ent = *(int *) data; /* 1st word is index */ - int lastent = rqip - rqinfo; /* entry number of current entry */ - - if (ent >= RQINFO_SIZE) /* out of the table */ - return ENOENT; - if ((ent = lastent - ent - 1) < 0) - ent += RQINFO_SIZE; /* roll over backwards */ - bcopy(&rqinfo[ent], rq, sizeof(struct rqinfo)); - return 0; -} -#endif |