diff options
Diffstat (limited to 'arch/x86_64/syscall.c')
-rw-r--r-- | arch/x86_64/syscall.c | 32 |
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) { |