From d3107640858a93a639129eed634da722514deb96 Mon Sep 17 00:00:00 2001 From: Matheus Date: Sat, 10 Aug 2024 22:41:29 -0300 Subject: [PATCH] vmm: VMM_FLAGS_REPLACE --- kernel-src/mm/vmm.c | 25 ++++++++++++++++++------- kernel-src/sys/syscalls/mmap.c | 3 +-- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/kernel-src/mm/vmm.c b/kernel-src/mm/vmm.c index 7acf7dc1..cd96d8d0 100644 --- a/kernel-src/mm/vmm.c +++ b/kernel-src/mm/vmm.c @@ -482,10 +482,22 @@ void *vmm_map(void *addr, volatile size_t size, int flags, mmuflags_t mmuflags, if (range == NULL) goto cleanup; - range->start = start; - range->size = size; - range->flags = VMM_PERMANENT_FLAGS_MASK & flags; - range->mmuflags = mmuflags; + if (flags & VMM_FLAGS_REPLACE) { + __assert(addr); + retaddr = addr; + range->start = addr; + range->size = size; + range->flags = VMM_PERMANENT_FLAGS_MASK & flags; + range->mmuflags = mmuflags; + __assert((flags & (VMM_FLAGS_ALLOCATE | VMM_FLAGS_PHYSICAL)) == 0); + unmap(space, addr, size); + } else { + retaddr = start; + range->start = start; + range->size = size; + range->flags = VMM_PERMANENT_FLAGS_MASK & flags; + range->mmuflags = mmuflags; + } if (flags & VMM_FLAGS_FILE) { // XXX make sure that writes can't happen to executable memory mapped files and check file permissions @@ -503,6 +515,7 @@ void *vmm_map(void *addr, volatile size_t size, int flags, mmuflags_t mmuflags, for (uintmax_t j = 0; j < size; j += PAGE_SIZE) arch_mmu_unmap(_cpu()->vmmctx->pagetable, (void *)((uintptr_t)start + j)); + retaddr = NULL; goto cleanup; } } @@ -526,6 +539,7 @@ void *vmm_map(void *addr, volatile size_t size, int flags, mmuflags_t mmuflags, } } + retaddr = NULL; goto cleanup; } memset(MAKE_HHDM(allocated), 0, PAGE_SIZE); @@ -533,9 +547,6 @@ void *vmm_map(void *addr, volatile size_t size, int flags, mmuflags_t mmuflags, } insertrange(space, range); - - retaddr = start; - cleanup: if (start == NULL && range) freerange(range); diff --git a/kernel-src/sys/syscalls/mmap.c b/kernel-src/sys/syscalls/mmap.c index 4cfbb1c4..d0b0fd02 100644 --- a/kernel-src/sys/syscalls/mmap.c +++ b/kernel-src/sys/syscalls/mmap.c @@ -44,9 +44,8 @@ syscallret_t syscall_mmap(context_t *context, void *hint, size_t len, int prot, bool isfile = (flags & MAP_ANONYMOUS) == 0; int vmmflags = 0; - // XXX this isn't the correct behaviour for MAP_FIXED if (flags & MAP_FIXED) - vmmflags |= VMM_FLAGS_EXACT; + vmmflags |= VMM_FLAGS_REPLACE; if ((flags & MAP_ANONYMOUS) == 0) vmmflags |= VMM_FLAGS_FILE;