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.c18
1 files changed, 15 insertions, 3 deletions
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;
+}