=================================================================== RCS file: /cvs/funnyos/kern/kern_mem.c,v retrieving revision 1.4 retrieving revision 1.7 diff -u -r1.4 -r1.7 --- funnyos/kern/kern_mem.c 2007/10/16 13:45:16 1.4 +++ funnyos/kern/kern_mem.c 2007/10/26 14:15:20 1.7 @@ -1,11 +1,11 @@ /* - * $Id: kern_mem.c,v 1.4 2007/10/16 12:45:16 init Exp $ + * $Id: kern_mem.c,v 1.7 2007/10/26 13:15:20 init Exp $ */ #include #include #include -#define KMEM_DEBUG +/* #define KMEM_DEBUG */ #ifdef KMEM_DEBUG #define DPRINTF(x...) do { printf(x); } while (0) @@ -125,7 +125,7 @@ DPRINTF("kmalloc: requested %d bytes (%d pages) of %d free pages; ", nbytes, npages, freepages); /* check if we have enough free pages */ - if (npages >= freepages) { + if (npages > freepages) { DPRINTF("not enough free pages\n"); return(NULL); } @@ -158,13 +158,16 @@ /* rewind pointer to the first byte */ firstpageptr = lastpageptr - ((npages - 1)); - offbits = nmbmbits; /* fill this (npages pages) region with zeroes */ while(firstpageptr <= lastpageptr) { /* TODO invalidate page in membmap */ offbytes = ((uint32_t)firstpageptr - (uint32_t)allocbase) / (KMEM_PAGESIZE * 8); -// printf("offbytes=%d\n", offbytes); + offbits = ((uint32_t)firstpageptr - (uint32_t)allocbase) / (KMEM_PAGESIZE); + + if (offbits > 7) + offbits -= 8 * (offbits / 8); + // printf("membmap[%d] |= 1 << %d\n", offbytes, offbits); membmap[offbytes] |= 1 << offbits; @@ -184,7 +187,7 @@ firstpageptr = lastpageptr - ((npages - 1)); /* got it */ - DPRINTF("allocated, addr=0x%x len=0x%x [0x%x-0x%x]\n", firstpageptr, npages * KMEM_PAGESIZE, firstpageptr, lastpageptr); + DPRINTF("allocated, addr=0x%x len=%d [0x%x-0x%x]\n", firstpageptr, npages * KMEM_PAGESIZE, firstpageptr, lastpageptr); /* decrement system free pages */ freepages -= npages;