diff --git a/arch/aarch64.c b/arch/aarch64.c index 4b5d9ba..f90935a 100644 --- a/arch/aarch64.c +++ b/arch/aarch64.c @@ -78,4 +78,25 @@ uint32_t fork(){ return (uint32_t)rtn; } +int32_t openat(int32_t fd, const char* filename, uint32_t flags, uint32_t mode) { + long int rtn; + asm volatile ( + // Assembly Instructions + "mov x8, #56\n" // Syscall number for 'openat' is 56 in AArch64 + "mov x0, %1\n" // dir fd + "mov x1, %2\n" // file path + "mov x2, %3\n" // flags + "mov x3, %4\n" // mode + "svc #0\n" // Make the syscall + "mov %0, x0\n" // save return value + // Output operands + : "=r" (rtn) + // Input operand + : "r" ((int64_t)fd), "r"(filename), "r"((int64_t)flags), "r"((int64_t)mode) + // Clobbered registers + : "x0", "x1", "x2", "x3", "x8" + ); + return (int32_t)rtn; +} + #endif diff --git a/buildtest.c b/buildtest.c index ab2c52f..097309f 100644 --- a/buildtest.c +++ b/buildtest.c @@ -33,14 +33,16 @@ int main() { write(STDIO, input_buffer, n_read); // Test the open syscall - #if defined(__x86_64__) || defined(__mips__) 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); + if (file > 0) { + 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); + } + } else { + write(STDIO, "Could not open /proc/version\n", 29); } - #endif return 69; }