boot2

Playing with the boostrap
git clone https://git.ryansepassi.com/git/boot2.git
Log | Files | Refs | README

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