From 0e4c9e17bf352ed9b0988cf30992cb11f7615ce9 Mon Sep 17 00:00:00 2001 From: Matheus Date: Tue, 11 Oct 2022 23:31:54 -0300 Subject: [PATCH] vmm: destroy context --- src/include/kernel/vmm.h | 1 + src/sys/mm/vmm.c | 20 ++++++++++++++++++++ src/sys/syscalls/fork.c | 5 ++++- src/sys/syscalls/waitpid.c | 3 ++- 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/include/kernel/vmm.h b/src/include/kernel/vmm.h index 907e0f49..e9da8770 100644 --- a/src/include/kernel/vmm.h +++ b/src/include/kernel/vmm.h @@ -55,6 +55,7 @@ typedef struct { void vmm_init(); +void vmm_destroy(vmm_context* ctx); 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 6fea6a2c..3eecae0e 100644 --- a/src/sys/mm/vmm.c +++ b/src/sys/mm/vmm.c @@ -366,6 +366,26 @@ static void getcontextinfo(void* addr, int** lock, vmm_mapping*** start){ } +void vmm_destroy(vmm_context* ctx){ + spinlock_acquire(&ctx->lock); + + vmm_mapping* mapping = ctx->userstart; + + while(mapping){ + + vmm_mapping* old = mapping; + mapping = mapping->next; + + freeentry(old); + + } + + arch_mmu_destroy(ctx->context); + + free(ctx); + +} + int vmm_fork(vmm_context* oldctx, vmm_context* newctx){ // TODO make this copy on write diff --git a/src/sys/syscalls/fork.c b/src/sys/syscalls/fork.c index a670aabb..572fabfe 100644 --- a/src/sys/syscalls/fork.c +++ b/src/sys/syscalls/fork.c @@ -28,7 +28,10 @@ syscallret syscall_fork(arch_regs* ctx){ int err = vmm_fork(thread->ctx, newthread->ctx); if(err){ - printf("fork: VMM_FORK FAILED BUT THREAD DEALLOCATION IS NOT SUPPORTED YET!\n"); + vmm_destroy(newthread->ctx); + free(newthread->regs); + free(newthread->kernelstackbase); + free(newthread); retv.errno = err; return retv; } diff --git a/src/sys/syscalls/waitpid.c b/src/sys/syscalls/waitpid.c index d98d2f59..3d7796f8 100644 --- a/src/sys/syscalls/waitpid.c +++ b/src/sys/syscalls/waitpid.c @@ -99,9 +99,10 @@ syscallret syscall_waitpid(pid_t pid, int *status, int options){ thread_t* thread = child->threads; - // TODO free ctx + free(thread->regs); free(thread->kernelstackbase); + vmm_destroy(thread->ctx); free(thread); free(child);