diff options
| author | Jon Santmyer <jon@jonsantmyer.com> | 2026-10-09 10:24:41 -0400 |
|---|---|---|
| committer | Jon Santmyer <jon@jonsantmyer.com> | 2026-10-09 10:24:41 -0400 |
| commit | cc23ea5a4b38807e79aceb23e6f43e965926618f (patch) | |
| tree | 90142bb44186f4dad7bbd82d3d53655b835c822b /proc/scheduler.c | |
| parent | 434ddcd907832b1febc7d70e4faa52109c7eb3bd (diff) | |
| download | jove-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/scheduler.c')
| -rw-r--r-- | proc/scheduler.c | 52 |
1 files changed, 52 insertions, 0 deletions
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)); +} |
