From 72504f35988d8ff942f93005f46e878d3e690c9d Mon Sep 17 00:00:00 2001 From: Matheus Date: Mon, 24 Oct 2022 15:37:18 -0300 Subject: [PATCH] vmm: vmm_tophyical() --- src/include/kernel/vmm.h | 6 +++--- src/sys/mm/vmm.c | 21 ++++++++++++++++++++- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/include/kernel/vmm.h b/src/include/kernel/vmm.h index b9f7acb4..8688f083 100644 --- a/src/include/kernel/vmm.h +++ b/src/include/kernel/vmm.h @@ -54,9 +54,9 @@ typedef struct { int lock; } vmm_context; -void vmm_init(); - -void vmm_destroy(vmm_context* ctx); +void vmm_init(); +void vmm_destroy(vmm_context* ctx); +void* vmm_tophysical(void* addr); bool vmm_dealwithrequest(void* addr, long error, bool user); bool vmm_setused(void* addr, size_t pagec, size_t mmuflags); bool vmm_unmap(void* addr, size_t pagec); diff --git a/src/sys/mm/vmm.c b/src/sys/mm/vmm.c index 79536f39..332d34b9 100644 --- a/src/sys/mm/vmm.c +++ b/src/sys/mm/vmm.c @@ -701,7 +701,7 @@ bool vmm_dealwithrequest(void* addr, long error, bool user){ if(map->type == VMM_TYPE_FILE){ // TODO check for errors? int err; size_t offset = addr - map->start; - vfs_read(&err, map->data, addr, PAGE_SIZE, map->offset + offset); + vfs_read(&err, map->data, addr, PAGE_SIZE, map->offset + offset, NULL); } status = true; @@ -714,6 +714,25 @@ bool vmm_dealwithrequest(void* addr, long error, bool user){ } +void* vmm_tophysical(void* addr){ + + int* lock; + vmm_mapping** start = NULL; + + getcontextinfo(addr, &lock, &start); + + spinlock_acquire(lock); + + int pageoffset = (uintptr_t)addr % PAGE_SIZE; + void* virtpage = addr - pageoffset; + void* phypage = arch_mmu_getphysicaladdr(arch_getcls()->context->context, virtpage); + + spinlock_release(lock); + + return phypage + pageoffset; + +} + void vmm_switchcontext(vmm_context* context){ if(arch_getcls()->thread) arch_getcls()->thread->ctx = context;