#include "arch/x86_64/processor.h" #include "syscall/handles.h" #include "print.h" #include "lock.h" #include "error.h" #include 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) { __asm__ volatile(" \ pushq %%r11; \ pushq %%rcx; \ swapgs; \ movq %%gs:%c[tcb], %%rax; \ movq %%rsp, %c[sp](%%rax); \ movq %c[ksp](%%rax), %%rsp; \ pushq %c[sp](%%rax); \ callq _syscall_handler; \ swapgs; \ popq %%rsp; \ popq %%rcx; \ popq %%r11; \ sysretq;" :: [tcb] "i"(offsetof(processor_t, tcb)), [sp] "i"(offsetof(tcb_t, sp)), [ksp] "i"(offsetof(tcb_t, ksp))); }