Exemple #1
0
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;
	}
}
Exemple #2
0
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);
}