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/init.c | 3 ++- proc/process.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++------- proc/process.h | 34 ++++++++++++++++-------------- proc/scheduler.c | 52 +++++++++++++++++++++++++++++++++++++++++++++ proc/scheduler.h | 8 +++++++ 5 files changed, 136 insertions(+), 25 deletions(-) (limited to 'proc') 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 + +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 -- cgit v1.2.3