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 --- arch/x86_64/hal/obj.c | 99 +++----------------------------------------- arch/x86_64/hal/paging.c | 14 ++++++- arch/x86_64/hal/serial_com.c | 5 ++- arch/x86_64/hal/smp.c | 18 ++++++-- arch/x86_64/lib/printf.c | 5 ++- arch/x86_64/main.c | 2 +- arch/x86_64/proc/init.c | 13 +++--- arch/x86_64/proc/process.c | 52 ++++++++--------------- arch/x86_64/proc/process.h | 7 +--- arch/x86_64/proc/scheduler.c | 20 +++++++++ arch/x86_64/proc/switch.s | 9 ++++ arch/x86_64/sys/syscall.c | 2 +- 12 files changed, 94 insertions(+), 152 deletions(-) create mode 100644 arch/x86_64/proc/scheduler.c create mode 100644 arch/x86_64/proc/switch.s (limited to 'arch/x86_64') diff --git a/arch/x86_64/hal/obj.c b/arch/x86_64/hal/obj.c index 110351c..b3658b2 100644 --- a/arch/x86_64/hal/obj.c +++ b/arch/x86_64/hal/obj.c @@ -28,6 +28,11 @@ obj_trytake(jove_obj_t *obj) return (jove_owned_obj_t*)obj; } +jove_obj_t *obj_asunowned(jove_owned_obj_t *obj) +{ + return (jove_obj_t*)obj; +} + jove_obj_t* obj_release(jove_owned_obj_t *obj) { @@ -74,97 +79,3 @@ obj_setvalue(jove_owned_obj_t *obj, uintmax_t value) obj->locked.value = value & 0x00007FFFFFFFFFFFULL; } -jove_obj_t -objdir_peeklocal( - jove_owned_obj_t *objdir_obj, - uint16_t entry) -{ - if(obj_gettype(objdir_obj) != JOVE_OBJ_OBJDIR) { - errno = EBADOBJ; - return (jove_obj_t) { 0 }; - } - if(entry >= JOVE_OBJDIR_ENTRIES) { - errno = EBADPATH; - return (jove_obj_t) { 0 }; - } - - jove_objdir_t *objtab = obj_deref(objdir_obj); - return objtab->entries[entry]; -} - -jove_owned_obj_t* -objdir_getlocal( - jove_owned_obj_t *objdir_obj, - uint16_t entry) -{ - if(obj_gettype(objdir_obj) != JOVE_OBJ_OBJDIR) { - reterr(EBADOBJ); - } - if(entry >= JOVE_OBJDIR_ENTRIES) { - reterr(EBADPATH); - } - - jove_objdir_t *objtab = obj_deref(objdir_obj); - return obj_take(&objtab->entries[entry]); -} - -jove_owned_obj_t* -objdir_trygetlocal( - jove_owned_obj_t *objdir_obj, - uint16_t entry) -{ - if(obj_gettype(objdir_obj) != JOVE_OBJ_OBJDIR) { - reterr(EBADOBJ); - } - if(entry >= JOVE_OBJDIR_ENTRIES) { - reterr(EBADPATH); - } - - jove_objdir_t *objtab = obj_deref(objdir_obj); - return obj_trytake(&objtab->entries[entry]); -} - -jove_owned_obj_t* -objdir_getobj( - jove_owned_obj_t *objdir_obj, - const uint16_t *path, - size_t path_len) -{ - errno = 0; - if(path_len == 0) { - return objdir_obj; - } - { - jove_owned_obj_t *child_objdir = objdir_getlocal(objdir_obj, path[0]); - if(child_objdir == 0) { - reterr(EBADPATH); - } - - jove_owned_obj_t *target_obj = objdir_getobj(child_objdir, path + 1, path_len - 1); - obj_release(child_objdir); - return target_obj; - } -} - -jove_owned_obj_t* -objdir_trygetobj( - jove_owned_obj_t *objdir_obj, - const uint16_t *path, - size_t path_len) -{ - errno = 0; - if(path_len == 0) { - return objdir_obj; - } - { - jove_owned_obj_t *child_objdir = objdir_trygetlocal(objdir_obj, path[0]); - if(child_objdir == 0) { - return 0; - } - - jove_owned_obj_t *target_obj = objdir_trygetobj(child_objdir, path + 1, path_len - 1); - obj_release(child_objdir); - return target_obj; - } -} - diff --git a/arch/x86_64/hal/paging.c b/arch/x86_64/hal/paging.c index 1587c62..535d5b2 100644 --- a/arch/x86_64/hal/paging.c +++ b/arch/x86_64/hal/paging.c @@ -114,6 +114,18 @@ s_pagedir_get_pml1(page_t *pml4, uintptr_t vptr) return PML_TBL(pml2, pml2i); } +int +pagedir_new(jove_owned_obj_t *untyped_obj) +{ + jove_untyped_t *untyped = obj_deref(untyped_obj); + if((uintptr_t)untyped & 0xFFF) return -EALIGN; + if(untyped->limit != 0x1000) return -EBADSIZE; + + obj_settype(untyped_obj, JOVE_OBJ_PAGEDIR); + memcpy(untyped, _kernel_pml4, 0x1000); + return 0; +} + uintptr_t *pagedir_get_mapping(jove_owned_obj_t *pagedir, uintptr_t vptr) { page_t *pml4 = obj_deref(pagedir); @@ -440,7 +452,7 @@ paging_pml4_init(void) paging_pml4_switch(kernel_pml4_pptr); { - jove_owned_obj_t *pgdir_o = objdir_getlocal(_rootdir_obj, ROOTDIR_PAGEDIR_I); + jove_owned_obj_t *pgdir_o = objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_PAGEDIR_I); obj_settype(pgdir_o, JOVE_OBJ_PAGEDIR); obj_setvalue(pgdir_o, kernel_pml4_pptr); obj_release(pgdir_o); diff --git a/arch/x86_64/hal/serial_com.c b/arch/x86_64/hal/serial_com.c index 343d2ae..372a433 100644 --- a/arch/x86_64/hal/serial_com.c +++ b/arch/x86_64/hal/serial_com.c @@ -4,6 +4,7 @@ #include "hal/obj.h" #include "proc/init.h" #include "lib/printf.h" +#include "sys/objdir.h" static int serial_com_recv(uint16_t port) @@ -68,13 +69,13 @@ serial_com_init(void) } { - jove_owned_obj_t *com_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_SERIAL_COM_I); + jove_owned_obj_t *com_obj = objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_SERIAL_COM_I); obj_settype(com_obj, JOVE_OBJ_SERIAL_COM); obj_setvalue(com_obj, SERIAL_COM1); obj_release(com_obj); } - kprintf("Initialized COM1 on port %X for obj %X\n", SERIAL_COM1, ROOTDIR_SERIAL_COM_I); + kprintf("Initialized COM1 on port %X for obj %X\n", SERIAL_COM1, INIT_ROOTDIR_SERIAL_COM_I); } int diff --git a/arch/x86_64/hal/smp.c b/arch/x86_64/hal/smp.c index b894eb9..392e68f 100644 --- a/arch/x86_64/hal/smp.c +++ b/arch/x86_64/hal/smp.c @@ -8,6 +8,7 @@ #include "proc/process.h" #include "lib/printf.h" #include "lib/string.h" +#include "sys/objdir.h" processor_t s_processors[SMP_PROCESSORS_MAX]; @@ -43,7 +44,7 @@ smp_init_bsp(void) processor_t *bsp = &s_processors[0]; { - jove_owned_obj_t *processor_objdir_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_PROCESSORS_I); + jove_owned_obj_t *processor_objdir_obj = objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_PROCESSORS_I); obj_settype(processor_objdir_obj, JOVE_OBJ_OBJDIR); obj_setvalue(processor_objdir_obj, (uintptr_t)&s_processor_objdir); @@ -58,12 +59,23 @@ smp_init_bsp(void) paging_pml4_init(); } -processor_t *processor_current(void) +inline processor_t *processor_current(void) { return (processor_t*)msr_get_gs_base(); } -jove_owned_obj_t *processor_pcb(processor_t *processor) +inline jove_owned_obj_t *processor_getpcb(processor_t *processor) { return processor->pcb_obj; } + +void +processor_setpcb(processor_t *processor, jove_owned_obj_t *pcb_obj) +{ + pcb_t *pcb = obj_deref(pcb_obj); + if(processor->pcb) { + obj_release(processor_getpcb(processor)); + } + processor->pcb_obj = pcb_obj; + processor->pcb = pcb; +} diff --git a/arch/x86_64/lib/printf.c b/arch/x86_64/lib/printf.c index 794a592..db47f6b 100644 --- a/arch/x86_64/lib/printf.c +++ b/arch/x86_64/lib/printf.c @@ -2,6 +2,7 @@ #include "lib/printf.h" #include "lib/virtterm.h" #include "proc/init.h" +#include "sys/objdir.h" int kvprintf(const char *fmt, va_list ap) @@ -11,11 +12,11 @@ kvprintf(const char *fmt, va_list ap) int wlen = (r > 256 ? 256 : r); { - jove_owned_obj_t *serial_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_SERIAL_COM_I); + jove_owned_obj_t *serial_obj = objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_SERIAL_COM_I); serial_com_write(serial_obj, buffer, wlen); obj_release(serial_obj); - jove_owned_obj_t *vt_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_VIRTTERM_I); + jove_owned_obj_t *vt_obj = objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_VIRTTERM_I); vt_write(vt_obj, buffer, wlen); obj_release(vt_obj); } diff --git a/arch/x86_64/main.c b/arch/x86_64/main.c index 6e2fcb8..4a40707 100644 --- a/arch/x86_64/main.c +++ b/arch/x86_64/main.c @@ -18,7 +18,7 @@ int errno = 0; PAGEALIGN jove_objdir_t _rootdir; -void *_rootdir_obj = &_rootdir.entries[ROOTDIR_DIR_I]; +void *_rootdir_obj = &_rootdir.entries[INIT_ROOTDIR_DIR_I]; struct init_payload _init_payload; diff --git a/arch/x86_64/proc/init.c b/arch/x86_64/proc/init.c index 3787c7b..155cff6 100644 --- a/arch/x86_64/proc/init.c +++ b/arch/x86_64/proc/init.c @@ -5,6 +5,7 @@ #include "jove.h" #include "hal/obj.h" #include "lib/string.h" +#include "sys/objdir.h" #include "panic/panic.h" #include "lib/printf.h" #include "arch/x86_64/lib/elf.h" @@ -50,7 +51,7 @@ init_setup(void) kpanic("Kernel commandline is missing 'init' arg.\n"); } - jove_owned_obj_t *initrd_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_INITRD_I); + jove_owned_obj_t *initrd_obj = objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_INITRD_I); jove_owned_obj_t *init_obj = initrd_seek(initrd_obj, init_path); if(init_obj == NULL) { kpanic("init: Cannot find file '%s' in initrd.\n", init_path); @@ -69,7 +70,7 @@ init_setup(void) kpanic("init: Either passed file '%s' is not an ELF file or is not loadable.\n", init_path); } - jove_owned_obj_t *init_pagedir = objdir_getlocal(_rootdir_obj, ROOTDIR_PAGEDIR_I); + jove_owned_obj_t *init_pagedir = objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_PAGEDIR_I); page_t *pml4 = obj_deref(init_pagedir); size_t last_base = 0; @@ -133,7 +134,7 @@ init_setup(void) memcpy((void*)last_base, &_init_payload, sizeof(struct init_payload)); - jove_owned_obj_t *message_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_MESSAGE_I); + jove_owned_obj_t *message_obj = objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_MESSAGE_I); obj_settype(message_obj, JOVE_OBJ_MESSAGE); obj_setvalue(message_obj, last_base | 1); obj_release(message_obj); @@ -144,13 +145,9 @@ init_setup(void) extern void _syscall_entry(void); msr_set_lstar(_syscall_entry); - //Setup KSP for syscalls - jove_owned_obj_t *pcb_obj = process_current(); - pcb_t *pcb = obj_deref(pcb_obj); - - obj_release(pcb_obj); obj_release(_rootdir_obj); + //Setup KSP for syscalls uintptr_t usp = 0x00007FFFFFFFFFF8; uintptr_t uip = init_ehdr->e_entry; diff --git a/arch/x86_64/proc/process.c b/arch/x86_64/proc/process.c index d5513bc..5935303 100644 --- a/arch/x86_64/proc/process.c +++ b/arch/x86_64/proc/process.c @@ -1,4 +1,5 @@ #include "process.h" +#include "hal/memory.h" #include "proc/process.h" #include "arch/x86_64/hal/obj.h" #include "arch/x86_64/hal/smp.h" @@ -8,51 +9,34 @@ #include "lib/string.h" #include "proc/init.h" #include "jove.h" +#include "proc/scheduler.h" PAGEALIGN uint8_t s_init_iopb[0x2000]; PAGEALIGN char _init_pcb_bytes[0x1000] = { 0 }; -pcb_t *pcb_tree; + +int +_pcb_new_arch(pcb_t *pcb) +{ + return 0; +} void processing_setup(void (*process_main)) { - pcb_t *init_pcb = (pcb_t*)&_init_pcb_bytes; - pcb_tree = init_pcb; - - memset(s_init_iopb, 0xFF, 0x2000); - uintptr_t ksp = ((uintptr_t)&_init_pcb_bytes) + 0xFF8; - - init_pcb->header.tree_node.get_key = (void*)pcb_getpid; - init_pcb->header.tree_node.color = 1; - init_pcb->header.rootdir = _rootdir_obj; - init_pcb->header.pagedir = obj_release(objdir_getlocal(_rootdir_obj, ROOTDIR_PAGEDIR_I)); + jove_owned_obj_t *init_pcb_obj = objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_PCB_I); + obj_settype(init_pcb_obj, JOVE_OBJ_PCB); + obj_setvalue(init_pcb_obj, phys_fromvirt((uintptr_t)&_init_pcb_bytes)); + + pcb_new(init_pcb_obj, sizeof(_init_pcb_bytes), _rootdir_obj); - init_pcb->header.pid = 1; - init_pcb->header.state = PCB_STATE_RUNNING; - - init_pcb->ksp = (void*)ksp; - - jove_owned_obj_t *iopb_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_IOPB_I); + jove_owned_obj_t *iopb_obj = objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_IOPB_I); obj_settype(iopb_obj, JOVE_OBJ_IOPB); obj_setvalue(iopb_obj, (uintptr_t)s_init_iopb); - init_pcb->iopb = obj_release(iopb_obj); - processor_t *proc = processor_current(); - proc->tss.rsp[0] = (uintptr_t)init_pcb->ksp; - memcpy(proc->iopb, s_init_iopb, 0x2000); - - { - jove_owned_obj_t *process_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_PCB_I); - obj_settype(process_obj, JOVE_OBJ_PCB); - obj_setvalue(process_obj, (uintptr_t)init_pcb); + memset(s_init_iopb, 0xFF, 0x2000); + pcb_t *init_pcb = obj_deref(init_pcb_obj); - proc->pcb_obj = process_obj; - proc->pcb = init_pcb; - } + init_pcb->iopb = obj_release(iopb_obj); - __asm__ volatile("\ - movq %0, %%rsp; \ - xorq %%rbp, %%rbp; \ - jmpq %1":: - "r"(init_pcb->ksp), "r"(process_main)); + scheduler_init(init_pcb_obj, process_main); } diff --git a/arch/x86_64/proc/process.h b/arch/x86_64/proc/process.h index 6a0aa96..5004b49 100644 --- a/arch/x86_64/proc/process.h +++ b/arch/x86_64/proc/process.h @@ -2,19 +2,14 @@ #define _JOVE_x86_64_HAL_PROCESS_H 1 #include "proc/process.h" -#include "arch/x86_64/x86_64.h" #include "lib/rbtree.h" typedef struct process_control_block { - struct pcb_expected_header header; + struct pcb_header header; jove_obj_t *iopb; - - int killed; - struct cpu_context context; - void *ksp; char kstack[]; } pcb_t; diff --git a/arch/x86_64/proc/scheduler.c b/arch/x86_64/proc/scheduler.c new file mode 100644 index 0000000..23e54af --- /dev/null +++ b/arch/x86_64/proc/scheduler.c @@ -0,0 +1,20 @@ +#include "proc/scheduler.h" +#include "arch/x86_64/hal/gdt.h" +#include "process.h" +#include "../hal/smp.h" +#include + +void +_scheduler_switch_pcb_arch(pcb_t *target) +{ + processor_t *proc = processor_current(); + proc->tss.rsp[0] = (uintptr_t)target->header.ksp; + + if(target->iopb) { + proc->tss.iopb = sizeof(struct tss); + jove_owned_obj_t *iopb_obj = obj_take(target->iopb); + memcpy(proc->iopb, obj_deref(iopb_obj), sizeof(proc->iopb)); + }else{ + proc->tss.iopb = 0xff; + } +} diff --git a/arch/x86_64/proc/switch.s b/arch/x86_64/proc/switch.s new file mode 100644 index 0000000..d571c66 --- /dev/null +++ b/arch/x86_64/proc/switch.s @@ -0,0 +1,9 @@ +.global scheduler_switch +.type scheduler_switch @function + +scheduler_switch: + movq %rsp, (%rdi) + movq %rsi, %rsp + retq + +.size scheduler_switch, . - scheduler_switch diff --git a/arch/x86_64/sys/syscall.c b/arch/x86_64/sys/syscall.c index b584756..1e06e61 100644 --- a/arch/x86_64/sys/syscall.c +++ b/arch/x86_64/sys/syscall.c @@ -50,5 +50,5 @@ void _syscall_entry(void) sysretq" :: [pcb] "i"(offsetof(processor_t, pcb)), - [ksp] "i"(offsetof(pcb_t, ksp))); + [ksp] "i"(offsetof(struct pcb_header, ksp))); } -- cgit v1.2.3