vm: use direct page mapping to convert virt/phys addresses

This commit is contained in:
2023-02-07 15:40:06 +00:00
parent ad63f0b251
commit bf0b4d412c

View File

@@ -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)