From cc23ea5a4b38807e79aceb23e6f43e965926618f Mon Sep 17 00:00:00 2001 From: Jon Santmyer Date: Fri, 9 Oct 2026 10:24:41 -0400 Subject: add basic scheduler logic. rename init rootdir indexes --- proc/process.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 56 insertions(+), 8 deletions(-) (limited to 'proc/process.c') 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 + +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; } -- cgit v1.2.3