sys_stubs.S (1933B)
1 /* Linux riscv64 syscall stubs matching the sys_* labels libp1pp 2 * provides (see P1/P1pp.P1pp). boot2-syscall.c declares them as 3 * extern long sys_<name>(...) and the mes-libc layers (read/write/ 4 * open/close/lseek/sbrk/unlink/_exit) call them. The cc.scm + libp1pp 5 * pipeline resolves these labels against P1pp.P1pp's wrappers; the 6 * tcc-libc suite links against this object instead since tcc-built 7 * binaries don't catm libp1pp. 8 * 9 * Linux riscv64 syscall ABI: nr in a7, args in a0-a5, return in a0. 10 * Same generic-unistd numbering as aarch64. 11 * 12 * sys_open/sys_unlink shuffle args because Linux's openat/unlinkat 13 * take an AT_FDCWD prefix that the libp1pp-compatible wrappers 14 * don't surface to callers. 15 * 16 * tcc 0.9.26's riscv64-asm.c lacks the GAS `ret` / `j` pseudos, so 17 * callsites use the canonical `jalr zero, ra, 0` / `jal zero, label` 18 * forms — both assemblers accept them. */ 19 20 .globl sys_read, sys_write, sys_close, sys_open 21 .globl sys_lseek, sys_brk, sys_unlink, sys_exit 22 23 sys_read: 24 li a7, 63 25 ecall 26 jalr zero, ra, 0 27 28 sys_write: 29 li a7, 64 30 ecall 31 jalr zero, ra, 0 32 33 sys_close: 34 li a7, 57 35 ecall 36 jalr zero, ra, 0 37 38 sys_open: 39 /* (path, flags, mode) -> openat(AT_FDCWD, path, flags, mode) */ 40 mv a3, a2 /* mode */ 41 mv a2, a1 /* flags */ 42 mv a1, a0 /* path */ 43 li a0, -100 /* AT_FDCWD */ 44 li a7, 56 45 ecall 46 jalr zero, ra, 0 47 48 sys_lseek: 49 li a7, 62 50 ecall 51 jalr zero, ra, 0 52 53 sys_brk: 54 li a7, 214 55 ecall 56 jalr zero, ra, 0 57 58 sys_unlink: 59 /* (path) -> unlinkat(AT_FDCWD, path, 0) */ 60 mv a1, a0 /* path */ 61 li a0, -100 /* AT_FDCWD */ 62 li a2, 0 /* flags */ 63 li a7, 35 64 ecall 65 jalr zero, ra, 0 66 67 sys_exit: 68 li a7, 93 69 ecall 70 /* unreachable */ 71 sys_exit_spin: 72 jal zero, sys_exit_spin