diff options
Diffstat (limited to 'rtl/linux/riscv32/syscall.inc')
-rw-r--r-- | rtl/linux/riscv32/syscall.inc | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/rtl/linux/riscv32/syscall.inc b/rtl/linux/riscv32/syscall.inc new file mode 100644 index 0000000000..a7ecca5d8c --- /dev/null +++ b/rtl/linux/riscv32/syscall.inc @@ -0,0 +1,141 @@ +{ + This file is part of the Free Pascal run time library. + + Perform syscall with 0..6 arguments. + If syscall return value is negative, negate it, set errno, and return -1. + + Written by Edmund Grimley Evans in 2015 and released into the public domain. +} + +function FpSysCall(sysnr:TSysParam):TSysResult; +assembler; nostackframe; [public,alias:'FPC_SYSCALL0']; +asm + addi x17, sysnr, 0 + scall + bge x10,x0,.Ldone + sw x1, -4(x2) + addi x2, x2, -4 + sub x10, x0, x10 + jal x1, seterrno + addi x2, x2, 4 + lw x1, -4(x2) + addi x10,x0, -1 +.Ldone: +end; + +function FpSysCall(sysnr,param1:TSysParam):TSysResult; +assembler; nostackframe; [public,alias:'FPC_SYSCALL1']; +asm + addi x17, sysnr, 0 + addi x10, x11, 0 + scall + bge x10,x0,.Ldone + sw x1, -4(x2) + addi x2, x2, -4 + sub x10, x0, x10 + jal x1, seterrno + addi x2, x2, 4 + lw x1, -4(x2) + addi x10,x0, -1 +.Ldone: +end; + +function FpSysCall(sysnr,param1,param2:TSysParam):TSysResult; +assembler; nostackframe; [public,alias:'FPC_SYSCALL2']; +asm + addi x17, sysnr, 0 + addi x10, x11, 0 + addi x11, x12, 0 + scall + bge x10,x0,.Ldone + sw x1, -4(x2) + addi x2, x2, -4 + sub x10, x0, x10 + jal x1, seterrno + addi x2, x2, 4 + lw x1, -4(x2) + addi x10,x0, -1 +.Ldone: +end; + +function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; +assembler; nostackframe; [public,alias:'FPC_SYSCALL3']; +asm + addi x17, sysnr, 0 + addi x10, x11, 0 + addi x11, x12, 0 + addi x12, x13, 0 + scall + bge x10,x0,.Ldone + sw x1, -4(x2) + addi x2, x2, -4 + sub x10, x0, x10 + jal x1, seterrno + addi x2, x2, 4 + lw x1, -4(x2) + addi x10,x0, -1 +.Ldone: +end; + +function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; +assembler; nostackframe; [public,alias:'FPC_SYSCALL4']; +asm + addi x17, sysnr, 0 + addi x10, x11, 0 + addi x11, x12, 0 + addi x12, x13, 0 + addi x13, x14, 0 + scall + bge x10,x0,.Ldone + sw x1, -4(x2) + addi x2, x2, -4 + sub x10, x0, x10 + jal x1, seterrno + addi x2, x2, 4 + lw x1, -4(x2) + addi x10,x0, -1 +.Ldone: +end; + +function FpSysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult; +assembler; nostackframe; [public,alias:'FPC_SYSCALL5']; +asm + addi x17, sysnr, 0 + addi x10, x11, 0 + addi x11, x12, 0 + addi x12, x13, 0 + addi x13, x14, 0 + addi x14, x15, 0 + scall + bge x10,x0,.Ldone + sw x1, -4(x2) + addi x2, x2, -4 + sub x10, x0, x10 + jal x1, seterrno + addi x2, x2, 4 + lw x1, -4(x2) + addi x10,x0, -1 +.Ldone: +end; + +function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TSysResult; +assembler; nostackframe; [public,alias:'FPC_SYSCALL6']; +asm + addi x17, sysnr, 0 + addi x10, x11, 0 + addi x11, x12, 0 + addi x12, x13, 0 + addi x13, x14, 0 + addi x14, x15, 0 + addi x15, x16, 0 + scall + bge x10,x0,.Ldone + sw x1, -4(x2) + addi x2, x2, -4 + sub x10, x0, x10 + jal x1, seterrno + addi x2, x2, 4 + lw x1, -4(x2) + addi x10,x0, -1 +.Ldone: +end; |