void map_pages(uint32_t physical_address, uint32_t virtual_address, uint32_t size, uint32_t protect = PT_PRESENT | PT_WRITABLE | PT_USER) { int pages = SIZE_TO_PAGES(size); for (int i = 0; i < pages; i++) { UINT32 pde_index = PDE_INDEX(virtual_address); UINT32 pte_index = PTE_INDEX(virtual_address); UINT32* page_table = (UINT32*)(PAGE_TABLE_PHYSICAL_ADDR + pde_index*PAGE_SIZE); page_table[pte_index] = physical_address | protect; physical_address += PAGE_SIZE; virtual_address += PAGE_SIZE; } }
static void pde_map(pmap_t *pmap, vaddr_t vaddr) { uint32_t pde_index = PDE_INDEX(vaddr); if (!(pmap->pde[pde_index] & V_MASK)) { /* part of page table isn't located in memory */ vm_page_t *pg = pm_alloc(1); TAILQ_INSERT_TAIL(&pmap->pte_pages, pg, pt.list); ENTRYLO_SET_PADDR(pmap->pde[pde_index], pg->paddr); ENTRYLO_SET_V(pmap->pde[pde_index], 1); ENTRYLO_SET_D(pmap->pde[pde_index], 1); } /* make sure proper address is in tlb */ pde_index &= ~1; tlbhi_t entryhi = (PTE_BASE + pde_index * PAGESIZE) | pmap->asid; tlblo_t entrylo0 = pmap->pde[pde_index]; tlblo_t entrylo1 = pmap->pde[pde_index + 1]; tlb_overwrite_random(entryhi, entrylo0, entrylo1); }