From cfdab9598d1c3e49d879d5e901a52d61fbab0991 Mon Sep 17 00:00:00 2001 From: Matheus Date: Tue, 9 May 2023 23:25:56 -0300 Subject: [PATCH] scheduler: getcwd, getroot, and initialise process cwd and root to vfsroot --- kernel-src/include/kernel/scheduler.h | 4 ++++ kernel-src/sys/scheduler.c | 34 +++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/kernel-src/include/kernel/scheduler.h b/kernel-src/include/kernel/scheduler.h index e361aa5c..bbd8144c 100644 --- a/kernel-src/include/kernel/scheduler.h +++ b/kernel-src/include/kernel/scheduler.h @@ -50,6 +50,7 @@ typedef struct proc_t { int flags; vnode_t *cwd; vnode_t *root; + spinlock_t nodeslock; } proc_t; #include @@ -64,6 +65,9 @@ void sched_preparesleep(bool interruptible); void sched_wakeup(thread_t *thread, int reason); int sched_sleep(); proc_t *sched_newproc(); +vnode_t *sched_getcwd(); +vnode_t *sched_getroot(); thread_t *sched_newthread(void *ip, size_t kstacksize, int priority, proc_t *proc, void *ustack); + #endif diff --git a/kernel-src/sys/scheduler.c b/kernel-src/sys/scheduler.c index 605b2a21..63b61bee 100644 --- a/kernel-src/sys/scheduler.c +++ b/kernel-src/sys/scheduler.c @@ -40,6 +40,7 @@ proc_t *sched_newproc() { proc->threadtablesize = 1; proc->runningthreadcount = 1; SPINLOCK_INIT(proc->lock); + SPINLOCK_INIT(proc->nodeslock); proc->fdcount = 3; proc->fdfirst = 3; SPINLOCK_INIT(proc->fdlock); @@ -273,6 +274,27 @@ void sched_wakeup(thread_t *thread, int reason) { interrupt_set(intstate); } +static vnode_t *getnodeslock(vnode_t **addr) { + proc_t *proc = _cpu()->thread->proc; + bool intstatus = interrupt_set(false); + spinlock_acquire(&proc->nodeslock); + vnode_t *vnode = *addr; + VOP_HOLD(vnode); + spinlock_release(&proc->nodeslock); + interrupt_set(intstatus); + return vnode; +} + +vnode_t *sched_getcwd() { + proc_t *proc = _cpu()->thread->proc; + return getnodeslock(&proc->cwd); +} + +vnode_t *sched_getroot() { + proc_t *proc = _cpu()->thread->proc; + return getnodeslock(&proc->root); +} + static void timerhook(void *private, context_t *context) { thread_t* current = _cpu()->thread; @@ -360,6 +382,18 @@ void sched_runinit() { __assert(interpinterp == NULL); } + vnode_t *stdinvnode; + __assert(vfs_open(vfsroot, "/dev/console", V_FFLAGS_READ, &stdinvnode) == 0); + vnode_t *stdoutnode; + __assert(vfs_open(vfsroot, "/dev/console", V_FFLAGS_WRITE, &stdoutnode) == 0); + vnode_t *stderrnode; + __assert(vfs_open(vfsroot, "/dev/console", V_FFLAGS_WRITE, &stderrnode) == 0); + + proc->cwd = vfsroot; + VOP_HOLD(vfsroot); + proc->root = vfsroot; + VOP_HOLD(vfsroot); + char *argv = {NULL}; char *envp = {NULL};