vmm: broken vmm

This commit is contained in:
RaphProductions 2025-05-18 19:36:49 +02:00
parent 33f88512d4
commit 875dc2685b
2 changed files with 15 additions and 8 deletions

View file

@ -21,10 +21,13 @@ static pmm_region_t *pmm_region_list_head = NULL;
static pmm_page_t *pmm_free_list_head = NULL; static pmm_page_t *pmm_free_list_head = NULL;
void pmm_free_page(void *mem) { void pmm_free_page(void *mem) {
pmm_page_t *page = (pmm_page_t*)mem; if (!mem)
pmm_page_t *page_hhalf = (pmm_page_t*)higher_half((uint64_t)page); return;
page_hhalf->next = (pmm_page_t*)higher_half((uint64_t)pmm_free_list_head);
pmm_free_list_head = page_hhalf; 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++; 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 + void *page = (void*)pmm_region_list_head->base +
pmm_region_list_head->length; pmm_region_list_head->length;
pmm_free_page(page); pmm_free_page(page);
//trace("pmm: stealer: page is %p\n", page);
if (pmm_region_list_head->length == 0) if (pmm_region_list_head->length == 0)
{ {
@ -63,11 +67,12 @@ void *pmm_alloc_page() {
pmm_available_pages--; pmm_available_pages--;
pmm_page_t *page = pmm_free_list_head; pmm_page_t *page = pmm_free_list_head;
pmm_page_t *page_hhalf = (pmm_page_t*)higher_half((uint64_t)page); trace("pmm: alloc: page is %p\n", page);
pmm_free_list_head = page_hhalf->next; 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); memset(page, 0, PMM_PAGE_SIZE);
return page; return (void*)physical((uint64_t)page);
} }
void pmm_init() { void pmm_init() {

View file

@ -96,6 +96,7 @@ void vmm_free_pm(pagemap_t pm) {
static uint64_t *__vmm_get_next_lvl(uint64_t *level, uint64_t entry, static uint64_t *__vmm_get_next_lvl(uint64_t *level, uint64_t entry,
uint64_t flags, bool alloc) { uint64_t flags, bool alloc) {
//trace("level: %p, level[entry]: %p\n", level, level + entry);
if (level[entry] & PTE_PRESENT) if (level[entry] & PTE_PRESENT)
return (uint64_t *)higher_half(PTE_GET_ADDR(level[entry])); return (uint64_t *)higher_half(PTE_GET_ADDR(level[entry]));
if (alloc) { 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) { void vmm_map(pagemap_t pm, uint64_t vaddr, uint64_t paddr, uint64_t flags) {
if (!pm) return; if (!pm) return;
//trace("pm: %p, vaddr: %p, paddr: %p\n", pm, vaddr, paddr);
uint64_t pml4_entry = (vaddr >> 39) & 0x1ff; uint64_t pml4_entry = (vaddr >> 39) & 0x1ff;
uint64_t pml3_entry = (vaddr >> 30) & 0x1ff; uint64_t pml3_entry = (vaddr >> 30) & 0x1ff;
uint64_t pml2_entry = (vaddr >> 21) & 0x1ff; uint64_t pml2_entry = (vaddr >> 21) & 0x1ff;