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 /arch/x86_64/hal | |
| 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 'arch/x86_64/hal')
| -rw-r--r-- | arch/x86_64/hal/obj.c | 99 | ||||
| -rw-r--r-- | arch/x86_64/hal/paging.c | 14 | ||||
| -rw-r--r-- | arch/x86_64/hal/serial_com.c | 5 | ||||
| -rw-r--r-- | arch/x86_64/hal/smp.c | 18 |
4 files changed, 36 insertions, 100 deletions
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; +} |
