#if defined(__x86_64__) #include "../int.h" #define SYS_EXIT 60 void exit(int8_t status) { asm volatile( "syscall" : : "a"(SYS_EXIT), "D"(status) : ); for(;;); } #define SYS_WRITE 1 intptr_t write(int32_t fd, const void* buf, intptr_t size) { intptr_t n_written = 0; asm volatile ( "syscall\n" "movq %0, %%rax\n" : "=r"(n_written) : "a"(SYS_WRITE), "D"(fd), "S"(buf), "d"(size) // RDI, RSI, RDX are used in x86-64 for write args : "rcx", "r11" ); return n_written; } #define SYS_READ 0 intptr_t read(int32_t fd, const void* buf, intptr_t size) { intptr_t n_read = 0; asm volatile ( "syscall\n" "movq %0, %%rax\n" : "=r"(n_read) : "a"(SYS_READ), "D"(fd), "S"(buf), "d"(size) // RDI, RSI, RDX are used in x86-64 for write args : "rcx", "r11", "memory" ); return n_read; } #define SYS_FORK 57 uint32_t fork() { uint64_t rtn; asm volatile( "syscall\n" // syscall "movq %0, %%rax\n" // save return value : "=r"(rtn) : "a"(SYS_FORK) : ); return (uint32_t)rtn; } #define SYS_OPENAT 257 int32_t openat(int32_t fd, const char* filename, uint32_t flags, uint32_t mode) { int32_t file; asm volatile ( "mov %5, %%r10\n" "syscall\n" : "=a"(file) : "a"(SYS_OPENAT), "D"(fd), "S"(filename), "d"(flags), "r"((uint64_t)mode) // RDI, RSI, RDX are used in x86-64 for write args : "rcx", "r10", "r11" ); return file; } #define SYS_CLOSE 3 int close(unsigned int fd) { int rtn; asm volatile( "syscall" : "=a"(rtn) : "a"(SYS_CLOSE), "D"(fd) : "rcx", "r11" ); return rtn; } #define SYS_FSYNC 74 int fsync(unsigned int fd) { int rtn; asm volatile( "syscall" : "=a"(rtn) : "a"(SYS_FSYNC), "D"(fd) : "rcx", "r11" ); return rtn; } #define SYS_SOCKET 41 int socket(int domain, int type, int protocol) { int32_t fd; asm volatile ( "syscall\n" : "=a"(fd) : "a"(SYS_SOCKET), "D"(domain), "S"(type), "d"(protocol) : "rcx", "r11" ); return fd; } #define SYS_SETSOCKOPT 54 int setsockopt(int fd, int level, int optname, const void* optval, socklen_t optlen) { int rtn; asm volatile( "mov %5, %%r10\n" "mov %6, %%r8\n" "syscall\n" : "=a"(rtn) : "a"(SYS_SETSOCKOPT), "D"(fd), "S"(level), "d"(optname), "r"(optval), "r"((uint64_t)optlen) : "rcx", "r11" ); return rtn; } #define SYS_BIND 49 int bind(int fd, const void* sockaddr, socklen_t addrlen) { int rtn; asm volatile( "syscall\n" : "=a"(rtn) : "a"(SYS_BIND), "D"(fd), "S"(sockaddr), "d"(addrlen) : "rcx", "r11" ); return rtn; } #define SYS_LISTEN 50 int listen(int fd, int backlog) { int rtn; asm volatile( "syscall\n" : "=a"(rtn) : "a"(SYS_LISTEN), "D"(fd), "S"(backlog) : "rcx", "r11" ); return rtn; } #define SYS_ACCEPT 43 int accept(int fd, void* addr, socklen_t* addrlen) { int rtn; asm volatile( "syscall\n" : "=a"(rtn) : "a"(SYS_ACCEPT), "D"(fd), "S"(addr), "d"(addrlen) : "rcx", "r11", "memory" ); return rtn; } #define SYS_CONNECT 42 int connect(int fd, void* addr, socklen_t addrlen) { int rtn; asm volatile( "syscall\n" : "=a"(rtn) : "a"(SYS_CONNECT), "D"(fd), "S"(addr), "d"(addrlen) : "rcx", "r11" ); return rtn; } #define SYS_SENDTO 44 ssize_t sendto(int fd, const void* buf, size_t size, int flags, const void* sockaddr, socklen_t addrlen) { ssize_t nsent; asm volatile( "mov %5, %%r10\n" "mov %6, %%r8\n" "mov %7, %%r9\n" "syscall\n" : "=a"(nsent) : "a"(SYS_SENDTO), "D"(fd), "S"(buf), "d"(size), "r"((int64_t)flags), "r"(sockaddr), "r"((uint64_t)addrlen) : "rcx", "r11" ); return nsent; } #define SYS_RECVFROM 45 ssize_t recvfrom(int fd, const void* buf, size_t size, int flags, const void* sockaddr, socklen_t addrlen) { ssize_t nrecv; asm volatile( "mov %5, %%r10\n" "mov %6, %%r8\n" "mov %7, %%r9\n" "syscall\n" : "=a"(nrecv) : "a"(SYS_RECVFROM), "D"(fd), "S"(buf), "d"(size), "r"((int64_t)flags), "r"(sockaddr), "r"((int64_t)addrlen) : "rcx", "r11", "memory" ); return nrecv; } #endif /* ifdef __x86_64__ */