123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- #pragma once
- #include <AK/Types.h>
- #include <LibC/fd_set.h>
- extern "C" {
- struct timeval;
- }
- #define ENUMERATE_SYSCALLS \
- __ENUMERATE_SYSCALL(sleep) \
- __ENUMERATE_SYSCALL(yield) \
- __ENUMERATE_SYSCALL(putch) \
- __ENUMERATE_SYSCALL(open) \
- __ENUMERATE_SYSCALL(close) \
- __ENUMERATE_SYSCALL(read) \
- __ENUMERATE_SYSCALL(lseek) \
- __ENUMERATE_SYSCALL(kill) \
- __ENUMERATE_SYSCALL(getuid) \
- __ENUMERATE_SYSCALL(exit) \
- __ENUMERATE_SYSCALL(getgid) \
- __ENUMERATE_SYSCALL(getpid) \
- __ENUMERATE_SYSCALL(waitpid) \
- __ENUMERATE_SYSCALL(mmap) \
- __ENUMERATE_SYSCALL(munmap) \
- __ENUMERATE_SYSCALL(get_dir_entries) \
- __ENUMERATE_SYSCALL(lstat) \
- __ENUMERATE_SYSCALL(getcwd) \
- __ENUMERATE_SYSCALL(gettimeofday) \
- __ENUMERATE_SYSCALL(gethostname) \
- __ENUMERATE_SYSCALL(chdir) \
- __ENUMERATE_SYSCALL(uname) \
- __ENUMERATE_SYSCALL(set_mmap_name) \
- __ENUMERATE_SYSCALL(readlink) \
- __ENUMERATE_SYSCALL(write) \
- __ENUMERATE_SYSCALL(ttyname_r) \
- __ENUMERATE_SYSCALL(stat) \
- __ENUMERATE_SYSCALL(getsid) \
- __ENUMERATE_SYSCALL(setsid) \
- __ENUMERATE_SYSCALL(getpgid) \
- __ENUMERATE_SYSCALL(setpgid) \
- __ENUMERATE_SYSCALL(getpgrp) \
- __ENUMERATE_SYSCALL(fork) \
- __ENUMERATE_SYSCALL(execve) \
- __ENUMERATE_SYSCALL(geteuid) \
- __ENUMERATE_SYSCALL(getegid) \
- __ENUMERATE_SYSCALL(isatty) \
- __ENUMERATE_SYSCALL(getdtablesize) \
- __ENUMERATE_SYSCALL(dup) \
- __ENUMERATE_SYSCALL(dup2) \
- __ENUMERATE_SYSCALL(sigaction) \
- __ENUMERATE_SYSCALL(getppid) \
- __ENUMERATE_SYSCALL(umask) \
- __ENUMERATE_SYSCALL(getgroups) \
- __ENUMERATE_SYSCALL(setgroups) \
- __ENUMERATE_SYSCALL(sigreturn) \
- __ENUMERATE_SYSCALL(sigprocmask) \
- __ENUMERATE_SYSCALL(sigpending) \
- __ENUMERATE_SYSCALL(pipe) \
- __ENUMERATE_SYSCALL(killpg) \
- __ENUMERATE_SYSCALL(setuid) \
- __ENUMERATE_SYSCALL(setgid) \
- __ENUMERATE_SYSCALL(alarm) \
- __ENUMERATE_SYSCALL(fstat) \
- __ENUMERATE_SYSCALL(access) \
- __ENUMERATE_SYSCALL(fcntl) \
- __ENUMERATE_SYSCALL(ioctl) \
- __ENUMERATE_SYSCALL(mkdir) \
- __ENUMERATE_SYSCALL(times) \
- __ENUMERATE_SYSCALL(utime) \
- __ENUMERATE_SYSCALL(sync) \
- __ENUMERATE_SYSCALL(ptsname_r) \
- __ENUMERATE_SYSCALL(select) \
- __ENUMERATE_SYSCALL(unlink) \
- __ENUMERATE_SYSCALL(poll) \
- __ENUMERATE_SYSCALL(read_tsc) \
- __ENUMERATE_SYSCALL(rmdir) \
- __ENUMERATE_SYSCALL(chmod) \
- __ENUMERATE_SYSCALL(usleep) \
- __ENUMERATE_SYSCALL(socket) \
- __ENUMERATE_SYSCALL(bind) \
- __ENUMERATE_SYSCALL(accept) \
- __ENUMERATE_SYSCALL(listen) \
- __ENUMERATE_SYSCALL(connect) \
- __ENUMERATE_SYSCALL(create_shared_buffer) \
- __ENUMERATE_SYSCALL(share_buffer_with) \
- __ENUMERATE_SYSCALL(get_shared_buffer) \
- __ENUMERATE_SYSCALL(release_shared_buffer) \
- __ENUMERATE_SYSCALL(link) \
- __ENUMERATE_SYSCALL(chown) \
- __ENUMERATE_SYSCALL(fchmod) \
- __ENUMERATE_SYSCALL(symlink) \
- __ENUMERATE_SYSCALL(restore_signal_mask) \
- __ENUMERATE_SYSCALL(get_shared_buffer_size) \
- __ENUMERATE_SYSCALL(seal_shared_buffer) \
- __ENUMERATE_SYSCALL(sendto) \
- __ENUMERATE_SYSCALL(recvfrom) \
- __ENUMERATE_SYSCALL(getsockopt) \
- __ENUMERATE_SYSCALL(setsockopt) \
- __ENUMERATE_SYSCALL(create_thread) \
- __ENUMERATE_SYSCALL(gettid) \
- __ENUMERATE_SYSCALL(donate) \
- __ENUMERATE_SYSCALL(rename) \
- __ENUMERATE_SYSCALL(shm_open) \
- __ENUMERATE_SYSCALL(shm_close) \
- __ENUMERATE_SYSCALL(ftruncate) \
- __ENUMERATE_SYSCALL(systrace) \
- __ENUMERATE_SYSCALL(exit_thread) \
- __ENUMERATE_SYSCALL(mknod) \
- __ENUMERATE_SYSCALL(writev) \
- __ENUMERATE_SYSCALL(beep) \
- __ENUMERATE_SYSCALL(getsockname) \
- __ENUMERATE_SYSCALL(getpeername) \
- __ENUMERATE_SYSCALL(sched_setparam) \
- __ENUMERATE_SYSCALL(sched_getparam) \
- __ENUMERATE_SYSCALL(fchown) \
- __ENUMERATE_SYSCALL(halt) \
- __ENUMERATE_SYSCALL(reboot)
- namespace Syscall {
- enum Function {
- #undef __ENUMERATE_SYSCALL
- #define __ENUMERATE_SYSCALL(x) SC_##x,
- ENUMERATE_SYSCALLS
- #undef __ENUMERATE_SYSCALL
- };
- inline constexpr const char* to_string(Function function)
- {
- switch (function) {
- #undef __ENUMERATE_SYSCALL
- #define __ENUMERATE_SYSCALL(x) \
- case SC_##x: \
- return #x;
- ENUMERATE_SYSCALLS
- #undef __ENUMERATE_SYSCALL
- }
- return "Unknown";
- }
- #ifdef __serenity__
- struct SC_mmap_params {
- uint32_t addr;
- uint32_t size;
- int32_t prot;
- int32_t flags;
- int32_t fd;
- int32_t offset; // FIXME: 64-bit off_t?
- const char* name { nullptr };
- };
- struct SC_open_params {
- const char* path;
- int path_length;
- int options;
- u16 mode;
- };
- struct SC_select_params {
- int nfds;
- fd_set* readfds;
- fd_set* writefds;
- fd_set* exceptfds;
- struct timeval* timeout;
- };
- struct SC_sendto_params {
- int sockfd;
- const void* data;
- size_t data_length;
- int flags;
- const void* addr; // const sockaddr*
- size_t addr_length; // socklen_t
- };
- struct SC_recvfrom_params {
- int sockfd;
- void* buffer;
- size_t buffer_length;
- int flags;
- void* addr; // sockaddr*
- void* addr_length; // socklen_t*
- };
- struct SC_getsockopt_params {
- int sockfd;
- int level;
- int option;
- void* value;
- void* value_size; // socklen_t*
- };
- struct SC_setsockopt_params {
- int sockfd;
- int level;
- int option;
- const void* value;
- size_t value_size; // socklen_t
- };
- void initialize();
- int sync();
- inline u32 invoke(Function function)
- {
- u32 result;
- asm volatile("int $0x82"
- : "=a"(result)
- : "a"(function)
- : "memory");
- return result;
- }
- template<typename T1>
- inline u32 invoke(Function function, T1 arg1)
- {
- u32 result;
- asm volatile("int $0x82"
- : "=a"(result)
- : "a"(function), "d"((u32)arg1)
- : "memory");
- return result;
- }
- template<typename T1, typename T2>
- inline u32 invoke(Function function, T1 arg1, T2 arg2)
- {
- u32 result;
- asm volatile("int $0x82"
- : "=a"(result)
- : "a"(function), "d"((u32)arg1), "c"((u32)arg2)
- : "memory");
- return result;
- }
- template<typename T1, typename T2, typename T3>
- inline u32 invoke(Function function, T1 arg1, T2 arg2, T3 arg3)
- {
- u32 result;
- asm volatile("int $0x82"
- : "=a"(result)
- : "a"(function), "d"((u32)arg1), "c"((u32)arg2), "b"((u32)arg3)
- : "memory");
- return result;
- }
- #endif
- }
- #undef __ENUMERATE_SYSCALL
- #define __ENUMERATE_SYSCALL(x) using Syscall::SC_##x;
- ENUMERATE_SYSCALLS
- #undef __ENUMERATE_SYSCALL
- #define syscall Syscall::invoke
|