From c47da5864c01a8de462b729d4c59c72f3a877dc0 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Thu, 2 Feb 2023 21:06:04 +0000 Subject: [PATCH] sandbox: vm: add temporary vm_virt_to_phys() implementation --- sandbox/base/memory_test.c | 6 ++++-- sandbox/vm/include/socks/vm.h | 2 ++ sandbox/vm/page.c | 12 +++++++++++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/sandbox/base/memory_test.c b/sandbox/base/memory_test.c index 607fdfd..6b528ef 100644 --- a/sandbox/base/memory_test.c +++ b/sandbox/base/memory_test.c @@ -41,7 +41,7 @@ static struct mem_map_region mem_map[] = { { .base = 0x00800000, .limit = MB_TO_BYTES(MEMORY_SIZE_MB) - 1, .status = REGION_FREE }, }; -extern void tmp_set_vaddr_base(void *); +extern void tmp_set_vaddr_base(void *, size_t); /* virtual address of where system memory is mapped */ static void *system_memory = NULL; @@ -110,7 +110,9 @@ int memory_test(void) } } - tmp_set_vaddr_base(system_memory); + printf("virtual memory range: 0x%" PRIxPTR "-0x%" PRIxPTR "\n", (uintptr_t)system_memory, (uintptr_t)system_memory + MB_TO_BYTES(MEMORY_SIZE_MB)); + + tmp_set_vaddr_base(system_memory, MB_TO_BYTES(MEMORY_SIZE_MB)); memblock_add(pmem_base, pmem_limit + 1); for (size_t i = 0; i < nr_mem_map_entries; i++) { diff --git a/sandbox/vm/include/socks/vm.h b/sandbox/vm/include/socks/vm.h index fa114ae..05628ac 100644 --- a/sandbox/vm/include/socks/vm.h +++ b/sandbox/vm/include/socks/vm.h @@ -199,6 +199,8 @@ extern kern_status_t vm_bootstrap(const vm_zone_descriptor_t *zones, size_t nr_z extern vm_pg_data_t *vm_pg_data_get(vm_node_id_t node); +extern phys_addr_t vm_virt_to_phys(void *p); + extern void vm_page_init_array(); extern vm_page_t *vm_page_get(phys_addr_t addr); extern phys_addr_t vm_page_get_paddr(vm_page_t *pg); diff --git a/sandbox/vm/page.c b/sandbox/vm/page.c index 8caf2e8..d9ddb9b 100644 --- a/sandbox/vm/page.c +++ b/sandbox/vm/page.c @@ -2,6 +2,7 @@ #include #include #include +#include #include /* array of pages, one for each physical page frame present in RAM */ @@ -41,9 +42,18 @@ static size_t page_order_bytes[] = { /* temporary */ static void *tmp_vaddr_base = NULL; -void tmp_set_vaddr_base(void *p) +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) +{ + phys_addr_t x = (phys_addr_t)p - (phys_addr_t)tmp_vaddr_base; + assert(x < tmp_vaddr_len); + return x; } void vm_page_init_array()