diff options
Diffstat (limited to 'arch/x86_64/hal/process.c')
| -rw-r--r-- | arch/x86_64/hal/process.c | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/arch/x86_64/hal/process.c b/arch/x86_64/hal/process.c index 5c91238..872be5a 100644 --- a/arch/x86_64/hal/process.c +++ b/arch/x86_64/hal/process.c @@ -1,6 +1,8 @@ #include "process.h" #include "arch/x86_64/hal/obj.h" #include "hal/obj.h" +#include "hal/process.h" +#include "hal/smp.h" #include "init.h" #include "smp.h" #include "paging.h" @@ -9,22 +11,53 @@ PAGEALIGN char s_init_pcb_bytes[0x1000] = { 0 }; static pcb_t *s_init_pcb = (pcb_t*)&s_init_pcb_bytes; +jove_owned_obj_t* +process_current(void) +{ + return obj_take(((processor_t*)processor_current())->pcb_obj); +} + +pcb_t* +pcb_from_obj(jove_owned_obj_t *obj) +{ + if(obj_gettype(obj) != JOVE_OBJ_PROCESS) { + reterr(EBADOBJ); + } + return obj_deref(obj); +} + +pid_t +pcb_pid(pcb_t *pcb) +{ + return pcb->pid; +} + +jove_owned_obj_t* +pcb_rootdir(pcb_t *pcb) +{ + return obj_take(pcb->rootdir); +} + void processing_setup(void (*process_main)) { uintptr_t ksp = ((uintptr_t)&s_init_pcb_bytes) + 0xFF0; + + s_init_pcb->pid = 1; s_init_pcb->ksp = (void*)ksp; s_init_pcb->pml4 = paging_get_pml4(); + s_init_pcb->rootdir = _rootdir_obj; processor_t *proc = processor_current(); - proc->pcb = s_init_pcb; proc->tss.rsp[0] = (uintptr_t)s_init_pcb->ksp; { jove_owned_obj_t *process_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_PCB_I); obj_settype(process_obj, JOVE_OBJ_PROCESS); obj_setvalue(process_obj, (uintptr_t)s_init_pcb); - obj_release(process_obj); + + proc->pcb_obj = obj_release(process_obj); + proc->pcb = s_init_pcb; } __asm__ volatile("\ |
