diff options
| author | Jon Santmyer <jon@jonsantmyer.com> | 2026-09-04 11:31:40 -0400 |
|---|---|---|
| committer | Jon Santmyer <jon@jonsantmyer.com> | 2026-09-04 11:31:40 -0400 |
| commit | 8251da342161767fe203627223ccd4a7026701c6 (patch) | |
| tree | af2db0f11b0ea8ad35f88663a855bab39a80f679 /arch/x86_64/hal/smp.c | |
| download | jove-kernel-8251da342161767fe203627223ccd4a7026701c6.tar.gz jove-kernel-8251da342161767fe203627223ccd4a7026701c6.tar.bz2 jove-kernel-8251da342161767fe203627223ccd4a7026701c6.zip | |
initial commit. working on tasking
Diffstat (limited to 'arch/x86_64/hal/smp.c')
| -rw-r--r-- | arch/x86_64/hal/smp.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/arch/x86_64/hal/smp.c b/arch/x86_64/hal/smp.c new file mode 100644 index 0000000..a28fdc1 --- /dev/null +++ b/arch/x86_64/hal/smp.c @@ -0,0 +1,65 @@ +#include "smp.h" +#include "init.h" +#include "hal/obj.h" +#include "config.h" +#include "jove.h" +#include "lib/printf.h" +#include "paging.h" +#include "msr.h" + +processor_t s_processors[SMP_PROCESSORS_MAX] = { 0 }; + +PAGEALIGN +jove_objdir_t s_processor_objdir = { 0 }; + +extern void +gdt_setup(processor_t *processor); + +extern void +idt_init(void); + +extern void +idt_setup(processor_t *processor); + +static void +init_processor(processor_t *processor, jove_owned_obj_t *obj) +{ + gdt_setup(processor); + idt_setup(processor); + + msr_set_gs_base((uintptr_t)processor); + + obj_settype(obj, JOVE_OBJ_PROCESSOR); + obj_setvalue(obj, (uintptr_t)processor); +} + +void +smp_init_bsp(void) +{ + idt_init(); + paging_pml4_init(); + + kprintf("%p\n", _rootdir_obj); + processor_t *bsp = &s_processors[0]; + { + jove_owned_obj_t *processor_objdir_obj = obj_take(objdir_getlocal(_rootdir_obj, ROOTDIR_PROCESSORS_I)); + obj_settype(processor_objdir_obj, JOVE_OBJ_OBJDIR); + obj_setvalue(processor_objdir_obj, (uintptr_t)&s_processor_objdir); + + jove_owned_obj_t *bsp_obj = obj_take(objdir_getlocal(processor_objdir_obj, 0)); + init_processor(bsp, bsp_obj); + + obj_release(bsp_obj); + obj_release(processor_objdir_obj); + } +} + +void *processor_current(void) +{ + return (processor_t*)msr_get_gs_base(); +} + +jove_obj_t *processor_objdir(void *processor) +{ + return ((processor_t*)processor)->pcb->rootdir; +} |
