version 1.1, 2007/10/16 09:41:04 |
version 1.7, 2007/10/26 14:15:20 |
|
|
#include <sys/mem.h> |
#include <sys/mem.h> |
#include <libkern/printf.h> |
#include <libkern/printf.h> |
|
|
#define KMEM_DEBUG |
/* #define KMEM_DEBUG */ |
|
|
#ifdef KMEM_DEBUG |
#ifdef KMEM_DEBUG |
#define DPRINTF(x...) do { printf(x); } while (0) |
#define DPRINTF(x...) do { printf(x); } while (0) |
|
|
DPRINTF("kmalloc: requested %d bytes (%d pages) of %d free pages; ", nbytes, npages, freepages); |
DPRINTF("kmalloc: requested %d bytes (%d pages) of %d free pages; ", nbytes, npages, freepages); |
|
|
/* check if we have enough free pages */ |
/* check if we have enough free pages */ |
if (npages >= freepages) { |
if (npages > freepages) { |
DPRINTF("not enough free pages\n"); |
DPRINTF("not enough free pages\n"); |
return(NULL); |
return(NULL); |
} |
} |
|
|
|
|
/* calculate pointer to this (last) page */ |
/* calculate pointer to this (last) page */ |
lastpageptr = (uint32_t *)((allocbase + (8 * nmbmbytes * KMEM_PAGESIZE)) + (KMEM_PAGESIZE * nmbmbits)); |
lastpageptr = (uint32_t *)((allocbase + (8 * nmbmbytes * KMEM_PAGESIZE)) + (KMEM_PAGESIZE * nmbmbits)); |
DPRINTF("lastpageptr=0x%x\n", lastpageptr); |
|
|
|
/* rewind pointer to the first byte */ |
/* rewind pointer to the first byte */ |
firstpageptr = lastpageptr - ((npages - 1)); |
firstpageptr = lastpageptr - ((npages - 1)); |
DPRINTF("firstpageptr=0x%x\n", firstpageptr); |
|
|
|
offbits = mask ? mask - 1 : mask; /* XXX */ |
|
/* fill this (npages pages) region with zeroes */ |
/* fill this (npages pages) region with zeroes */ |
while(firstpageptr <= lastpageptr) { |
while(firstpageptr <= lastpageptr) { |
|
|
/* TODO invalidate page in membmap */ |
/* TODO invalidate page in membmap */ |
offbytes = ((uint32_t)firstpageptr - (uint32_t)allocbase) / (KMEM_PAGESIZE * 8); |
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); |
// printf("membmap[%d] |= 1 << %d\n", offbytes, offbits); |
membmap[offbytes] |= 1 << offbits; |
membmap[offbytes] |= 1 << offbits; |
|
|
/* zerofy page */ |
/* zerofy page */ |
for (i = 0; i < KMEM_PAGESIZE; i++) { |
for (i = 0; i < KMEM_PAGESIZE; i++) { |
*(uint8_t *)firstpageptr = 0xaa; |
*(uint8_t *)firstpageptr = KMEM_FILLBYTE; |
((uint8_t *)firstpageptr)++; |
((uint8_t *)firstpageptr)++; |
} |
} |
/* TODO rework offbits calculation */ |
/* TODO rework offbits calculation */ |
|
|
firstpageptr = lastpageptr - ((npages - 1)); |
firstpageptr = lastpageptr - ((npages - 1)); |
|
|
/* got it */ |
/* got it */ |
DPRINTF("allocated, addr=0x%x\n", firstpageptr); |
DPRINTF("allocated, addr=0x%x len=%d [0x%x-0x%x]\n", firstpageptr, npages * KMEM_PAGESIZE, firstpageptr, lastpageptr); |
|
|
/* decrement system free pages */ |
/* decrement system free pages */ |
freepages -= npages; |
freepages -= npages; |