summaryrefslogtreecommitdiffstats
path: root/arch/x86_64/syscall.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/syscall.c')
-rw-r--r--arch/x86_64/syscall.c32
1 files changed, 31 insertions, 1 deletions
diff --git a/arch/x86_64/syscall.c b/arch/x86_64/syscall.c
index a563525..5582336 100644
--- a/arch/x86_64/syscall.c
+++ b/arch/x86_64/syscall.c
@@ -1,6 +1,36 @@
#include "arch/x86_64/processor.h"
+#include "syscall/handles.h"
+#include "print.h"
+#include "lock.h"
+#include "error.h"
#include <stddef.h>
-
+
+static inline int
+s_invoke_release(
+ objdir_t *root_dir,
+ objdir_entry_t *target,
+ uint8_t *payload,
+ size_t payload_at,
+ int (*invoke)(objdir_t*, objdir_entry_t*, uint8_t*, size_t))
+{
+ int e = invoke(root_dir, target, payload, payload_at);
+ mtx_release(&target->lock);
+ return e;
+}
+
+int
+_syscall_handler_arch(objdir_t *root_dir, objdir_entry_t *target, uint8_t *payload, size_t payload_at)
+{
+ switch(target->type) {
+ case KO_MEMORY_MAPPING:
+ return s_invoke_release(root_dir, target, payload, payload_at, syscall_handle_invoke_mapping);
+ default:
+ klogf("Missing implementation of invoke for type %i\n", target->type);
+ mtx_release(&target->lock);
+ return -KE_BADTYPE;
+ }
+}
+
__attribute__((naked))
void _syscall_entry(void)
{