diff --git a/arch/x86_64.c b/arch/x86_64.c index a04875c..70f2589 100644 --- a/arch/x86_64.c +++ b/arch/x86_64.c @@ -20,7 +20,7 @@ intptr_t write(int32_t fd, const void* buf, intptr_t size) { "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" + : "rcx", "r11" ); return n_written; } @@ -50,4 +50,18 @@ uint32_t 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 %%r10, %5\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; +} + #endif /* ifdef __x86_64__ */ diff --git a/buildtest.c b/buildtest.c index 20e9991..8f0d30e 100644 --- a/buildtest.c +++ b/buildtest.c @@ -32,6 +32,15 @@ int main() { intptr_t n_read = read(STDIO, input_buffer, INPUT_BUFFER_LEN); write(STDIO, input_buffer, n_read); + // Test the open syscall + #if defined(__x86_64__) + int32_t file = open("/proc/version", O_RDONLY); + int i = read(file, input_buffer, INPUT_BUFFER_LEN); + while(i > 0) { + write(STDIO, input_buffer, i); + i = read(file, input_buffer, INPUT_BUFFER_LEN); + } + #endif return 69; } diff --git a/sys.h b/sys.h index c1ebc61..7e8d6ea 100644 --- a/sys.h +++ b/sys.h @@ -8,6 +8,16 @@ void exit(int8_t status); intptr_t write(int32_t fd, const void* buf, intptr_t size); intptr_t read(int32_t fd, const void* buf, intptr_t size); +#define O_RDONLY 00 +#define O_WRONLY 01 +#define O_RDWR 02 +#define AT_FDCWD -100 +int32_t openat(int32_t fd, const char* filename, uint32_t flags, uint32_t mode); +#define open(...) openat(AT_FDCWD, __VA_ARGS__, 0) +//inline int32_t openat(int32_t fd, const char* filename, uint32_t flags) {return openat(fd, filename, flags, 0);} +//inline int32_t open(const char* filename, uint32_t flags, uint32_t mode) {return openat(AT_FDCWD, filename, flags, mode);} +//inline int32_t open(const char* filename, uint32_t flags) {return openat(AT_FDCWD, filename, flags, 0);} + uint32_t fork(); // Provide memset for clang