From ecf639e30a1ceb7db19b63dd601aacc2a8a24554 Mon Sep 17 00:00:00 2001 From: Matheus Date: Sat, 23 Jul 2022 21:11:34 -0300 Subject: [PATCH] fix more glitches with the pmm --- src/sys/mm/pmm.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/sys/mm/pmm.c b/src/sys/mm/pmm.c index be73bb21..2d421e58 100644 --- a/src/sys/mm/pmm.c +++ b/src/sys/mm/pmm.c @@ -32,9 +32,8 @@ void* pmm_usabletop; int lock = 0; static int getstate(void* addr){ - if(addr > bitmaptop) return STATE_USED; if(addr >= limine_hhdm_offset) addr -= limine_hhdm_offset; - + if(addr > bitmaptop) return STATE_USED; size_t page = (size_t)addr / PAGE_SIZE; @@ -50,9 +49,9 @@ static int getstate(void* addr){ } static void setstate(void* addr, size_t state){ - if(addr > bitmaptop) return; if(addr >= limine_hhdm_offset) addr -= limine_hhdm_offset; - + if(addr > bitmaptop) return; + size_t page = (size_t)addr / PAGE_SIZE; // find the exact size_t sized chunk that the entry resides in @@ -99,6 +98,8 @@ void* pmm_alloc(size_t count){ void* addr = lastfree; + + for(; addr < bitmaptop; addr += PAGE_SIZE){ if(getstate(addr) == STATE_USED) @@ -114,15 +115,21 @@ void* pmm_alloc(size_t count){ if(getstate(base) == STATE_FREE) break; + + // nope, skip the entire thing addr = base; } - if(addr >= bitmaptop) addr = NULL; + if(addr >= bitmaptop){ + spinlock_release(&lock); + return NULL; + } - if(addr) for(size_t i = 0; i < count; ++i) setstate(addr + i * PAGE_SIZE, STATE_USED); + for(size_t i = 0; i < count; ++i) setstate(addr + i * PAGE_SIZE, STATE_USED); + spinlock_release(&lock); @@ -205,7 +212,9 @@ void pmm_init(){ _panic("No available memory for bitmap", 0); printf("Bitmap at %p\n", bitmap); - + + memset(bitmap, 0, bitmapsize); + // mark needed entries as used now printf("Ranges: \n"); @@ -235,7 +244,7 @@ void pmm_init(){ bitmappages = (size_t)bitmaptop / PAGE_SIZE + 1; - pmm_setused(bitmap, bitmappages); + pmm_setused(bitmap, bitmapsize / 4096); pmm_usabletop = bitmaptop;