diff options
Diffstat (limited to 'arch/x86_64/syscall.c')
| -rw-r--r-- | arch/x86_64/syscall.c | 55 |
1 files changed, 0 insertions, 55 deletions
diff --git a/arch/x86_64/syscall.c b/arch/x86_64/syscall.c deleted file mode 100644 index 5582336..0000000 --- a/arch/x86_64/syscall.c +++ /dev/null @@ -1,55 +0,0 @@ -#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) -{ - __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))); -} |
