implemented virt_to_phys()

This commit is contained in:
Steffen Vogel 2013-11-14 12:23:42 +01:00
parent 9441d21d89
commit 4b485f5733

View file

@ -105,46 +105,17 @@ int drop_page_map(void)
size_t virt_to_phys(size_t viraddr)
{
task_t* task = per_core(current_task);
page_map_t* pdpt, * pgd , * pgt;
uint16_t index_pml4 = (viraddr >> 39) & 0x1FF;
uint16_t index_pdpt = (viraddr >> 30) & 0x1FF;
uint16_t index_pgd = (viraddr >> 21) & 0x1FF;
uint16_t index_pgt = (viraddr >> 12) & 0x1FF;
size_t ret = 0;
if (!paging_enabled)
return viraddr;
if (BUILTIN_EXPECT(!task || !task->page_map, 0))
return 0;
size_t phyaddr;
size_t* pte;
spinlock_irqsave_lock(&task->page_lock);
// TODO: Currently, we allocate pages only in kernel space.
// => physical address of the page table is identical of the virtual address
pdpt = (page_map_t*) (task->page_map->entries[index_pml4] & PAGE_MASK);
if (!pdpt)
goto out;
pgd = (page_map_t*) (pdpt->entries[index_pdpt] & PAGE_MASK);
if (!pgd)
goto out;
pgt = (page_map_t*) (pgd->entries[index_pgd] & PAGE_MASK);
if (!pgt)
goto out;
ret = (size_t) (pgt->entries[index_pgt] & PAGE_MASK);
if (!ret)
goto out;
ret = ret | (viraddr & 0xFFF); // add page offset
out:
//kprintf("vir %p to phy %p\n", viraddr, ret);
pte = (size_t *) (PAGE_PGT | (viraddr >> 9));
phyaddr = (*pte & PAGE_MASK) | (viraddr & ~PAGE_MASK);
spinlock_irqsave_unlock(&task->page_lock);
return ret;
return phyaddr;
}
size_t map_region(size_t viraddr, size_t phyaddr, uint32_t npages, uint32_t flags)