summaryrefslogtreecommitdiffstats
path: root/arch/x86_64/hal/process.c
diff options
context:
space:
mode:
authorJon Santmyer <jon@jonsantmyer.com>2026-09-05 20:24:13 -0400
committerJon Santmyer <jon@jonsantmyer.com>2026-09-05 20:24:13 -0400
commit779b7fc1fe91e5a355b6e15de882d46b26ab2270 (patch)
treec62da25a0a0b02488550e856921350fd94668c2b /arch/x86_64/hal/process.c
parent73cbb23130f634bf52ac92da063efd3e6016f8ee (diff)
downloadjove-kernel-779b7fc1fe91e5a355b6e15de882d46b26ab2270.tar.gz
jove-kernel-779b7fc1fe91e5a355b6e15de882d46b26ab2270.tar.bz2
jove-kernel-779b7fc1fe91e5a355b6e15de882d46b26ab2270.zip
working syscalls.
Diffstat (limited to 'arch/x86_64/hal/process.c')
-rw-r--r--arch/x86_64/hal/process.c37
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("\