#include #if defined(__x86_64__) #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", "memory" ); 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; } #endif /* ifdef __x86_64__ */