summaryrefslogtreecommitdiffstats
path: root/proc/process.c
diff options
context:
space:
mode:
Diffstat (limited to 'proc/process.c')
-rw-r--r--proc/process.c64
1 files changed, 56 insertions, 8 deletions
diff --git a/proc/process.c b/proc/process.c
index e811cb6..137e35c 100644
--- a/proc/process.c
+++ b/proc/process.c
@@ -1,38 +1,86 @@
#include "process.h"
+#include "api/process.h"
#include "hal/smp.h"
+#include "sys/objdir.h"
+#include <string.h>
+
+struct rbtree_node *pcb_tree;
+pid_t __next_pid = 1;
+
+int
+pcb_new(jove_owned_obj_t *pcb_obj, size_t size, jove_owned_obj_t *rootdir_obj)
+{
+ struct pcb_header *pcb_header = obj_deref(pcb_obj);
+
+ memset(pcb_header, 0, size);
+
+ pcb_header->size = size;
+ pcb_header->pid = __next_pid++;
+ pcb_header->rootdir = obj_asunowned(rootdir_obj);
+
+ pcb_header->tree_node.get_key = (void*)pcb_getpid;
+ pcb_tree = rbtree_insert(pcb_tree, &pcb_header->tree_node);
+
+ pcb_header->state = PCB_STATE_EMBRYO;
+ pcb_header->ksp = (void*)pcb_obj + size - sizeof(uintmax_t);
+ return _pcb_new_arch((pcb_t*)pcb_header);
+}
+
+pcb_t *pcb_frompid(pid_t pid)
+{
+ return (pcb_t*)rbtree_search((struct rbtree_node*)pcb_tree, pid);
+}
jove_owned_obj_t*
process_current(void)
{
- return processor_pcb(((processor_t*)processor_current()));
+ return processor_getpcb(((processor_t*)processor_current()));
}
pid_t
pcb_getpid(pcb_t *pcb)
{
- return ((struct pcb_expected_header*)pcb)->pid;
+ return ((struct pcb_header*)pcb)->pid;
}
jove_obj_t*
pcb_getrootdir(pcb_t *pcb)
{
- return ((struct pcb_expected_header*)pcb)->rootdir;
+ return ((struct pcb_header*)pcb)->rootdir;
}
-jove_obj_t*
-pcb_getpagedir(pcb_t *pcb)
+jove_owned_obj_t*
+pcb_getpagedir(jove_owned_obj_t *rootdir_obj)
+{
+ return objdir_getlocal(rootdir_obj, PCB_ROOTDIR_PAGEDIR_I);
+}
+
+jove_owned_obj_t*
+pcb_getself(jove_owned_obj_t *rootdir_obj)
{
- return ((struct pcb_expected_header*)pcb)->pagedir;
+ return objdir_getlocal(rootdir_obj, PCB_ROOTDIR_SELF_I);
}
enum pcb_state
pcb_getstate(pcb_t *pcb)
{
- return ((struct pcb_expected_header*)pcb)->state;
+ return ((struct pcb_header*)pcb)->state;
}
intmax_t
pcb_getstatecode(pcb_t *pcb)
{
- return ((struct pcb_expected_header*)pcb)->state_code;
+ return ((struct pcb_header*)pcb)->state_code;
+}
+
+void*
+pcb_getksp(pcb_t *pcb)
+{
+ return ((struct pcb_header*)pcb)->ksp;
+}
+
+void**
+pcb_getksp_ref(pcb_t *pcb)
+{
+ return &((struct pcb_header*)pcb)->ksp;
}