mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-01 15:08:21 +00:00
vmm: destroy context
This commit is contained in:
@@ -55,6 +55,7 @@ typedef struct {
|
|||||||
|
|
||||||
void vmm_init();
|
void vmm_init();
|
||||||
|
|
||||||
|
void vmm_destroy(vmm_context* ctx);
|
||||||
bool vmm_dealwithrequest(void* addr, long error, bool user);
|
bool vmm_dealwithrequest(void* addr, long error, bool user);
|
||||||
bool vmm_setused(void* addr, size_t pagec, size_t mmuflags);
|
bool vmm_setused(void* addr, size_t pagec, size_t mmuflags);
|
||||||
bool vmm_unmap(void* addr, size_t pagec);
|
bool vmm_unmap(void* addr, size_t pagec);
|
||||||
|
|||||||
@@ -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){
|
int vmm_fork(vmm_context* oldctx, vmm_context* newctx){
|
||||||
|
|
||||||
// TODO make this copy on write
|
// TODO make this copy on write
|
||||||
|
|||||||
@@ -28,7 +28,10 @@ syscallret syscall_fork(arch_regs* ctx){
|
|||||||
int err = vmm_fork(thread->ctx, newthread->ctx);
|
int err = vmm_fork(thread->ctx, newthread->ctx);
|
||||||
|
|
||||||
if(err){
|
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;
|
retv.errno = err;
|
||||||
return retv;
|
return retv;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -99,9 +99,10 @@ syscallret syscall_waitpid(pid_t pid, int *status, int options){
|
|||||||
|
|
||||||
thread_t* thread = child->threads;
|
thread_t* thread = child->threads;
|
||||||
|
|
||||||
// TODO free ctx
|
|
||||||
free(thread->regs);
|
free(thread->regs);
|
||||||
free(thread->kernelstackbase);
|
free(thread->kernelstackbase);
|
||||||
|
vmm_destroy(thread->ctx);
|
||||||
free(thread);
|
free(thread);
|
||||||
free(child);
|
free(child);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user