From 8d48bbd9746228b63bafa5f92b621998d7d8f3d3 Mon Sep 17 00:00:00 2001 From: Jon Santmyer Date: Sun, 4 Oct 2026 10:49:41 -0400 Subject: move init fully to proc. remove init pages prealloc. prepare for scheduling --- proc/init.c | 34 ++++++++++++++++++++++++++++++++++ proc/init.h | 14 ++++++++++++++ proc/process.c | 16 ++++++++++++++-- proc/process.h | 27 ++++++++++++++++++--------- 4 files changed, 80 insertions(+), 11 deletions(-) create mode 100644 proc/init.c create mode 100644 proc/init.h (limited to 'proc') 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; -- cgit v1.2.3