vmm: broken vmm
This commit is contained in:
parent
33f88512d4
commit
875dc2685b
2 changed files with 15 additions and 8 deletions
|
@ -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() {
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue