summaryrefslogtreecommitdiffstats
path: root/proc
diff options
context:
space:
mode:
authorJon Santmyer <jon@jonsantmyer.com>2026-10-09 10:24:41 -0400
committerJon Santmyer <jon@jonsantmyer.com>2026-10-09 10:24:41 -0400
commitcc23ea5a4b38807e79aceb23e6f43e965926618f (patch)
tree90142bb44186f4dad7bbd82d3d53655b835c822b /proc
parent434ddcd907832b1febc7d70e4faa52109c7eb3bd (diff)
downloadjove-kernel-cc23ea5a4b38807e79aceb23e6f43e965926618f.tar.gz
jove-kernel-cc23ea5a4b38807e79aceb23e6f43e965926618f.tar.bz2
jove-kernel-cc23ea5a4b38807e79aceb23e6f43e965926618f.zip
add basic scheduler logic. rename init rootdir indexes
Diffstat (limited to 'proc')
-rw-r--r--proc/init.c3
-rw-r--r--proc/process.c64
-rw-r--r--proc/process.h34
-rw-r--r--proc/scheduler.c52
-rw-r--r--proc/scheduler.h8
5 files changed, 136 insertions, 25 deletions
diff --git a/proc/init.c b/proc/init.c
index 4389187..10f8a01 100644
--- a/proc/init.c
+++ b/proc/init.c
@@ -1,4 +1,5 @@
#include "init.h"
+#include "sys/objdir.h"
#include "hal/memory.h"
#include "panic/panic.h"
@@ -7,7 +8,7 @@ objpath_part_t s_last_region = JOVE_OBJDIR_ENTRIES-1;
jove_owned_obj_t
init_pop_alloc(void)
{
- jove_owned_obj_t *freemem_dir = objdir_trygetlocal(_rootdir_obj, ROOTDIR_FREEMEMORY_I);
+ jove_owned_obj_t *freemem_dir = objdir_trygetlocal(_rootdir_obj, INIT_ROOTDIR_FREEMEMORY_I);
if(freemem_dir == 0) {
kpanic("Untyped directory is locked!\n");
}
diff --git a/proc/process.c b/proc/process.c
index e811cb6..137e35c 100644
--- a/proc/process.c
+++ b/proc/process.c
@@ -1,38 +1,86 @@
#include "process.h"
+#include "api/process.h"
#include "hal/smp.h"
+#include "sys/objdir.h"
+#include <string.h>
+
+struct rbtree_node *pcb_tree;
+pid_t __next_pid = 1;
+
+int
+pcb_new(jove_owned_obj_t *pcb_obj, size_t size, jove_owned_obj_t *rootdir_obj)
+{
+ struct pcb_header *pcb_header = obj_deref(pcb_obj);
+
+ memset(pcb_header, 0, size);
+
+ pcb_header->size = size;
+ pcb_header->pid = __next_pid++;
+ pcb_header->rootdir = obj_asunowned(rootdir_obj);
+
+ pcb_header->tree_node.get_key = (void*)pcb_getpid;
+ pcb_tree = rbtree_insert(pcb_tree, &pcb_header->tree_node);
+
+ pcb_header->state = PCB_STATE_EMBRYO;
+ pcb_header->ksp = (void*)pcb_obj + size - sizeof(uintmax_t);
+ return _pcb_new_arch((pcb_t*)pcb_header);
+}
+
+pcb_t *pcb_frompid(pid_t pid)
+{
+ return (pcb_t*)rbtree_search((struct rbtree_node*)pcb_tree, pid);
+}
jove_owned_obj_t*
process_current(void)
{
- return processor_pcb(((processor_t*)processor_current()));
+ return processor_getpcb(((processor_t*)processor_current()));
}
pid_t
pcb_getpid(pcb_t *pcb)
{
- return ((struct pcb_expected_header*)pcb)->pid;
+ return ((struct pcb_header*)pcb)->pid;
}
jove_obj_t*
pcb_getrootdir(pcb_t *pcb)
{
- return ((struct pcb_expected_header*)pcb)->rootdir;
+ return ((struct pcb_header*)pcb)->rootdir;
}
-jove_obj_t*
-pcb_getpagedir(pcb_t *pcb)
+jove_owned_obj_t*
+pcb_getpagedir(jove_owned_obj_t *rootdir_obj)
+{
+ return objdir_getlocal(rootdir_obj, PCB_ROOTDIR_PAGEDIR_I);
+}
+
+jove_owned_obj_t*
+pcb_getself(jove_owned_obj_t *rootdir_obj)
{
- return ((struct pcb_expected_header*)pcb)->pagedir;
+ return objdir_getlocal(rootdir_obj, PCB_ROOTDIR_SELF_I);
}
enum pcb_state
pcb_getstate(pcb_t *pcb)
{
- return ((struct pcb_expected_header*)pcb)->state;
+ return ((struct pcb_header*)pcb)->state;
}
intmax_t
pcb_getstatecode(pcb_t *pcb)
{
- return ((struct pcb_expected_header*)pcb)->state_code;
+ return ((struct pcb_header*)pcb)->state_code;
+}
+
+void*
+pcb_getksp(pcb_t *pcb)
+{
+ return ((struct pcb_header*)pcb)->ksp;
+}
+
+void**
+pcb_getksp_ref(pcb_t *pcb)
+{
+ return &((struct pcb_header*)pcb)->ksp;
}
diff --git a/proc/process.h b/proc/process.h
index ed40a4f..950f63e 100644
--- a/proc/process.h
+++ b/proc/process.h
@@ -5,49 +5,51 @@
#include "lib/rbtree.h"
#include "api/process.h"
-enum pcb_state
-{
- _PCB_STATE_INVALID = 0,
- PCB_STATE_DEAD,
- PCB_STATE_READY,
- PCB_STATE_RUNNING,
- PCB_STATE_WAITING,
- PCB_STATE_BLOCKED_MAIL
-};
-
struct pcb_mailbox
{
jove_obj_t *obj;
pid_t pid;
};
-struct pcb_expected_header
+struct pcb_header
{
struct rbtree_node tree_node;
- struct pcb_expected_header *sched_next;
+ struct pcb_header *sched_next;
+ size_t size;
pid_t pid;
jove_obj_t *rootdir;
- jove_obj_t *pagedir;
enum pcb_state state;
intmax_t state_code;
struct pcb_mailbox send, recv;
+
+ void *ksp;
};
typedef struct process_control_block pcb_t;
jove_owned_obj_t *process_current(void);
-void pcb_new(pcb_t *pcb);
+int pcb_new(jove_owned_obj_t *pcb_obj, size_t size, jove_owned_obj_t *rootdir_obj);
+int _pcb_new_arch(pcb_t *pcb);
+
+pcb_t *pcb_frompid(pid_t pid);
pid_t pcb_getpid(pcb_t *pcb);
jove_obj_t *pcb_getrootdir(pcb_t *pcb);
-jove_obj_t *pcb_getpagedir(pcb_t *pcb);
+jove_owned_obj_t *pcb_getpagedir(jove_owned_obj_t *rootdir_obj);
+jove_owned_obj_t *pcb_getself(jove_owned_obj_t *rootdir_obj);
+
enum pcb_state pcb_getstate(pcb_t *pcb);
intmax_t pcb_getstatecode(pcb_t *pcb);
-extern pcb_t *pcb_tree;
+void *pcb_getksp(pcb_t *pcb);
+void **pcb_getksp_ref(pcb_t *pcb);
+
+pcb_t *pcb_frompid(pid_t pid);
+
+extern struct rbtree_node *pcb_tree;
#endif
diff --git a/proc/scheduler.c b/proc/scheduler.c
index 852cfef..875bcc4 100644
--- a/proc/scheduler.c
+++ b/proc/scheduler.c
@@ -1,3 +1,55 @@
#include "scheduler.h"
+#include "api/error.h"
+#include "hal/smp.h"
+#include "sys/objdir.h"
+#include "proc/init.h"
+#include "proc/process.h"
+static struct pcb_header *s_ready_queue;
+static inline int
+s_scheduler_yield_pcb(processor_t *proc, pcb_t *current_pcb, pcb_t *target_pcb)
+{
+ jove_owned_obj_t *target_rootdir = obj_take(pcb_getrootdir(target_pcb));
+ jove_owned_obj_t *target_pcb_obj = pcb_getself(target_rootdir);
+
+ processor_setpcb(proc, target_pcb_obj);
+
+ obj_release(target_rootdir);
+ _scheduler_switch_pcb_arch(target_pcb);
+ scheduler_switch(pcb_getksp_ref(current_pcb), pcb_getksp(target_pcb));
+
+ return 0;
+}
+
+
+int scheduler_yield(pid_t target_pid)
+{
+ processor_t *proc = processor_current();
+ pcb_t *current_pcb = obj_deref(processor_getpcb(proc));
+ pcb_t *target_pcb = (pcb_t*)((struct pcb_header*)current_pcb)->sched_next;
+
+ if(target_pid != 0) {
+ pcb_t *target_pcb = pcb_frompid(target_pid);
+ }
+ if(target_pcb == 0) {
+ return -EBADPROC;
+ }
+
+ return s_scheduler_yield_pcb(proc, current_pcb, target_pcb);
+}
+
+void scheduler_init(jove_owned_obj_t *pcb_obj, void *process_main)
+{
+ struct pcb_header *pcb_header = obj_deref(pcb_obj);
+ pcb_header->state = PCB_STATE_RUNNING;
+ pcb_header->sched_next = pcb_header;
+
+ processor_t *proc = processor_current();
+ processor_setpcb(proc, pcb_obj);
+
+ __asm__("movq %0, %%rsp; \
+ xorq %%rbp, %%rbp; \
+ jmp %1"::
+ "m"(pcb_header->ksp), "r"(process_main));
+}
diff --git a/proc/scheduler.h b/proc/scheduler.h
index 6f1b6b2..0371e86 100644
--- a/proc/scheduler.h
+++ b/proc/scheduler.h
@@ -1,6 +1,14 @@
#ifndef _JOVE_PROC_SCHEDULER_H
#define _JOVE_PROC_SCHEDULER_H 1
+#include "process.h"
+
+void scheduler_init(jove_owned_obj_t *pcb_obj, void *process_main);
+
+void scheduler_switch(void *this_sp, void *other_sp);
+void _scheduler_switch_pcb_arch(pcb_t *target);
+
+int scheduler_yield(pid_t target);
#endif