summaryrefslogtreecommitdiffstats
path: root/proc/process.c
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/process.c
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/process.c')
-rw-r--r--proc/process.c64
1 files changed, 56 insertions, 8 deletions
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;
}