From 85dc9cffdf5dcd2769d7257750c02d33927ba950 Mon Sep 17 00:00:00 2001 From: Matheus Date: Mon, 29 May 2023 07:50:59 -0300 Subject: [PATCH] vmm: rename DESTROY_FLAGS_NOSYNC and force hhdm mappings to use VMM_FLAGS_EXACT --- kernel-src/include/kernel/vmm.h | 3 +++ kernel-src/mm/vmm.c | 15 +++++++-------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/kernel-src/include/kernel/vmm.h b/kernel-src/include/kernel/vmm.h index eef9a72c..b9861c5e 100644 --- a/kernel-src/include/kernel/vmm.h +++ b/kernel-src/include/kernel/vmm.h @@ -19,6 +19,8 @@ #define VMM_ACTION_WRITE 2 #define VMM_ACTION_EXEC 4 +#define VMM_DESTROY_FLAGS_NOSYNC 1 + typedef struct { vnode_t *node; uintmax_t offset; @@ -92,6 +94,7 @@ static inline int mmuflagstovnodeflags(mmuflags_t mmuflags) { return flags; } +void vmm_destroycontext(vmmcontext_t *context, int destroyrangeflags); vmmcontext_t *vmm_fork(vmmcontext_t *oldcontext); void *vmm_map(void *addr, size_t size, int flags, mmuflags_t mmuflags, void *private); void vmm_unmap(void *addr, size_t size, int flags); diff --git a/kernel-src/mm/vmm.c b/kernel-src/mm/vmm.c index 93dc6a2d..ca8b1c61 100644 --- a/kernel-src/mm/vmm.c +++ b/kernel-src/mm/vmm.c @@ -195,8 +195,6 @@ static void insertrange(vmmspace_t *space, vmmrange_t *newrange) { } } -#define DESTROY_FLAGS_NOSYNC 1 - static void destroyrange(vmmcontext_t *context, vmmrange_t *range, uintmax_t _offset, size_t size, int flags) { uintmax_t top = _offset + size; __assert(!(range->flags & VMM_FLAGS_COPY)); // TODO unimplemented @@ -207,7 +205,7 @@ static void destroyrange(vmmcontext_t *context, vmmrange_t *range, uintmax_t _of if (physical == NULL) continue; - if ((range->flags & VMM_FLAGS_FILE) && (range->flags & VMM_FLAGS_SHARED) && (flags & DESTROY_FLAGS_NOSYNC) == 0) { + if ((range->flags & VMM_FLAGS_FILE) && (range->flags & VMM_FLAGS_SHARED) && (flags & VMM_DESTROY_FLAGS_NOSYNC) == 0) { VOP_LOCK(range->vnode); __assert(VOP_MUNMAP(range->vnode, vaddr, range->offset + offset, mmuflagstovnodeflags(range->mmuflags), NULL) == 0); // XXX pass cred struct VOP_UNLOCK(range->vnode); @@ -532,7 +530,7 @@ vmmcontext_t *vmm_fork(vmmcontext_t *oldcontext) { return newcontext; error: spinlock_release(&oldcontext->space.lock); - vmm_destroycontext(newcontext, DESTROY_FLAGS_NOSYNC); + vmm_destroycontext(newcontext, VMM_DESTROY_FLAGS_NOSYNC); return NULL; } @@ -575,12 +573,13 @@ void vmm_init() { for (uint64_t i = 0; i < pmm_liminemap.response->entry_count; ++i) { struct limine_memmap_entry *e = pmm_liminemap.response->entries[i]; - __assert(vmm_map(MAKE_HHDM(e->base), e->length, 0, ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_WRITE | ARCH_MMU_FLAGS_NOEXEC, NULL)); + mmuflags_t mmuflags = ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_WRITE | ARCH_MMU_FLAGS_NOEXEC; + __assert(vmm_map(MAKE_HHDM(e->base), e->length, VMM_FLAGS_EXACT, mmuflags, NULL)); } - __assert(vmm_map(&_text_start, (uintptr_t)&_text_end - (uintptr_t)&_text_start, 0, ARCH_MMU_FLAGS_READ, NULL)); - __assert(vmm_map(&_rodata_start, (uintptr_t)&_rodata_end - (uintptr_t)&_rodata_start, 0, ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_NOEXEC, NULL)); - __assert(vmm_map(&_data_start, (uintptr_t)&_data_end - (uintptr_t)&_data_start, 0, ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_WRITE | ARCH_MMU_FLAGS_NOEXEC, NULL)); + __assert(vmm_map(&_text_start, (uintptr_t)&_text_end - (uintptr_t)&_text_start, VMM_FLAGS_EXACT, ARCH_MMU_FLAGS_READ, NULL)); + __assert(vmm_map(&_rodata_start, (uintptr_t)&_rodata_end - (uintptr_t)&_rodata_start, VMM_FLAGS_EXACT, ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_NOEXEC, NULL)); + __assert(vmm_map(&_data_start, (uintptr_t)&_data_end - (uintptr_t)&_data_start, VMM_FLAGS_EXACT, ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_WRITE | ARCH_MMU_FLAGS_NOEXEC, NULL)); // null page vmm_map(MAKE_HHDM(NULL), PAGE_SIZE, VMM_FLAGS_EXACT, ARCH_MMU_FLAGS_NOEXEC, NULL);