summaryrefslogtreecommitdiffstats
path: root/proc
diff options
context:
space:
mode:
Diffstat (limited to 'proc')
-rw-r--r--proc/init.c34
-rw-r--r--proc/init.h14
-rw-r--r--proc/process.c16
-rw-r--r--proc/process.h27
4 files changed, 80 insertions, 11 deletions
diff --git a/proc/init.c b/proc/init.c
new file mode 100644
index 0000000..65299f4
--- /dev/null
+++ b/proc/init.c
@@ -0,0 +1,34 @@
+#include "init.h"
+#include "hal/memory.h"
+#include "panic/panic.h"
+
+objpath_part_t s_last_untyped = JOVE_OBJDIR_ENTRIES-1;
+
+jove_owned_obj_t
+init_pop_alloc(void)
+{
+ jove_owned_obj_t *untyped_dir = objdir_trygetlocal(_rootdir_obj, ROOTDIR_UNTYPED_I);
+ if(untyped_dir == 0) {
+ kpanic("Untyped directory is locked!\n");
+ }
+ int cycles = 0;
+
+ while(cycles++ < 512) {
+ if(objdir_peeklocal(untyped_dir, s_last_untyped).type != JOVE_OBJ_UNTYPED) {
+ s_last_untyped--;
+ continue;
+ }
+
+ jove_owned_obj_t frame = { 0 };
+ jove_owned_obj_t *untyped = objdir_getlocal(untyped_dir, s_last_untyped);
+
+ if(untyped_split(untyped, &frame, 0x1000) < 0) {
+ kpanic("%s: Failed to split last untyped.\n", __func__);
+ }
+
+ obj_release(untyped);
+ obj_release(untyped_dir);
+ return frame;
+ }
+ kpanic("%s: Kernel is out of memory!\n", __func__);
+}
diff --git a/proc/init.h b/proc/init.h
new file mode 100644
index 0000000..910e2c9
--- /dev/null
+++ b/proc/init.h
@@ -0,0 +1,14 @@
+#ifndef _JOVE_INIT_H
+#define _JOVE_INIT_H 1
+
+#include "api/init.h"
+#include "hal/obj.h"
+
+extern void *_rootdir_obj;
+extern struct init_payload _init_payload;
+
+void init_setup(void);
+
+jove_owned_obj_t init_pop_alloc(void);
+
+#endif
diff --git a/proc/process.c b/proc/process.c
index 55737f6..e811cb6 100644
--- a/proc/process.c
+++ b/proc/process.c
@@ -14,13 +14,25 @@ pcb_getpid(pcb_t *pcb)
}
jove_obj_t*
-pcb_rootdir(pcb_t *pcb)
+pcb_getrootdir(pcb_t *pcb)
{
return ((struct pcb_expected_header*)pcb)->rootdir;
}
jove_obj_t*
-pcb_pagedir(pcb_t *pcb)
+pcb_getpagedir(pcb_t *pcb)
{
return ((struct pcb_expected_header*)pcb)->pagedir;
}
+
+enum pcb_state
+pcb_getstate(pcb_t *pcb)
+{
+ return ((struct pcb_expected_header*)pcb)->state;
+}
+
+intmax_t
+pcb_getstatecode(pcb_t *pcb)
+{
+ return ((struct pcb_expected_header*)pcb)->state_code;
+}
diff --git a/proc/process.h b/proc/process.h
index 2757f6f..ed40a4f 100644
--- a/proc/process.h
+++ b/proc/process.h
@@ -3,12 +3,16 @@
#include "hal/obj.h"
#include "lib/rbtree.h"
-
-typedef uintmax_t pid_t;
+#include "api/process.h"
enum pcb_state
{
- PCB_DEAD, PCB_READY, PCB_RUNNING, PCB_BLOCKED
+ _PCB_STATE_INVALID = 0,
+ PCB_STATE_DEAD,
+ PCB_STATE_READY,
+ PCB_STATE_RUNNING,
+ PCB_STATE_WAITING,
+ PCB_STATE_BLOCKED_MAIL
};
struct pcb_mailbox
@@ -20,11 +24,16 @@ struct pcb_mailbox
struct pcb_expected_header
{
struct rbtree_node tree_node;
- struct process_control_block *sched_next;
+ struct pcb_expected_header *sched_next;
pid_t pid;
jove_obj_t *rootdir;
jove_obj_t *pagedir;
+
+ enum pcb_state state;
+ intmax_t state_code;
+
+ struct pcb_mailbox send, recv;
};
typedef struct process_control_block pcb_t;
@@ -32,12 +41,12 @@ typedef struct process_control_block pcb_t;
jove_owned_obj_t *process_current(void);
void pcb_new(pcb_t *pcb);
-/*Returns the process ID of the passed PCB. */
-pid_t pcb_getpid(pcb_t *pcb);
-/*Returns the root kernel object directory of this PCB. */
-jove_obj_t *pcb_rootdir(pcb_t *pcb);
-jove_obj_t *pcb_pagedir(pcb_t *pcb);
+pid_t pcb_getpid(pcb_t *pcb);
+jove_obj_t *pcb_getrootdir(pcb_t *pcb);
+jove_obj_t *pcb_getpagedir(pcb_t *pcb);
+enum pcb_state pcb_getstate(pcb_t *pcb);
+intmax_t pcb_getstatecode(pcb_t *pcb);
extern pcb_t *pcb_tree;