diff options
| author | Jon Santmyer <jon@jonsantmyer.com> | 2026-10-16 16:42:22 -0400 |
|---|---|---|
| committer | Jon Santmyer <jon@jonsantmyer.com> | 2026-10-16 16:42:22 -0400 |
| commit | d8aca3ff2501f9a77e22e5afb7a30380aed205af (patch) | |
| tree | a27db1749a35aea07317406f170a2d9b2a799ce7 /sys/syscall_pagedir.c | |
| parent | 548506392b789f58b1556a6ffca917441e1d89fd (diff) | |
| download | jove-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.c | 55 |
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; |
