implemented virt_to_phys()
This commit is contained in:
parent
9441d21d89
commit
4b485f5733
1 changed files with 5 additions and 34 deletions
|
@ -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)
|
||||
|
|
Loading…
Add table
Reference in a new issue