summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Santmyer <jon@jonsantmyer.com>2026-09-05 11:38:27 -0400
committerJon Santmyer <jon@jonsantmyer.com>2026-09-05 11:38:27 -0400
commit73cbb23130f634bf52ac92da063efd3e6016f8ee (patch)
tree09a15da6495898f72d88e31185dac15f21682a09
parent69a27cf95a8a8e3bbbd5e3d81a36893bf312cf3e (diff)
downloadjove-kernel-73cbb23130f634bf52ac92da063efd3e6016f8ee.tar.gz
jove-kernel-73cbb23130f634bf52ac92da063efd3e6016f8ee.tar.bz2
jove-kernel-73cbb23130f634bf52ac92da063efd3e6016f8ee.zip
make objdir_getlocal return locked object
-rw-r--r--arch/x86_64/hal/obj.c16
-rw-r--r--arch/x86_64/hal/obj.h2
-rw-r--r--arch/x86_64/hal/paging.c2
-rw-r--r--arch/x86_64/hal/process.c2
-rw-r--r--arch/x86_64/hal/serial_com.c2
-rw-r--r--arch/x86_64/hal/smp.c4
-rw-r--r--arch/x86_64/lib/printf.c5
-rw-r--r--arch/x86_64/sys/init.c4
-rw-r--r--arch/x86_64/sys/syscall.c58
-rw-r--r--boot/initrd.c6
-rw-r--r--boot/limine/framebuffer.c2
-rw-r--r--boot/limine/memorymap.c2
-rw-r--r--jove.h1
-rw-r--r--lib/virtterm.c8
14 files changed, 88 insertions, 26 deletions
diff --git a/arch/x86_64/hal/obj.c b/arch/x86_64/hal/obj.c
index 783d2f4..8011347 100644
--- a/arch/x86_64/hal/obj.c
+++ b/arch/x86_64/hal/obj.c
@@ -1,11 +1,15 @@
#include "obj.h"
#include "arch/x86_64/lock.h"
+#include "paging.h"
#include "hal/obj.h"
#include "jove.h"
jove_owned_obj_t*
obj_take(jove_obj_t *obj)
{
+ if((uintptr_t)obj < IDENT_VIRT_BASE) {
+ reterr(EBADOBJ);
+ }
take_mutex(&obj->lock);
return (jove_owned_obj_t*)obj;
}
@@ -13,6 +17,9 @@ obj_take(jove_obj_t *obj)
jove_obj_t*
obj_release(jove_owned_obj_t *obj)
{
+ if((uintptr_t)obj < IDENT_VIRT_BASE) {
+ reterr(EBADOBJ);
+ }
release_mutex((atomic_flag*)&obj->lock);
return (jove_obj_t*)obj;
}
@@ -47,7 +54,7 @@ obj_setvalue(jove_owned_obj_t *obj, uintmax_t value)
obj->value = value & 0x00007FFFFFFFFFFFULL;
}
-jove_obj_t*
+jove_owned_obj_t*
objdir_getlocal(
jove_owned_obj_t *objdir_obj,
uint16_t entry)
@@ -60,7 +67,7 @@ objdir_getlocal(
}
jove_objdir_t *objtab = obj_deref(objdir_obj);
- return &objtab->entries[entry];
+ return obj_take(&objtab->entries[entry]);
}
jove_owned_obj_t*
@@ -73,12 +80,11 @@ objdir_getobj(
return objdir_obj;
}
{
- jove_obj_t *child_locked_objdir = objdir_getlocal(objdir_obj, path[0]);
- if(child_locked_objdir == NULL) {
+ jove_owned_obj_t *child_objdir = objdir_getlocal(objdir_obj, path[0]);
+ if(child_objdir == 0) {
return 0;
}
- jove_owned_obj_t *child_objdir = obj_take(child_locked_objdir);
jove_owned_obj_t *target_obj = objdir_getobj(child_objdir, path + 1, path_len - 1);
obj_release(child_objdir);
return target_obj;
diff --git a/arch/x86_64/hal/obj.h b/arch/x86_64/hal/obj.h
index 9569a8a..f7d7711 100644
--- a/arch/x86_64/hal/obj.h
+++ b/arch/x86_64/hal/obj.h
@@ -63,7 +63,7 @@ void obj_setvalue(jove_owned_obj_t *obj, uintmax_t value);
/*Returns the n'th entry of the object directory passed.
* If the passed object is not an objdir, returns NULL and sets errno to EBADOBJ.
* If the passed entry index is out of bounds, returns NULL and sets errno to EOOB.*/
-jove_obj_t *objdir_getlocal(jove_owned_obj_t *objdir_obj, uint16_t entry);
+jove_owned_obj_t *objdir_getlocal(jove_owned_obj_t *objdir_obj, uint16_t entry);
/*Recursively seeks through an object directory for an object following the passed
* path variable.
diff --git a/arch/x86_64/hal/paging.c b/arch/x86_64/hal/paging.c
index 5887e79..fb6dea7 100644
--- a/arch/x86_64/hal/paging.c
+++ b/arch/x86_64/hal/paging.c
@@ -171,7 +171,7 @@ paging_pml4_init(void)
paging_pml4_switch(kernel_pml4_pptr);
{
- jove_owned_obj_t *pgdir_o = obj_take(objdir_getlocal(_rootdir_obj, ROOTDIR_PAGEDIR_I));
+ jove_owned_obj_t *pgdir_o = objdir_getlocal(_rootdir_obj, ROOTDIR_PAGEDIR_I);
obj_settype(pgdir_o, JOVE_OBJ_PAGEDIR);
obj_setvalue(pgdir_o, kernel_pml4_pptr);
obj_release(pgdir_o);
diff --git a/arch/x86_64/hal/process.c b/arch/x86_64/hal/process.c
index fb295c0..5c91238 100644
--- a/arch/x86_64/hal/process.c
+++ b/arch/x86_64/hal/process.c
@@ -21,7 +21,7 @@ processing_setup(void (*process_main))
proc->tss.rsp[0] = (uintptr_t)s_init_pcb->ksp;
{
- jove_owned_obj_t *process_obj = obj_take(objdir_getlocal(_rootdir_obj, ROOTDIR_PCB_I));
+ 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);
diff --git a/arch/x86_64/hal/serial_com.c b/arch/x86_64/hal/serial_com.c
index 3967cd7..22682fd 100644
--- a/arch/x86_64/hal/serial_com.c
+++ b/arch/x86_64/hal/serial_com.c
@@ -68,7 +68,7 @@ serial_com_init(void)
}
{
- jove_owned_obj_t *com_obj = obj_take(objdir_getlocal(_rootdir_obj, ROOTDIR_SERIAL_COM_I));
+ jove_owned_obj_t *com_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_SERIAL_COM_I);
obj_settype(com_obj, JOVE_OBJ_SERIAL_COM);
obj_setvalue(com_obj, SERIAL_COM1);
obj_release(com_obj);
diff --git a/arch/x86_64/hal/smp.c b/arch/x86_64/hal/smp.c
index 0b1ed9d..e0945c1 100644
--- a/arch/x86_64/hal/smp.c
+++ b/arch/x86_64/hal/smp.c
@@ -43,11 +43,11 @@ smp_init_bsp(void)
kprintf("%p\n", _rootdir_obj);
processor_t *bsp = &s_processors[0];
{
- jove_owned_obj_t *processor_objdir_obj = obj_take(objdir_getlocal(_rootdir_obj, ROOTDIR_PROCESSORS_I));
+ jove_owned_obj_t *processor_objdir_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_PROCESSORS_I);
obj_settype(processor_objdir_obj, JOVE_OBJ_OBJDIR);
obj_setvalue(processor_objdir_obj, (uintptr_t)&s_processor_objdir);
- jove_owned_obj_t *bsp_obj = obj_take(objdir_getlocal(processor_objdir_obj, 0));
+ jove_owned_obj_t *bsp_obj = objdir_getlocal(processor_objdir_obj, 0);
init_processor(bsp, bsp_obj);
obj_release(bsp_obj);
diff --git a/arch/x86_64/lib/printf.c b/arch/x86_64/lib/printf.c
index 42ee568..f60b943 100644
--- a/arch/x86_64/lib/printf.c
+++ b/arch/x86_64/lib/printf.c
@@ -11,13 +11,12 @@ kvprintf(const char *fmt, va_list ap)
int wlen = (r > 256 ? 256 : r);
{
- jove_owned_obj_t *serial_obj = obj_take(objdir_getlocal(_rootdir_obj, ROOTDIR_SERIAL_COM_I));
+ jove_owned_obj_t *serial_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_SERIAL_COM_I);
serial_com_write(serial_obj, buffer, wlen);
obj_release(serial_obj);
- jove_owned_obj_t *vt_obj = obj_take(objdir_getlocal(_rootdir_obj, ROOTDIR_VIRTTERM_I));
+ jove_owned_obj_t *vt_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_VIRTTERM_I);
vt_write(vt_obj, buffer, wlen);
-
obj_release(vt_obj);
}
diff --git a/arch/x86_64/sys/init.c b/arch/x86_64/sys/init.c
index 2bd86d5..26eefde 100644
--- a/arch/x86_64/sys/init.c
+++ b/arch/x86_64/sys/init.c
@@ -77,7 +77,7 @@ init_setup(void)
kpanic("Kernel commandline is missing 'init' arg.\n");
}
- jove_owned_obj_t *initrd_obj = obj_take(objdir_getlocal(_rootdir_obj, ROOTDIR_INITRD_I));
+ jove_owned_obj_t *initrd_obj = objdir_getlocal(_rootdir_obj, 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);
@@ -96,7 +96,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 = obj_take(objdir_getlocal(_rootdir_obj, ROOTDIR_PAGEDIR_I));
+ jove_owned_obj_t *init_pagedir = objdir_getlocal(_rootdir_obj, ROOTDIR_PAGEDIR_I);
page_t *pml4 = obj_deref(init_pagedir);
//Load the init ELF
diff --git a/arch/x86_64/sys/syscall.c b/arch/x86_64/sys/syscall.c
index 8cc58bf..4e95225 100644
--- a/arch/x86_64/sys/syscall.c
+++ b/arch/x86_64/sys/syscall.c
@@ -1,7 +1,63 @@
+#include "arch/x86_64/hal/process.h"
+#include "arch/x86_64/hal/smp.h"
+#include "hal/smp.h"
+#include "jove.h"
+int
+syscall_handler_arch(uint64_t message_path_raw, uint64_t message_pathlen)
+{
+ uint16_t *message_path = (uint16_t*)&message_path_raw;
+ if(message_pathlen > 4) {
+ return EBADPATH;
+ }
+ processor_t *proc = processor_current();
+ jove_owned_obj_t *objdir = obj_take(proc->pcb->rootdir);
+ jove_owned_obj_t *message_obj = objdir_getobj(objdir, message_path, message_pathlen);
+ if(message_obj == 0) {
+ obj_release(objdir);
+ return errno;
+ }
+
+ return 0;
+}
__attribute__((naked))
void _syscall_entry(void)
{
-
+ __asm__ volatile(" \
+ swapgs; \
+ movq %%gs:%c[pcb], %%rax; \
+ movq %%rsp, %%rdx; \
+ movq %c[ksp](%%rax), %%rsp; \
+ pushq %%rdx; \
+ pushq %%r11; \
+ pushq %%rbx; \
+ pushq %%rcx; \
+ pushq %%rbp; \
+ pushq %%r12; \
+ pushq %%r13; \
+ pushq %%r14; \
+ pushq %%r15; \
+ callq syscall_handler_arch; \
+ swapgs; \
+ popq %%r15; \
+ popq %%r14; \
+ popq %%r13; \
+ popq %%r12; \
+ popq %%rbp; \
+ popq %%rcx; \
+ popq %%rbx; \
+ xorq %%rdx, %%rdx; \
+ xorq %%rsi, %%rsi; \
+ xorq %%rdi, %%rdi; \
+ xorq %%r8, %%r8; \
+ xorq %%r9, %%r9; \
+ xorq %%r10, %%r10; \
+ popq %%rcx; \
+ popq %%r11; \
+ popq %%rsp; \
+ sysretq;"
+ ::
+ [pcb] "i"(offsetof(processor_t, pcb)),
+ [ksp] "i"(offsetof(pcb_t, ksp)));
}
diff --git a/boot/initrd.c b/boot/initrd.c
index 7f7a50c..e1a7ec3 100644
--- a/boot/initrd.c
+++ b/boot/initrd.c
@@ -48,7 +48,7 @@ initrd_seek(jove_owned_obj_t *objdir, const char *path)
reterr(EBADOBJ);
}
for(size_t i = 0; i < JOVE_OBJDIR_ENTRIES; i++) {
- jove_owned_obj_t *file_obj = obj_take(objdir_getlocal(objdir, i));
+ jove_owned_obj_t *file_obj = objdir_getlocal(objdir, i);
if(obj_gettype(file_obj) != JOVE_OBJ_INITRD_FILE) {
goto loop_continue;
}
@@ -71,7 +71,7 @@ void initrd_setup(void)
{
kprintf("Loading initrd from bootloader:\n");
{
- jove_owned_obj_t *initrd_objdir_obj = obj_take(objdir_getlocal(_rootdir_obj, ROOTDIR_INITRD_I));
+ jove_owned_obj_t *initrd_objdir_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_INITRD_I);
obj_settype(initrd_objdir_obj, JOVE_OBJ_OBJDIR);
obj_setvalue(initrd_objdir_obj, (uintmax_t)&s_initrd_objdir);
@@ -84,7 +84,7 @@ void initrd_setup(void)
size_t file_size = tar_filesize(header);
kprintf("File: %s, Size: %i\n", tar_filename(header), file_size);
{
- jove_owned_obj_t *initrd_file_obj = obj_take(objdir_getlocal(initrd_objdir_obj, initrd_files++));
+ jove_owned_obj_t *initrd_file_obj = objdir_getlocal(initrd_objdir_obj, initrd_files++);
obj_settype(initrd_file_obj, JOVE_OBJ_INITRD_FILE);
obj_setvalue(initrd_file_obj, (uintmax_t)block);
obj_release(initrd_file_obj);
diff --git a/boot/limine/framebuffer.c b/boot/limine/framebuffer.c
index b4330bb..71d4c48 100644
--- a/boot/limine/framebuffer.c
+++ b/boot/limine/framebuffer.c
@@ -71,7 +71,7 @@ fb_init()
fb->address = fb_virt;
{
- jove_owned_obj_t *fb_obj = obj_take(objdir_getlocal(_rootdir_obj, ROOTDIR_FRAMEBUFFER_I));
+ jove_owned_obj_t *fb_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_FRAMEBUFFER_I);
obj_settype(fb_obj, JOVE_OBJ_FRAMEBUFFER);
obj_setvalue(fb_obj, (uintptr_t)fb);
obj_release(fb_obj);
diff --git a/boot/limine/memorymap.c b/boot/limine/memorymap.c
index 905ff3a..3ee9bdc 100644
--- a/boot/limine/memorymap.c
+++ b/boot/limine/memorymap.c
@@ -27,7 +27,7 @@ void
mem_setup_untyped(void)
{
{
- jove_owned_obj_t *untyped_objdir_obj = obj_take(objdir_getlocal(_rootdir_obj, ROOTDIR_UNTYPED_I));
+ jove_owned_obj_t *untyped_objdir_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_UNTYPED_I);
obj_settype(untyped_objdir_obj, JOVE_OBJ_OBJDIR);
obj_setvalue(untyped_objdir_obj, (uintptr_t)&s_untyped_objdir);
obj_release(untyped_objdir_obj);
diff --git a/jove.h b/jove.h
index 9c21039..05cd5cd 100644
--- a/jove.h
+++ b/jove.h
@@ -16,5 +16,6 @@ extern int errno;
#define EBADOBJ -1
#define EOOB -2
+#define EBADPATH -3
#endif
diff --git a/lib/virtterm.c b/lib/virtterm.c
index fddd4d1..0daa921 100644
--- a/lib/virtterm.c
+++ b/lib/virtterm.c
@@ -63,7 +63,7 @@ vt_write(jove_owned_obj_t *obj, const char *s, size_t n)
}
struct virtterm *vtty = obj_deref(obj);
- jove_owned_obj_t *fb_obj = obj_take(objdir_getlocal(_rootdir_obj, vtty->fb_obj));
+ jove_owned_obj_t *fb_obj = objdir_getlocal(_rootdir_obj, vtty->fb_obj);
if(obj_gettype(fb_obj) != JOVE_OBJ_FRAMEBUFFER) {
obj_release(fb_obj);
reterr(EBADOBJ);
@@ -86,7 +86,7 @@ vt_init()
return;
}
- jove_owned_obj_t *initrd_obj = obj_take(objdir_getlocal(_rootdir_obj, ROOTDIR_INITRD_I));
+ jove_owned_obj_t *initrd_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_INITRD_I);
if(obj_gettype(initrd_obj) != JOVE_OBJ_OBJDIR) {
kprintf("Initrd is not present. VTT is disabled.\n");
obj_release(initrd_obj);
@@ -114,12 +114,12 @@ vt_init()
s_init_vtty.cursor_fg = 0x00FFFFFF;
{
- jove_owned_obj_t *fb_obj = obj_take(objdir_getlocal(_rootdir_obj, ROOTDIR_FRAMEBUFFER_I));
+ jove_owned_obj_t *fb_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_FRAMEBUFFER_I);
s_init_vtty.width = fb_width(fb_obj) / 9;
s_init_vtty.height = fb_height(fb_obj) / s_font->char_height;
obj_release(fb_obj);
- jove_owned_obj_t *vt_obj = obj_take(objdir_getlocal(_rootdir_obj, ROOTDIR_VIRTTERM_I));
+ jove_owned_obj_t *vt_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_VIRTTERM_I);
obj_settype(vt_obj, JOVE_OBJ_VIRTTERM);
obj_setvalue(vt_obj, (uintmax_t)&s_init_vtty);
obj_release(vt_obj);