diff --git a/arch/aarch64.c b/arch/aarch64.c index 21f4b0a..ab1701f 100644 --- a/arch/aarch64.c +++ b/arch/aarch64.c @@ -33,6 +33,26 @@ intptr_t write(int32_t fd, const void* buf, intptr_t size){ return n_written; } +intptr_t read(int32_t fd, const void* buf, intptr_t size){ + intptr_t n_read = 0; + asm volatile( + // Assembly Instructions + "mov x0, %1\n" // Set x0 to value of fd + "mov x1, %2\n" // Set x1 to value of buf + "mov x2, %3\n" // Set x2 to value of size + "mov x8, #63\n" // Syscall number for 'read' is 63 in AArch64 + "svc #0\n" // Make syscall + "mov %0, x0\n" // Store return value in n_read + // Output operands + : "=r"(n_read) + // Input operands + : "r"((int64_t)fd), "r" (buf), "r"(size) + // Clobbered registers + : "x0", "x1", "x2", "x8" + ); + return n_read; +} + #define CLONE_CHILD_SETTID 0x1000000 #define CLONE_CHILD_CLEARTID 0x200000 uint32_t fork(){ diff --git a/buildtest.c b/buildtest.c index 595be89..8553dd8 100644 --- a/buildtest.c +++ b/buildtest.c @@ -25,7 +25,7 @@ int main() { if(pid == 0) return 0; //TODO: wait on child to remove zombie process - #if defined(__x86_64__) + #if defined(__x86_64__) || defined(__aarch64__) // Test the read syscall #define INPUT_BUFFER_LEN 4096 char input_buffer[INPUT_BUFFER_LEN] = {0}; diff --git a/sys.h b/sys.h index b1f632b..151ff79 100644 --- a/sys.h +++ b/sys.h @@ -6,7 +6,7 @@ void exit(int8_t status); #define STDIO 1 #define STDERR 2 intptr_t write(int32_t fd, const void* buf, intptr_t size); -#if defined(__x86_64__) +#if defined(__x86_64__) || defined(__aarch64__) intptr_t read(int32_t fd, const void* buf, intptr_t size); #endif