#if defined(__mips__) #include "../int.h" void exit(int8_t status){ asm ( "move $a0, %0\n" "li $v0, 4001\n" "syscall\n" : : "r" (status) : "a0", "v0" ); for(;;); } intptr_t write(int32_t fd, const void* buf, intptr_t size){ intptr_t n_written = 0; asm volatile ( "move $a0, %1\n" "move $a1, %2\n" "move $a2, %3\n" "li $v0, 4004\n" "syscall\n" "move %0, $v0\n" : "=r"(n_written) : "r"(fd), "r"(buf), "r"(size) : "a0", "a1", "a2", "v0" //TODO: temp registers clobbered by syscall should probably also be listed but this fn returns right away so it should be fine? ); return n_written; } intptr_t read(int32_t fd, const void* buf, intptr_t size){ intptr_t n_read = 0; asm volatile ( "move $a0, %1\n" "move $a1, %2\n" "move $a2, %3\n" "li $v0, 4003\n" "syscall\n" "move %0, $v0\n" : "=r"(n_read) : "r"(fd), "r"(buf), "r"(size) : "a0", "a1", "a2", "v0", "memory" //TODO: temp registers clobbered by syscall should probably also be listed but this fn returns right away so it should be fine? ); return n_read; } uint32_t fork(){ int rtn; asm ( "li $v0, 4002\n" "syscall\n" "move %0, $v0" :"=r" (rtn) : : "a0", "v0" ); return (uint32_t)rtn; } int32_t openat(int32_t fd, const char* filename, uint32_t flags, uint32_t mode) { int32_t file = 0; asm volatile ( "move $a0, %1\n" "move $a1, %2\n" "move $a2, %3\n" "move $a3, %4\n" "li $v0, 4288\n" "syscall\n" "move %0, $v0\n" : "=r"(file) : "r"(fd), "r"(filename), "r"(flags), "r"(mode) : "a0", "a1", "a2", "a3", "v0" ); /* asm volatile ( "move $a0, %1\n" "move $a1, %2\n" "move $a2, %3\n" "li $v0, 4005\n" "syscall\n" "move %0, $v0\n" : "=r"(file) : "r"(filename), "r"(flags), "r"(mode) : "a0", "a1", "a2", "a3", "v0" ); */ return file; } #endif