From f2b76caa84a9d660c10d74d1f1f9cd01717f00c2 Mon Sep 17 00:00:00 2001 From: Matheus Date: Sat, 10 Jun 2023 12:07:52 -0300 Subject: [PATCH] vmm: change how vmm_destroycontext is handled --- kernel-src/include/kernel/vmm.h | 2 +- kernel-src/mm/vmm.c | 16 ++++++---------- kernel-src/sys/scheduler.c | 15 +++++++++++---- kernel-src/sys/syscalls/execve.c | 5 ++--- 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/kernel-src/include/kernel/vmm.h b/kernel-src/include/kernel/vmm.h index b9861c5e..6b932742 100644 --- a/kernel-src/include/kernel/vmm.h +++ b/kernel-src/include/kernel/vmm.h @@ -94,7 +94,7 @@ static inline int mmuflagstovnodeflags(mmuflags_t mmuflags) { return flags; } -void vmm_destroycontext(vmmcontext_t *context, int destroyrangeflags); +void vmm_destroycontext(vmmcontext_t *context); 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 1b6e8bbc..78903faf 100644 --- a/kernel-src/mm/vmm.c +++ b/kernel-src/mm/vmm.c @@ -471,15 +471,11 @@ vmmcontext_t *vmm_newcontext() { return ctx; } -void vmm_destroycontext(vmmcontext_t *context, int destroyrangeflags) { - vmmrange_t *range = context->space.ranges; - while (range) { - destroyrange(context, range, 0, range->size, destroyrangeflags); - vmmrange_t *next = range->next; - freerange(range); - range = next; - } - +void vmm_destroycontext(vmmcontext_t *context) { + vmmcontext_t *oldctx = _cpu()->thread->vmmctx; + vmm_switchcontext(context); + vmm_unmap(context->space.start, context->space.end - context->space.start, 0); + vmm_switchcontext(oldctx); arch_mmu_destroytable(context->pagetable); slab_free(ctxcache, context); } @@ -531,7 +527,7 @@ vmmcontext_t *vmm_fork(vmmcontext_t *oldcontext) { return newcontext; error: spinlock_release(&oldcontext->space.lock); - vmm_destroycontext(newcontext, VMM_DESTROY_FLAGS_NOSYNC); + vmm_destroycontext(newcontext); return NULL; } diff --git a/kernel-src/sys/scheduler.c b/kernel-src/sys/scheduler.c index 52d886d4..330620c5 100644 --- a/kernel-src/sys/scheduler.c +++ b/kernel-src/sys/scheduler.c @@ -97,8 +97,9 @@ void sched_destroythread(thread_t *thread) { } void sched_destroyproc(proc_t *proc) { - free(proc->threads); - slab_free(processcache, proc); + //free(proc->threads); + //free(proc->fd); + //slab_free(processcache, proc); } static thread_t *runqueuenext(int minprio) { @@ -197,8 +198,14 @@ __attribute__((noreturn)) void sched_threadexit() { thread_t *thread = _cpu()->thread; proc_t *proc = thread->proc; - if (proc) - __atomic_fetch_sub(&currpid, 1, __ATOMIC_SEQ_CST); + vmmcontext_t *oldctx = thread->vmmctx; + vmm_switchcontext(&vmm_kernelctx); + + if (proc) { + __atomic_fetch_sub(&proc->runningthreadcount, 1, __ATOMIC_SEQ_CST); + if (proc->runningthreadcount == 0) + vmm_destroycontext(oldctx); + } _cpu()->thread = NULL; diff --git a/kernel-src/sys/syscalls/execve.c b/kernel-src/sys/syscalls/execve.c index 9224b632..09b3d4f2 100644 --- a/kernel-src/sys/syscalls/execve.c +++ b/kernel-src/sys/syscalls/execve.c @@ -123,7 +123,7 @@ syscallret_t syscall_execve(context_t *context, char *upath, char *uargv[], char if (vmmctx && ret.errno) { vmm_switchcontext(oldctx); - vmm_destroycontext(vmmctx, 0); + vmm_destroycontext(vmmctx); } if (refnode) @@ -136,8 +136,7 @@ syscallret_t syscall_execve(context_t *context, char *upath, char *uargv[], char free(interp); if (ret.errno == 0) { - // TODO sync mmap files (unmap all lower memory first before destroying context?) - vmm_destroycontext(oldctx, 0); + vmm_destroycontext(oldctx); CTX_SP(context) = (uint64_t)stack; CTX_IP(context) = (uint64_t)entry; }