diff --git a/src/kernel/memory/kbrk.c b/src/kernel/memory/kbrk.c index d56ee55..ca38f4f 100644 --- a/src/kernel/memory/kbrk.c +++ b/src/kernel/memory/kbrk.c @@ -1,5 +1,7 @@ #include #include +#include +#include static long _brk = KERNEL_BRK0; static long _mmap = KERNEL_MMAP; @@ -33,14 +35,22 @@ long k_mmap( if(fd != -1) PANIC("Unknown mmap request\n"); - long retval = _mmap; - while(length > 0) { + long pos = (flags & MAP_FIXED) ? addr : _mmap; + long retval = pos; + uint64_t p; + while(length >= 0) { + p = pmm_alloc(); vmm_set_page(kernel_P4, - _mmap, pmm_alloc(), + pos, p, PAGE_GLOBAL | PAGE_WRITE | PAGE_PRESENT ); - _mmap += PAGE_SIZE; + if(flags & MAP_ANONYMOUS) { + memset((void *)pos, 0, PAGE_SIZE); + } + pos += PAGE_SIZE; length -= PAGE_SIZE; } + if(!(flags & MAP_FIXED)) + _mmap = pos; return retval; } \ No newline at end of file