summaryrefslogtreecommitdiffstats
path: root/syscall/handler.c
diff options
context:
space:
mode:
authorJon Santmyer <jon@jonsantmyer.com>2025-09-04 12:01:44 -0400
committerJon Santmyer <jon@jonsantmyer.com>2025-09-04 12:01:44 -0400
commit032a7bc4d79efea100a00cf3464bea3249a07ff6 (patch)
treedab1be8053ac540e4163ffbff850fefa4f22171f /syscall/handler.c
parentd26eb8b54969e79d933a8e20f2725343cd42deab (diff)
downloadjove-kernel-032a7bc4d79efea100a00cf3464bea3249a07ff6.tar.gz
jove-kernel-032a7bc4d79efea100a00cf3464bea3249a07ff6.tar.bz2
jove-kernel-032a7bc4d79efea100a00cf3464bea3249a07ff6.zip
syscall message unmaps upon invokemain
Diffstat (limited to 'syscall/handler.c')
-rw-r--r--syscall/handler.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/syscall/handler.c b/syscall/handler.c
index b3eea99..a586a73 100644
--- a/syscall/handler.c
+++ b/syscall/handler.c
@@ -60,21 +60,32 @@ _syscall_handler(uintmax_t argsi, int calli)
return -KE_BADMSG;
}
mtx_acquire(&payload_entry->lock);
- uint8_t *payload = ko_entry_data(payload_entry);
+
+ uint8_t *payload;
+ int result = 0;
+
+ if(ko_message_unmap(payload_entry, (uintptr_t*)&payload)) {
+ klogf("Failed to unmap message %p\n", payload_entry);
+ result = KE_BADMSG;
+ goto handle_end;
+ }
switch(calli) {
case SYSCALL_INVOKE: {
- int e = s_syscall_handle_invoke(root_dir, payload);
- mtx_release(&payload_entry->lock);
- return e;
+ result = s_syscall_handle_invoke(root_dir, payload);
+ goto handle_end;
}
case SYSCALL_DEBUG_PUTC:
kprintf("%c", (char)payload[0]);
- mtx_release(&payload_entry->lock);
- return 0;
+ goto handle_end;
default:
klogf("Invalid syscall %i caught! Failing.\n", calli);
- mtx_release(&payload_entry->lock);
- return -KE_BADCALL;
+ result = KE_BADCALL;
+ goto handle_end;
}
+
+handle_end:
+ ko_message_remap(payload_entry);
+ mtx_release(&payload_entry->lock);
+ return result;
}