#pragma once #include "types.h" namespace Syscall { /*! \brief Syscall IDs * \note the syscall number must correspond to the values in the syscall stub! */ enum class ID : size_t { TEST = 0, WRITE = 1, READ = 2, SLEEP = 3, SEM_INIT=4, SEM_DESTROY=5, SEM_WAIT=6, SEM_SIGNAL=7, SYS_GETPID = 8, SYS_EXIT = 9, SYS_KILL = 10 }; } // namespace Syscall /// \brief Syscall stub extern "C" ssize_t sys_call(Syscall::ID id, size_t p1, size_t p2, size_t p3, size_t p4, size_t p5); extern "C" ssize_t sys_safe_call(Syscall::ID id, size_t p1, size_t p2, size_t p3, size_t p4, size_t p5); // Interrupt based syscalls [[gnu::always_inline]] static inline ssize_t sys_test(size_t p1, size_t p2, size_t p3, size_t p4, size_t p5) { return sys_call(Syscall::ID::TEST, p1, p2, p3, p4, p5); } [[gnu::always_inline]] static inline int write(int fd, const void *buf, size_t len, int x = -1, int y = -1) { return sys_call(Syscall::ID::WRITE, fd, (size_t)buf, len, x, y); } [[gnu::always_inline]] static inline int read(int fd, void *buf, size_t len){ return sys_call(Syscall::ID::READ, fd, (size_t)buf, len, 0, 0); } [[gnu::always_inline]] static inline int sleep(size_t ms){ return sys_call(Syscall::ID::SLEEP, ms,0,0,0,0); } [[gnu::always_inline]] static inline int sem_init(int fd, int semid, int value) { return sys_call(Syscall::ID::SEM_INIT, fd, semid, value, 0,0); } [[gnu::always_inline]] static inline int sem_destroy(int fd, int semid) { return sys_call(Syscall::ID::SEM_DESTROY, fd, semid,0,0,0); } [[gnu::always_inline]] static inline int sem_wait(int fd, int semid) { return sys_call(Syscall::ID::SEM_WAIT, fd, semid,0,0,0); } [[gnu::always_inline]] static inline int sem_signal(int fd, int semid) { return sys_call(Syscall::ID::SEM_SIGNAL, fd, semid,0,0,0); } [[gnu::always_inline]] static inline int sys_getpid(){ return sys_call(Syscall::ID::SYS_GETPID, 0,0,0,0,0); } [[gnu::always_inline]] static inline void sys_exit(){ sys_call(Syscall::ID::SYS_EXIT, 0, 0, 0, 0, 0); } [[gnu::always_inline]] static inline void sys_kill(size_t pid){ sys_call(Syscall::ID::SYS_KILL, pid, 0, 0, 0, 0); }