vmm: destroy context

This commit is contained in:
Matheus
2022-10-11 23:31:54 -03:00
parent 144ad8cacf
commit 0e4c9e17bf
4 changed files with 27 additions and 2 deletions
+1
View File
@@ -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);
+20
View File
@@ -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
+4 -1
View File
@@ -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;
}
+2 -1
View File
@@ -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);