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)
|
size_t virt_to_phys(size_t viraddr)
|
||||||
{
|
{
|
||||||
task_t* task = per_core(current_task);
|
task_t* task = per_core(current_task);
|
||||||
page_map_t* pdpt, * pgd , * pgt;
|
size_t phyaddr;
|
||||||
uint16_t index_pml4 = (viraddr >> 39) & 0x1FF;
|
size_t* pte;
|
||||||
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;
|
|
||||||
|
|
||||||
spinlock_irqsave_lock(&task->page_lock);
|
spinlock_irqsave_lock(&task->page_lock);
|
||||||
|
|
||||||
// TODO: Currently, we allocate pages only in kernel space.
|
pte = (size_t *) (PAGE_PGT | (viraddr >> 9));
|
||||||
// => physical address of the page table is identical of the virtual address
|
phyaddr = (*pte & PAGE_MASK) | (viraddr & ~PAGE_MASK);
|
||||||
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);
|
|
||||||
|
|
||||||
spinlock_irqsave_unlock(&task->page_lock);
|
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)
|
size_t map_region(size_t viraddr, size_t phyaddr, uint32_t npages, uint32_t flags)
|
||||||
|
|
Loading…
Add table
Reference in a new issue