summaryrefslogtreecommitdiffstats
path: root/sys/syscall_pagedir.c
diff options
context:
space:
mode:
authorJon Santmyer <jon@jonsantmyer.com>2026-10-16 16:42:22 -0400
committerJon Santmyer <jon@jonsantmyer.com>2026-10-16 16:42:22 -0400
commitd8aca3ff2501f9a77e22e5afb7a30380aed205af (patch)
treea27db1749a35aea07317406f170a2d9b2a799ce7 /sys/syscall_pagedir.c
parent548506392b789f58b1556a6ffca917441e1d89fd (diff)
downloadjove-kernel-d8aca3ff2501f9a77e22e5afb7a30380aed205af.tar.gz
jove-kernel-d8aca3ff2501f9a77e22e5afb7a30380aed205af.tar.bz2
jove-kernel-d8aca3ff2501f9a77e22e5afb7a30380aed205af.zip
remove explicit framebuffer in kernel. reduce locking in syscalls
Diffstat (limited to 'sys/syscall_pagedir.c')
-rw-r--r--sys/syscall_pagedir.c55
1 files changed, 28 insertions, 27 deletions
diff --git a/sys/syscall_pagedir.c b/sys/syscall_pagedir.c
index 7b8f315..6e773bf 100644
--- a/sys/syscall_pagedir.c
+++ b/sys/syscall_pagedir.c
@@ -5,9 +5,9 @@
#include "syscall.h"
static int
-s_get_untyped(
+s_syscall_pagedir_get_untyped(
lockstack_t *lockstack,
- jove_owned_obj_t *objdir,
+ jove_obj_t *objdir,
jove_owned_obj_t *pml4,
size_t payload_bytes,
void *payload_data,
@@ -20,7 +20,7 @@ s_get_untyped(
struct syscall_pagedir_map *payload = payload_data;
if(payload->virtual_address > 0xFFFF800000000000ULL) {
kprintf("%s: Virtual address is above user limit.\n", __func__);
- return EBADARG;
+ return -EBADARG;
}
bytes_needed += payload->untyped_pathlen << 1;
@@ -28,12 +28,13 @@ s_get_untyped(
"Message too small for untyped path.");
errno = 0;
- jove_perm_obj_t untyped = link_try_traverse_objdir(
- objdir, lockstack, payload->untyped_pathlen, payload->untyped_path);
+ jove_perm_obj_t untyped = link_traverse_objdir(objdir, payload->untyped_pathlen, payload->untyped_path);
+ lockstack_push(lockstack, untyped.obj);
- if(errno) {
- kprintf("%s: Untyped obj failed for the reason: %s\n", __func__, errstr(errno));
- return errno;
+ if(untyped.obj == 0) {
+ klogf("Unable to get untyped object %P : %s\n",
+ payload->untyped_path, payload->untyped_pathlen, errstr(errno));
+ return -errno;
}
CHECK_OBJTYPE(untyped.obj, JOVE_OBJ_UNTYPED,
@@ -45,12 +46,11 @@ s_get_untyped(
if((uintptr_t)untyped_data & 0xFFF) {
kprintf("%s: Untyped object is not page aligned.\n", __func__);
- return EALIGN;
+ return -EALIGN;
}
if(untyped_data->limit != 0x1000) {
- kprintf("%s: Untyped object is not page sized. (expected 0x1000 got 0x%X)\n", __func__,
- untyped_data->limit);
- return EBADSIZE;
+ klogf("Untyped object is not page sized. (%x vs 1000)\n", untyped_data->limit);
+ return -EBADSIZE;
}
*untyped_ret = untyped;
@@ -60,7 +60,7 @@ s_get_untyped(
static int
s_syscall_pagedir_unmap(
lockstack_t *lockstack,
- jove_owned_obj_t *objdir,
+ jove_obj_t *objdir,
jove_owned_obj_t *pagedir,
size_t payload_bytes,
void *payload_data,
@@ -80,8 +80,9 @@ s_syscall_pagedir_unmap(
CHECK_TOOSMALL(bytes_needed, payload_bytes,
"Message too small for none path");
- jove_perm_obj_t none = link_try_traverse_objdir(
- objdir, lockstack, payload->none_pathlen, payload->none_path);
+ jove_perm_obj_t none = link_traverse_objdir(
+ objdir, payload->none_pathlen, payload->none_path);
+ lockstack_push(lockstack, none.obj);
if(errno) {
kprintf("%s: None obj retrieval failed for the reason: %s\n",
@@ -98,13 +99,13 @@ s_syscall_pagedir_unmap(
static int
s_syscall_pagedir_map_frame(
lockstack_t *lockstack,
- jove_owned_obj_t *objdir,
+ jove_obj_t *objdir,
jove_owned_obj_t *pagedir,
size_t payload_bytes,
void *payload_data)
{
jove_perm_obj_t untyped = { .obj = NULL, .permissions = 0 };
- int sysret = s_get_untyped(lockstack, objdir, pagedir, payload_bytes, payload_data, &untyped);
+ int sysret = s_syscall_pagedir_get_untyped(lockstack, objdir, pagedir, payload_bytes, payload_data, &untyped);
if(sysret != 0) {
return sysret;
}
@@ -121,13 +122,13 @@ s_syscall_pagedir_map_frame(
static int
s_syscall_pagedir_map_table(
lockstack_t *lockstack,
- jove_owned_obj_t *objdir,
+ jove_obj_t *objdir,
jove_owned_obj_t *pagedir,
size_t payload_bytes,
void *payload_data)
{
jove_perm_obj_t untyped = { .obj = NULL, .permissions = 0 };
- int sysret = s_get_untyped(lockstack, objdir, pagedir, payload_bytes, payload_data, &untyped);
+ int sysret = s_syscall_pagedir_get_untyped(lockstack, objdir, pagedir, payload_bytes, payload_data, &untyped);
if(sysret != 0) {
return sysret;
}
@@ -144,7 +145,7 @@ s_syscall_pagedir_map_table(
static int
s_syscall_pagedir_map_shmem(
lockstack_t *lockstack,
- jove_owned_obj_t *objdir,
+ jove_obj_t *objdir,
jove_owned_obj_t *pagedir,
size_t payload_bytes,
void *payload_data)
@@ -163,10 +164,10 @@ s_syscall_pagedir_map_shmem(
CHECK_TOOSMALL(bytes_needed, payload_bytes,
"Message too small for shared memory path.");
- errno = 0;
- jove_perm_obj_t shmem = link_try_traverse_objdir(
- objdir, lockstack, payload->shmem_pathlen, payload->shmem_path);
- if(errno) {
+ jove_perm_obj_t shmem = link_traverse_objdir(objdir, payload->shmem_pathlen, payload->shmem_path);
+ lockstack_push(lockstack, shmem.obj);
+
+ if(shmem.obj == NULL) {
klogf("Unable to retrieve shared memory object %P : %s\n",
payload->shmem_path, payload->shmem_pathlen, errstr(errno));
return errno;
@@ -191,7 +192,7 @@ s_syscall_pagedir_map_shmem(
static int
s_syscall_pagedir_unmap_frame(
lockstack_t *lockstack,
- jove_owned_obj_t *objdir,
+ jove_obj_t *objdir,
jove_owned_obj_t *pagedir,
size_t payload_bytes,
void *payload_data)
@@ -208,7 +209,7 @@ s_syscall_pagedir_unmap_frame(
static int
s_syscall_pagedir_unmap_table(
lockstack_t *lockstack,
- jove_owned_obj_t *objdir,
+ jove_obj_t *objdir,
jove_owned_obj_t *pagedir,
size_t payload_bytes,
void *payload_data)
@@ -227,7 +228,7 @@ _syscall_handle_pagedir(syscall_context_t *ctx)
{
lockstack_t *lockstack = &ctx->lockstack;
struct syscall_header *header = ctx->header;
- jove_owned_obj_t *objdir = ctx->objdir;
+ jove_obj_t *objdir = ctx->objdir;
jove_perm_obj_t *target = &ctx->target;
size_t bytes_left = ctx->bytes_left;
void *payload = ctx->payload;