diff --git a/kernel/src/mm/pmm.c b/kernel/src/mm/pmm.c index e3d9be9..1d75182 100644 --- a/kernel/src/mm/pmm.c +++ b/kernel/src/mm/pmm.c @@ -21,10 +21,13 @@ static pmm_region_t *pmm_region_list_head = NULL; static pmm_page_t *pmm_free_list_head = NULL; void pmm_free_page(void *mem) { - pmm_page_t *page = (pmm_page_t*)mem; - pmm_page_t *page_hhalf = (pmm_page_t*)higher_half((uint64_t)page); - page_hhalf->next = (pmm_page_t*)higher_half((uint64_t)pmm_free_list_head); - pmm_free_list_head = page_hhalf; + if (!mem) + return; + + pmm_page_t *page = (pmm_page_t*)higher_half((uint64_t)mem); + page->next = pmm_free_list_head ? (pmm_page_t*)higher_half((uint64_t)pmm_free_list_head) : 0x0; + pmm_free_list_head = page; + //trace("pmm: free: page free list head is now %p\n", page); pmm_available_pages++; } @@ -35,6 +38,7 @@ static void __pmm_steal_pages_from_region_head(int pages) { void *page = (void*)pmm_region_list_head->base + pmm_region_list_head->length; pmm_free_page(page); + //trace("pmm: stealer: page is %p\n", page); if (pmm_region_list_head->length == 0) { @@ -63,11 +67,12 @@ void *pmm_alloc_page() { pmm_available_pages--; pmm_page_t *page = pmm_free_list_head; - pmm_page_t *page_hhalf = (pmm_page_t*)higher_half((uint64_t)page); - pmm_free_list_head = page_hhalf->next; + trace("pmm: alloc: page is %p\n", page); + pmm_free_list_head = page->next; + //trace("pmm: alloc: free page list head is now %p\n", page); - //memset(page_hhalf, 0, PMM_PAGE_SIZE); - return page; + memset(page, 0, PMM_PAGE_SIZE); + return (void*)physical((uint64_t)page); } void pmm_init() { diff --git a/kernel/src/mm/vmm.c b/kernel/src/mm/vmm.c index f4ce7d3..112ef16 100644 --- a/kernel/src/mm/vmm.c +++ b/kernel/src/mm/vmm.c @@ -96,6 +96,7 @@ void vmm_free_pm(pagemap_t pm) { static uint64_t *__vmm_get_next_lvl(uint64_t *level, uint64_t entry, uint64_t flags, bool alloc) { + //trace("level: %p, level[entry]: %p\n", level, level + entry); if (level[entry] & PTE_PRESENT) return (uint64_t *)higher_half(PTE_GET_ADDR(level[entry])); if (alloc) { @@ -110,6 +111,7 @@ static uint64_t *__vmm_get_next_lvl(uint64_t *level, uint64_t entry, void vmm_map(pagemap_t pm, uint64_t vaddr, uint64_t paddr, uint64_t flags) { if (!pm) return; + //trace("pm: %p, vaddr: %p, paddr: %p\n", pm, vaddr, paddr); uint64_t pml4_entry = (vaddr >> 39) & 0x1ff; uint64_t pml3_entry = (vaddr >> 30) & 0x1ff; uint64_t pml2_entry = (vaddr >> 21) & 0x1ff;