vm: use direct page mapping to convert virt/phys addresses
This commit is contained in:
25
vm/page.c
25
vm/page.c
@@ -38,23 +38,20 @@ static size_t page_order_bytes[] = {
|
||||
#endif
|
||||
};
|
||||
|
||||
/* temporary */
|
||||
static void *tmp_vaddr_base = NULL;
|
||||
static size_t tmp_vaddr_len = 0;
|
||||
void tmp_set_vaddr_base(void *p, size_t len)
|
||||
{
|
||||
tmp_vaddr_base = p;
|
||||
tmp_vaddr_len = len;
|
||||
}
|
||||
|
||||
phys_addr_t vm_virt_to_phys(void *p)
|
||||
{
|
||||
if ((uintptr_t)p >= memblock.m_alloc_start && (uintptr_t)p < memblock.m_alloc_end) {
|
||||
uintptr_t pv = (uintptr_t)p;
|
||||
|
||||
if (pv >= memblock.m_alloc_start && pv < memblock.m_alloc_end) {
|
||||
return memblock_virt_to_phys(p);
|
||||
}
|
||||
|
||||
phys_addr_t x = (phys_addr_t)p - (phys_addr_t)tmp_vaddr_base;
|
||||
return x;
|
||||
if (pv >= VM_PAGEMAP_BASE && pv <= VM_PAGEMAP_LIMIT) {
|
||||
return pv - VM_PAGEMAP_BASE;
|
||||
}
|
||||
|
||||
/* TODO use pmap to find the physical address */
|
||||
return 0;
|
||||
}
|
||||
|
||||
void *vm_phys_to_virt(phys_addr_t p)
|
||||
@@ -63,7 +60,7 @@ void *vm_phys_to_virt(phys_addr_t p)
|
||||
return memblock_phys_to_virt(p);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
return (void *)(VM_PAGEMAP_BASE + p);
|
||||
}
|
||||
|
||||
void vm_page_init_array()
|
||||
@@ -113,7 +110,7 @@ phys_addr_t vm_page_get_paddr(vm_page_t *pg)
|
||||
|
||||
void *vm_page_get_vaddr(vm_page_t *pg)
|
||||
{
|
||||
return (void *)((char *)tmp_vaddr_base + (vm_page_get_pfn(pg) * VM_PAGE_SIZE));
|
||||
return (void *)(vm_phys_to_virt(vm_page_get_pfn(pg) * VM_PAGE_SIZE));
|
||||
}
|
||||
|
||||
size_t vm_page_get_pfn(vm_page_t *pg)
|
||||
|
||||
Reference in New Issue
Block a user