summaryrefslogtreecommitdiffstats
path: root/arch/x86_64/hal/smp.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/hal/smp.c')
-rw-r--r--arch/x86_64/hal/smp.c65
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;
+}