From bf0b4d412c5dbfb7adad1fe8c0c4c343e4533962 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Tue, 7 Feb 2023 15:40:06 +0000 Subject: [PATCH] vm: use direct page mapping to convert virt/phys addresses --- vm/page.c | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/vm/page.c b/vm/page.c index 45c5ccb..ab763c4 100644 --- a/vm/page.c +++ b/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)