mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-27 12:48:22 +00:00
mm: rename vmm api to mm
This commit is contained in:
+10
-10
@@ -3,7 +3,7 @@
|
||||
#include <errno.h>
|
||||
#include <kernel/alloc.h>
|
||||
#include <util.h>
|
||||
#include <kernel/vmm.h>
|
||||
#include <kernel/mm.h>
|
||||
#include <kernel/usercopy.h>
|
||||
#include <arch/cpu.h>
|
||||
|
||||
@@ -67,7 +67,7 @@ static int load(vnode_t *vnode, elfph64_t *ph) {
|
||||
size_t firstpagecount = PAGE_SIZE - firstpageoffset;
|
||||
firstpagecount = fsize > firstpagecount ? firstpagecount : fsize;
|
||||
void *page = (void *)ROUND_DOWN(mempos, PAGE_SIZE);
|
||||
if (vmm_map(page, PAGE_SIZE, VMM_FLAGS_EXACT | VMM_FLAGS_ALLOCATE, ARCH_MMU_FLAGS_USER | ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_WRITE, NULL) == NULL)
|
||||
if (mm_map(page, PAGE_SIZE, MM_RANGE_FLAGS_EXACT | MM_RANGE_FLAGS_ALLOCATE, ARCH_MMU_FLAGS_USER | ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_WRITE, NULL) == NULL)
|
||||
return ENOMEM;
|
||||
|
||||
error = readexact(vnode, (void *)mempos, firstpagecount, foffset);
|
||||
@@ -98,7 +98,7 @@ static int load(vnode_t *vnode, elfph64_t *ph) {
|
||||
mempos += remainingmsize;
|
||||
}
|
||||
|
||||
error = vmm_changemmuflags(page, PAGE_SIZE, mmuflags, 0);
|
||||
error = mm_change_mmu_flags(page, PAGE_SIZE, mmuflags, 0);
|
||||
if (error)
|
||||
return error;
|
||||
}
|
||||
@@ -106,11 +106,11 @@ static int load(vnode_t *vnode, elfph64_t *ph) {
|
||||
// map middle of file
|
||||
size_t filepagecount = fsize / PAGE_SIZE;
|
||||
if (filepagecount) {
|
||||
vmmfiledesc_t vfd = {
|
||||
mm_map_file_desc_t vfd = {
|
||||
.node = vnode,
|
||||
.offset = foffset
|
||||
};
|
||||
if (vmm_map((void *)mempos, filepagecount, VMM_FLAGS_EXACT | VMM_FLAGS_PAGESIZE | VMM_FLAGS_FILE, mmuflags, &vfd) == NULL)
|
||||
if (mm_map((void *)mempos, filepagecount, MM_RANGE_FLAGS_EXACT | MM_RANGE_FLAGS_PAGESIZE | MM_RANGE_FLAGS_FILE, mmuflags, &vfd) == NULL)
|
||||
return ENOMEM;
|
||||
size_t bytesize = filepagecount * PAGE_SIZE;
|
||||
mempos += bytesize;
|
||||
@@ -122,7 +122,7 @@ static int load(vnode_t *vnode, elfph64_t *ph) {
|
||||
// map end of file
|
||||
size_t lastpagecount = fsize % PAGE_SIZE;
|
||||
if (lastpagecount) {
|
||||
if (vmm_map((void *)mempos, PAGE_SIZE, VMM_FLAGS_EXACT | VMM_FLAGS_ALLOCATE, ARCH_MMU_FLAGS_USER | ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_WRITE, NULL) == NULL)
|
||||
if (mm_map((void *)mempos, PAGE_SIZE, MM_RANGE_FLAGS_EXACT | MM_RANGE_FLAGS_ALLOCATE, ARCH_MMU_FLAGS_USER | ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_WRITE, NULL) == NULL)
|
||||
return ENOMEM;
|
||||
|
||||
error = readexact(vnode, (void *)mempos, lastpagecount, foffset);
|
||||
@@ -135,7 +135,7 @@ static int load(vnode_t *vnode, elfph64_t *ph) {
|
||||
|
||||
msize -= msize > PAGE_SIZE ? PAGE_SIZE : msize;
|
||||
|
||||
error = vmm_changemmuflags((void *)mempos, PAGE_SIZE, mmuflags, 0);
|
||||
error = mm_change_mmu_flags((void *)mempos, PAGE_SIZE, mmuflags, 0);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
@@ -144,7 +144,7 @@ static int load(vnode_t *vnode, elfph64_t *ph) {
|
||||
|
||||
// zero some parts if needed
|
||||
if (msize) {
|
||||
if (vmm_map((void *)mempos, msize, VMM_FLAGS_EXACT, mmuflags, NULL) == NULL)
|
||||
if (mm_map((void *)mempos, msize, MM_RANGE_FLAGS_EXACT, mmuflags, NULL) == NULL)
|
||||
return ENOMEM;
|
||||
}
|
||||
|
||||
@@ -255,12 +255,12 @@ void *elf_preparestack(void *top, auxv64list_t *auxv64, char **argv, char **envp
|
||||
|
||||
size_t initialsizeround = ROUND_UP(initialsize, PAGE_SIZE);
|
||||
void *initialpagebase = (void *)((uintptr_t)top - initialsizeround);
|
||||
if (vmm_map(initialpagebase, initialsizeround, VMM_FLAGS_ALLOCATE | VMM_FLAGS_EXACT, STACK_MMUFLAGS, NULL) == NULL)
|
||||
if (mm_map(initialpagebase, initialsizeround, MM_RANGE_FLAGS_ALLOCATE | MM_RANGE_FLAGS_EXACT, STACK_MMUFLAGS, NULL) == NULL)
|
||||
return NULL;
|
||||
|
||||
void *stackbase = (void *)((uintptr_t)top - STACK_SIZE);
|
||||
size_t unallocatedsize = STACK_SIZE - initialsizeround;
|
||||
if (vmm_map(stackbase, unallocatedsize, VMM_FLAGS_EXACT, STACK_MMUFLAGS, NULL) == NULL)
|
||||
if (mm_map(stackbase, unallocatedsize, MM_RANGE_FLAGS_EXACT, STACK_MMUFLAGS, NULL) == NULL)
|
||||
return NULL;
|
||||
|
||||
top = (void *)((uintptr_t)top - STACK_TOP_BUFFER);
|
||||
|
||||
@@ -367,11 +367,11 @@ void proc_run_init() {
|
||||
|
||||
printf("proc: loading %s\n", init_path);
|
||||
|
||||
vmmcontext_t *vmmctx = vmm_newcontext();
|
||||
__assert(vmmctx);
|
||||
mm_context_t *mmctx = mm_create_context();
|
||||
__assert(mmctx);
|
||||
|
||||
// leave kernel context to load elf
|
||||
vmm_switchcontext(vmmctx);
|
||||
mm_switch_context(mmctx);
|
||||
|
||||
proc_t *proc = proc_create();
|
||||
__assert(proc);
|
||||
@@ -440,7 +440,7 @@ void proc_run_init() {
|
||||
__assert(stack);
|
||||
|
||||
// reenter kernel context
|
||||
vmm_switchcontext(&vmm_kernelctx);
|
||||
mm_switch_context(&mm_kernel_ctx);
|
||||
|
||||
thread_t *uthread = sched_newthread(entry, PAGE_SIZE * 16, 1, proc, stack);
|
||||
__assert(uthread);
|
||||
@@ -448,7 +448,7 @@ void proc_run_init() {
|
||||
proc->threadlist = uthread;
|
||||
uthread->procnext = NULL;
|
||||
|
||||
uthread->vmmctx = vmmctx;
|
||||
uthread->mmctx = mmctx;
|
||||
sched_queue(uthread);
|
||||
|
||||
VOP_RELEASE(initnode);
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#include <logging.h>
|
||||
#include <arch/cpu.h>
|
||||
#include <spinlock.h>
|
||||
#include <kernel/vmm.h>
|
||||
#include <kernel/mm.h>
|
||||
#include <kernel/alloc.h>
|
||||
#include <errno.h>
|
||||
#include <kernel/elf.h>
|
||||
@@ -25,8 +25,8 @@ static __attribute__((noreturn)) void switch_thread(thread_t *thread) {
|
||||
|
||||
current_cpu()->thread = thread;
|
||||
|
||||
if(current == NULL || thread->vmmctx != current->vmmctx)
|
||||
vmm_switchcontext(thread->vmmctx);
|
||||
if(current == NULL || thread->mmctx != current->mmctx)
|
||||
mm_switch_context(thread->mmctx);
|
||||
|
||||
current_cpu()->intstatus = ARCH_CONTEXT_INTSTATUS(&thread->context);
|
||||
thread->cpu = current_cpu();
|
||||
@@ -350,7 +350,7 @@ void sched_ap_entry() {
|
||||
dpc_prepare(¤t_cpu()->reschedule_dpc, sched_reschedule_dpc);
|
||||
set_up_bitmaps();
|
||||
|
||||
current_cpu()->schedulerstack = vmm_map(NULL, SCHEDULER_STACK_SIZE, VMM_FLAGS_ALLOCATE, ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_WRITE | ARCH_MMU_FLAGS_NOEXEC, NULL);
|
||||
current_cpu()->schedulerstack = mm_map(NULL, SCHEDULER_STACK_SIZE, MM_RANGE_FLAGS_ALLOCATE, ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_WRITE | ARCH_MMU_FLAGS_NOEXEC, NULL);
|
||||
__assert(current_cpu()->schedulerstack);
|
||||
current_cpu()->schedulerstack = (void *)((uintptr_t)current_cpu()->schedulerstack + SCHEDULER_STACK_SIZE);
|
||||
|
||||
@@ -381,7 +381,7 @@ void sched_init() {
|
||||
|
||||
__assert(bitmap_init(&sched_idle_cpu_bitmap, arch_smp_get_cpu_count()) == 0);
|
||||
|
||||
current_cpu()->schedulerstack = vmm_map(NULL, SCHEDULER_STACK_SIZE, VMM_FLAGS_ALLOCATE, ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_WRITE | ARCH_MMU_FLAGS_NOEXEC, NULL);
|
||||
current_cpu()->schedulerstack = mm_map(NULL, SCHEDULER_STACK_SIZE, MM_RANGE_FLAGS_ALLOCATE, ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_WRITE | ARCH_MMU_FLAGS_NOEXEC, NULL);
|
||||
__assert(current_cpu()->schedulerstack);
|
||||
current_cpu()->schedulerstack = (void *)((uintptr_t)current_cpu()->schedulerstack + SCHEDULER_STACK_SIZE);
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#include <kernel/abi.h>
|
||||
#include <time.h>
|
||||
#include <kernel/timekeeper.h>
|
||||
#include <kernel/vmm.h>
|
||||
#include <kernel/mm.h>
|
||||
|
||||
syscallret_t syscall_clockget(context_t *, int clockid, timespec_t *tp) {
|
||||
syscallret_t ret = {
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#include <kernel/alloc.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <kernel/vmm.h>
|
||||
#include <kernel/mm.h>
|
||||
#include <arch/cpu.h>
|
||||
#include <kernel/elf.h>
|
||||
#include <kernel/scheduler.h>
|
||||
@@ -67,8 +67,8 @@ static syscallret_t execve(context_t *context, char *upath, char *uargv[], char
|
||||
size_t envsize = 0;
|
||||
char **argv = NULL;
|
||||
char **envp = NULL;
|
||||
vmmcontext_t *vmmctx = NULL;
|
||||
vmmcontext_t *oldctx = current_vmm_context();
|
||||
mm_context_t *mmctx = NULL;
|
||||
mm_context_t *oldctx = current_mm_context();
|
||||
vnode_t *node = NULL;
|
||||
vnode_t *refnode = NULL;
|
||||
char *interp = NULL;
|
||||
@@ -237,13 +237,13 @@ static syscallret_t execve(context_t *context, char *upath, char *uargv[], char
|
||||
}
|
||||
}
|
||||
|
||||
vmmctx = vmm_newcontext();
|
||||
if (vmmctx == NULL) {
|
||||
mmctx = mm_create_context();
|
||||
if (mmctx == NULL) {
|
||||
ret.errno = ENOMEM;
|
||||
goto error;
|
||||
}
|
||||
|
||||
vmm_switchcontext(vmmctx);
|
||||
mm_switch_context(mmctx);
|
||||
|
||||
auxv64list_t auxv64;
|
||||
void *entry;
|
||||
@@ -321,7 +321,7 @@ static syscallret_t execve(context_t *context, char *upath, char *uargv[], char
|
||||
proc->signals.actions[i].address = SIG_IGN;
|
||||
}
|
||||
|
||||
vmm_destroycontext(oldctx);
|
||||
mm_destroy_context(oldctx);
|
||||
CTX_SP(context) = (uint64_t)stack;
|
||||
CTX_IP(context) = (uint64_t)entry;
|
||||
|
||||
@@ -339,9 +339,9 @@ static syscallret_t execve(context_t *context, char *upath, char *uargv[], char
|
||||
if (envp)
|
||||
freevec(envp);
|
||||
|
||||
if (vmmctx && ret.errno) {
|
||||
vmm_switchcontext(oldctx);
|
||||
vmm_destroycontext(vmmctx);
|
||||
if (mmctx && ret.errno) {
|
||||
mm_switch_context(oldctx);
|
||||
mm_destroy_context(mmctx);
|
||||
}
|
||||
|
||||
if (refnode)
|
||||
|
||||
@@ -27,9 +27,9 @@ syscallret_t syscall_fork(context_t *ctx) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
nthread->vmmctx = vmm_fork(current_thread()->vmmctx);
|
||||
nthread->mmctx = mm_fork_context(current_thread()->mmctx);
|
||||
|
||||
if (nthread->vmmctx == NULL) {
|
||||
if (nthread->mmctx == NULL) {
|
||||
ret.errno = ENOMEM;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include <kernel/syscalls.h>
|
||||
#include <kernel/slab.h>
|
||||
#include <kernel/vmm.h>
|
||||
#include <kernel/mm.h>
|
||||
#include <time.h>
|
||||
#include <hashtable.h>
|
||||
#include <kernel/poll.h>
|
||||
@@ -66,7 +66,7 @@ syscallret_t syscall_futex(context_t *, uint32_t *futexp, int op, uint32_t value
|
||||
if (unlikely(ret.errno))
|
||||
goto cleanup;
|
||||
|
||||
uint32_t *physical = vmm_getphysical(futexp, 0);
|
||||
uint32_t *physical = mm_get_physical_address(futexp, 0);
|
||||
futex_t *futex = getfutex(physical);
|
||||
|
||||
switch (op) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include <kernel/syscalls.h>
|
||||
#include <kernel/file.h>
|
||||
#include <kernel/vmm.h>
|
||||
#include <kernel/mm.h>
|
||||
#include <errno.h>
|
||||
#include <kernel/alloc.h>
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include <kernel/syscalls.h>
|
||||
#include <kernel/abi.h>
|
||||
#include <errno.h>
|
||||
#include <kernel/vmm.h>
|
||||
#include <kernel/mm.h>
|
||||
#include <logging.h>
|
||||
|
||||
#define PROT_READ 0x01
|
||||
@@ -59,21 +59,21 @@ syscallret_t syscall_mmap(context_t *context, void *hint, size_t len, int prot,
|
||||
mmuflags |= ARCH_MMU_FLAGS_NOEXEC;
|
||||
|
||||
bool isfile = (flags & MAP_ANONYMOUS) == 0;
|
||||
int vmmflags = 0;
|
||||
int mm_flags = 0;
|
||||
|
||||
if (flags & MAP_FIXED)
|
||||
vmmflags |= VMM_FLAGS_REPLACE;
|
||||
mm_flags |= MM_RANGE_FLAGS_REPLACE;
|
||||
|
||||
if (flags & MAP_FIXED_NOREPLACE)
|
||||
vmmflags |= VMM_FLAGS_EXACT;
|
||||
mm_flags |= MM_RANGE_FLAGS_EXACT;
|
||||
|
||||
if ((flags & MAP_ANONYMOUS) == 0)
|
||||
vmmflags |= VMM_FLAGS_FILE;
|
||||
mm_flags |= MM_RANGE_FLAGS_FILE;
|
||||
|
||||
if (flags & MAP_SHARED)
|
||||
vmmflags |= VMM_FLAGS_SHARED;
|
||||
mm_flags |= MM_RANGE_FLAGS_SHARED;
|
||||
|
||||
vmmfiledesc_t vfd;
|
||||
mm_map_file_desc_t vfd;
|
||||
file_t *file = NULL;
|
||||
if (isfile) {
|
||||
// make sure offset is page aligned
|
||||
@@ -99,7 +99,7 @@ syscallret_t syscall_mmap(context_t *context, void *hint, size_t len, int prot,
|
||||
}
|
||||
|
||||
// if the vnode is not cacheable, we need to make sure we can map it
|
||||
// TODO move this check to vmm_map once the return value of mmap is fixed to return an errno
|
||||
// TODO move this check to mm_map once the return value of mmap is fixed to return an errno
|
||||
if (vfs_iscacheable(file->vnode) == false) {
|
||||
ret.errno = VOP_MMAP(file->vnode, VOP_MMAP_ADDRESS_MMAP_SUPPORTED, 0, 0, NULL);
|
||||
if (ret.errno)
|
||||
@@ -113,7 +113,7 @@ syscallret_t syscall_mmap(context_t *context, void *hint, size_t len, int prot,
|
||||
if (hint < USERSPACE_START)
|
||||
hint = USERSPACE_MMAP_START;
|
||||
|
||||
ret.ret = (uint64_t)vmm_map(hint, len, vmmflags, mmuflags, &vfd);
|
||||
ret.ret = (uint64_t)mm_map(hint, len, mm_flags, mmuflags, &vfd);
|
||||
if (ret.ret == 0)
|
||||
ret.errno = ENOMEM;
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#include <kernel/syscalls.h>
|
||||
#include <kernel/vmm.h>
|
||||
#include <kernel/mm.h>
|
||||
#include <kernel/alloc.h>
|
||||
#include <kernel/vfs.h>
|
||||
#include <logging.h>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include <kernel/syscalls.h>
|
||||
#include <kernel/abi.h>
|
||||
#include <errno.h>
|
||||
#include <kernel/vmm.h>
|
||||
#include <kernel/mm.h>
|
||||
#include <logging.h>
|
||||
|
||||
#define PROT_READ 0x01
|
||||
@@ -37,7 +37,7 @@ syscallret_t syscall_mprotect(context_t *context, void *address, size_t len, int
|
||||
if ((prot & PROT_EXEC) == 0)
|
||||
mmuflags |= ARCH_MMU_FLAGS_NOEXEC;
|
||||
|
||||
ret.errno = vmm_changemmuflags(address, len, mmuflags, VMM_FLAGS_CREDCHECK);
|
||||
ret.errno = mm_change_mmu_flags(address, len, mmuflags, MM_RANGE_FLAGS_CREDCHECK);
|
||||
ret.ret = ret.errno ? -1 : 0;
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#include <kernel/syscalls.h>
|
||||
#include <kernel/vmm.h>
|
||||
#include <kernel/mm.h>
|
||||
#include <errno.h>
|
||||
|
||||
syscallret_t syscall_munmap(context_t *ctx, void *addr, size_t length) {
|
||||
@@ -18,7 +18,7 @@ syscallret_t syscall_munmap(context_t *ctx, void *addr, size_t length) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
vmm_unmap(addr, length, 0);
|
||||
mm_unmap(addr, length, 0);
|
||||
|
||||
ret.ret = 0;
|
||||
ret.errno = 0;
|
||||
|
||||
@@ -26,7 +26,7 @@ syscallret_t syscall_newthread(context_t *, void *entry, void *stack) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
thread->vmmctx = current_thread()->vmmctx;
|
||||
thread->mmctx = current_thread()->mmctx;
|
||||
|
||||
bool intstatus = interrupt_set(false);
|
||||
spinlock_acquire(&proc->threadlistlock);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include <kernel/syscalls.h>
|
||||
#include <kernel/file.h>
|
||||
#include <kernel/poll.h>
|
||||
#include <kernel/vmm.h>
|
||||
#include <kernel/mm.h>
|
||||
#include <logging.h>
|
||||
#include <kernel/alloc.h>
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include <kernel/syscalls.h>
|
||||
#include <time.h>
|
||||
#include <kernel/vmm.h>
|
||||
#include <kernel/mm.h>
|
||||
#include <kernel/timer.h>
|
||||
#include <arch/cpu.h>
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ thread_t *sched_newthread(void *ip, size_t kstacksize, int nice, proc_t *proc, v
|
||||
return NULL;
|
||||
}
|
||||
|
||||
thread->kernelstack = vmm_map(NULL, kstacksize, VMM_FLAGS_ALLOCATE, ARCH_MMU_FLAGS_WRITE | ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_NOEXEC, NULL);
|
||||
thread->kernelstack = mm_map(NULL, kstacksize, MM_RANGE_FLAGS_ALLOCATE, ARCH_MMU_FLAGS_WRITE | ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_NOEXEC, NULL);
|
||||
if (thread->kernelstack == NULL) {
|
||||
arch_extracontext_free(&thread->extracontext);
|
||||
slab_free(thread_cache, thread);
|
||||
@@ -32,8 +32,8 @@ thread_t *sched_newthread(void *ip, size_t kstacksize, int nice, proc_t *proc, v
|
||||
|
||||
thread->kernelstacktop = (void *)((uintptr_t)thread->kernelstack + kstacksize);
|
||||
|
||||
// non kernel thread vmm contexts are handled by the caller
|
||||
thread->vmmctx = proc ? NULL : &vmm_kernelctx;
|
||||
// non kernel thread mm contexts are handled by the caller
|
||||
thread->mmctx = proc ? NULL : &mm_kernel_ctx;
|
||||
thread->proc = proc;
|
||||
thread->kernelstacksize = kstacksize;
|
||||
thread->nice = nice;
|
||||
@@ -57,7 +57,7 @@ thread_t *sched_newthread(void *ip, size_t kstacksize, int nice, proc_t *proc, v
|
||||
}
|
||||
|
||||
void sched_destroythread(thread_t *thread) {
|
||||
vmm_unmap(thread->kernelstack, thread->kernelstacksize, 0);
|
||||
mm_unmap(thread->kernelstack, thread->kernelstacksize, 0);
|
||||
arch_extracontext_free(&thread->extracontext);
|
||||
slab_free(thread_cache, thread);
|
||||
}
|
||||
@@ -84,18 +84,18 @@ __attribute__((noreturn)) void sched_threadexit() {
|
||||
thread_t *thread = current_thread();
|
||||
proc_t *proc = thread->proc;
|
||||
|
||||
vmmcontext_t *oldctx = thread->vmmctx;
|
||||
vmm_switchcontext(&vmm_kernelctx);
|
||||
mm_context_t *oldctx = thread->mmctx;
|
||||
mm_switch_context(&mm_kernel_ctx);
|
||||
|
||||
if (proc) {
|
||||
__atomic_fetch_sub(&proc->runningthreadcount, 1, __ATOMIC_SEQ_CST);
|
||||
__assert(oldctx != &vmm_kernelctx);
|
||||
__assert(oldctx != &mm_kernel_ctx);
|
||||
if (proc->runningthreadcount == 0) {
|
||||
if (thread->shouldexit)
|
||||
proc->status = -1;
|
||||
|
||||
proc_exit();
|
||||
vmm_destroycontext(oldctx);
|
||||
mm_destroy_context(oldctx);
|
||||
PROC_RELEASE(proc);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user