summaryrefslogtreecommitdiffstats
path: root/arch/x86_64/proc
diff options
context:
space:
mode:
authorJon Santmyer <jon@jonsantmyer.com>2026-10-09 10:24:41 -0400
committerJon Santmyer <jon@jonsantmyer.com>2026-10-09 10:24:41 -0400
commitcc23ea5a4b38807e79aceb23e6f43e965926618f (patch)
tree90142bb44186f4dad7bbd82d3d53655b835c822b /arch/x86_64/proc
parent434ddcd907832b1febc7d70e4faa52109c7eb3bd (diff)
downloadjove-kernel-cc23ea5a4b38807e79aceb23e6f43e965926618f.tar.gz
jove-kernel-cc23ea5a4b38807e79aceb23e6f43e965926618f.tar.bz2
jove-kernel-cc23ea5a4b38807e79aceb23e6f43e965926618f.zip
add basic scheduler logic. rename init rootdir indexes
Diffstat (limited to 'arch/x86_64/proc')
-rw-r--r--arch/x86_64/proc/init.c13
-rw-r--r--arch/x86_64/proc/process.c52
-rw-r--r--arch/x86_64/proc/process.h7
-rw-r--r--arch/x86_64/proc/scheduler.c20
-rw-r--r--arch/x86_64/proc/switch.s9
5 files changed, 53 insertions, 48 deletions
diff --git a/arch/x86_64/proc/init.c b/arch/x86_64/proc/init.c
index 3787c7b..155cff6 100644
--- a/arch/x86_64/proc/init.c
+++ b/arch/x86_64/proc/init.c
@@ -5,6 +5,7 @@
#include "jove.h"
#include "hal/obj.h"
#include "lib/string.h"
+#include "sys/objdir.h"
#include "panic/panic.h"
#include "lib/printf.h"
#include "arch/x86_64/lib/elf.h"
@@ -50,7 +51,7 @@ init_setup(void)
kpanic("Kernel commandline is missing 'init' arg.\n");
}
- jove_owned_obj_t *initrd_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_INITRD_I);
+ jove_owned_obj_t *initrd_obj = objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_INITRD_I);
jove_owned_obj_t *init_obj = initrd_seek(initrd_obj, init_path);
if(init_obj == NULL) {
kpanic("init: Cannot find file '%s' in initrd.\n", init_path);
@@ -69,7 +70,7 @@ init_setup(void)
kpanic("init: Either passed file '%s' is not an ELF file or is not loadable.\n", init_path);
}
- jove_owned_obj_t *init_pagedir = objdir_getlocal(_rootdir_obj, ROOTDIR_PAGEDIR_I);
+ jove_owned_obj_t *init_pagedir = objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_PAGEDIR_I);
page_t *pml4 = obj_deref(init_pagedir);
size_t last_base = 0;
@@ -133,7 +134,7 @@ init_setup(void)
memcpy((void*)last_base, &_init_payload, sizeof(struct init_payload));
- jove_owned_obj_t *message_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_MESSAGE_I);
+ jove_owned_obj_t *message_obj = objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_MESSAGE_I);
obj_settype(message_obj, JOVE_OBJ_MESSAGE);
obj_setvalue(message_obj, last_base | 1);
obj_release(message_obj);
@@ -144,13 +145,9 @@ init_setup(void)
extern void _syscall_entry(void);
msr_set_lstar(_syscall_entry);
- //Setup KSP for syscalls
- jove_owned_obj_t *pcb_obj = process_current();
- pcb_t *pcb = obj_deref(pcb_obj);
-
- obj_release(pcb_obj);
obj_release(_rootdir_obj);
+ //Setup KSP for syscalls
uintptr_t usp = 0x00007FFFFFFFFFF8;
uintptr_t uip = init_ehdr->e_entry;
diff --git a/arch/x86_64/proc/process.c b/arch/x86_64/proc/process.c
index d5513bc..5935303 100644
--- a/arch/x86_64/proc/process.c
+++ b/arch/x86_64/proc/process.c
@@ -1,4 +1,5 @@
#include "process.h"
+#include "hal/memory.h"
#include "proc/process.h"
#include "arch/x86_64/hal/obj.h"
#include "arch/x86_64/hal/smp.h"
@@ -8,51 +9,34 @@
#include "lib/string.h"
#include "proc/init.h"
#include "jove.h"
+#include "proc/scheduler.h"
PAGEALIGN uint8_t s_init_iopb[0x2000];
PAGEALIGN char _init_pcb_bytes[0x1000] = { 0 };
-pcb_t *pcb_tree;
+
+int
+_pcb_new_arch(pcb_t *pcb)
+{
+ return 0;
+}
void
processing_setup(void (*process_main))
{
- pcb_t *init_pcb = (pcb_t*)&_init_pcb_bytes;
- pcb_tree = init_pcb;
-
- memset(s_init_iopb, 0xFF, 0x2000);
- uintptr_t ksp = ((uintptr_t)&_init_pcb_bytes) + 0xFF8;
-
- init_pcb->header.tree_node.get_key = (void*)pcb_getpid;
- init_pcb->header.tree_node.color = 1;
- init_pcb->header.rootdir = _rootdir_obj;
- init_pcb->header.pagedir = obj_release(objdir_getlocal(_rootdir_obj, ROOTDIR_PAGEDIR_I));
+ jove_owned_obj_t *init_pcb_obj = objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_PCB_I);
+ obj_settype(init_pcb_obj, JOVE_OBJ_PCB);
+ obj_setvalue(init_pcb_obj, phys_fromvirt((uintptr_t)&_init_pcb_bytes));
+
+ pcb_new(init_pcb_obj, sizeof(_init_pcb_bytes), _rootdir_obj);
- init_pcb->header.pid = 1;
- init_pcb->header.state = PCB_STATE_RUNNING;
-
- init_pcb->ksp = (void*)ksp;
-
- jove_owned_obj_t *iopb_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_IOPB_I);
+ jove_owned_obj_t *iopb_obj = objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_IOPB_I);
obj_settype(iopb_obj, JOVE_OBJ_IOPB);
obj_setvalue(iopb_obj, (uintptr_t)s_init_iopb);
- init_pcb->iopb = obj_release(iopb_obj);
- processor_t *proc = processor_current();
- proc->tss.rsp[0] = (uintptr_t)init_pcb->ksp;
- memcpy(proc->iopb, s_init_iopb, 0x2000);
-
- {
- jove_owned_obj_t *process_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_PCB_I);
- obj_settype(process_obj, JOVE_OBJ_PCB);
- obj_setvalue(process_obj, (uintptr_t)init_pcb);
+ memset(s_init_iopb, 0xFF, 0x2000);
+ pcb_t *init_pcb = obj_deref(init_pcb_obj);
- proc->pcb_obj = process_obj;
- proc->pcb = init_pcb;
- }
+ init_pcb->iopb = obj_release(iopb_obj);
- __asm__ volatile("\
- movq %0, %%rsp; \
- xorq %%rbp, %%rbp; \
- jmpq %1"::
- "r"(init_pcb->ksp), "r"(process_main));
+ scheduler_init(init_pcb_obj, process_main);
}
diff --git a/arch/x86_64/proc/process.h b/arch/x86_64/proc/process.h
index 6a0aa96..5004b49 100644
--- a/arch/x86_64/proc/process.h
+++ b/arch/x86_64/proc/process.h
@@ -2,19 +2,14 @@
#define _JOVE_x86_64_HAL_PROCESS_H 1
#include "proc/process.h"
-#include "arch/x86_64/x86_64.h"
#include "lib/rbtree.h"
typedef struct process_control_block
{
- struct pcb_expected_header header;
+ struct pcb_header header;
jove_obj_t *iopb;
-
- int killed;
- struct cpu_context context;
- void *ksp;
char kstack[];
} pcb_t;
diff --git a/arch/x86_64/proc/scheduler.c b/arch/x86_64/proc/scheduler.c
new file mode 100644
index 0000000..23e54af
--- /dev/null
+++ b/arch/x86_64/proc/scheduler.c
@@ -0,0 +1,20 @@
+#include "proc/scheduler.h"
+#include "arch/x86_64/hal/gdt.h"
+#include "process.h"
+#include "../hal/smp.h"
+#include <string.h>
+
+void
+_scheduler_switch_pcb_arch(pcb_t *target)
+{
+ processor_t *proc = processor_current();
+ proc->tss.rsp[0] = (uintptr_t)target->header.ksp;
+
+ if(target->iopb) {
+ proc->tss.iopb = sizeof(struct tss);
+ jove_owned_obj_t *iopb_obj = obj_take(target->iopb);
+ memcpy(proc->iopb, obj_deref(iopb_obj), sizeof(proc->iopb));
+ }else{
+ proc->tss.iopb = 0xff;
+ }
+}
diff --git a/arch/x86_64/proc/switch.s b/arch/x86_64/proc/switch.s
new file mode 100644
index 0000000..d571c66
--- /dev/null
+++ b/arch/x86_64/proc/switch.s
@@ -0,0 +1,9 @@
+.global scheduler_switch
+.type scheduler_switch @function
+
+scheduler_switch:
+ movq %rsp, (%rdi)
+ movq %rsi, %rsp
+ retq
+
+.size scheduler_switch, . - scheduler_switch