|
@@ -23,6 +23,199 @@
|
|
*****************************************************************************}
|
|
*****************************************************************************}
|
|
|
|
|
|
{$ifdef FPC_ABI_EABI}
|
|
{$ifdef FPC_ABI_EABI}
|
|
|
|
+
|
|
|
|
+{$ifdef CPUTHUMB}
|
|
|
|
+
|
|
|
|
+function FpSysCall(sysnr:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL0'];
|
|
|
|
+{
|
|
|
|
+ Perform syscall and set errno variable if needed.
|
|
|
|
+}
|
|
|
|
+asm
|
|
|
|
+ push {r7}
|
|
|
|
+ mov r7,r0
|
|
|
|
+ // svc #0x0
|
|
|
|
+ // GNU 2.22 does not like svc #0x0
|
|
|
|
+ .byte 0,0xdf
|
|
|
|
+ mov r1,#126
|
|
|
|
+ cmn r0,r1
|
|
|
|
+ pop {r7}
|
|
|
|
+ bhi .Lnoexit
|
|
|
|
+ mov pc,lr
|
|
|
|
+.Lnoexit:
|
|
|
|
+ push {lr}
|
|
|
|
+ neg r0,r0
|
|
|
|
+ bl seterrno
|
|
|
|
+ mov r0,#0
|
|
|
|
+ mvn r0,r0
|
|
|
|
+ pop {pc}
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+function FpSysCall(sysnr,param1:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL1'];
|
|
|
|
+{
|
|
|
|
+ Perform syscall and set errno variable if needed.
|
|
|
|
+}
|
|
|
|
+asm
|
|
|
|
+ push {r7}
|
|
|
|
+ mov r7,r0
|
|
|
|
+ mov r0,r1
|
|
|
|
+ // svc #0x0
|
|
|
|
+ // GNU 2.22 does not like svc #0x0
|
|
|
|
+ .byte 0,0xdf
|
|
|
|
+ mov r1,#126
|
|
|
|
+ cmn r0,r1
|
|
|
|
+ pop {r7}
|
|
|
|
+ bhi .Lnoexit
|
|
|
|
+ mov pc,lr
|
|
|
|
+.Lnoexit:
|
|
|
|
+ push {lr}
|
|
|
|
+ neg r0,r0
|
|
|
|
+ bl seterrno
|
|
|
|
+ mov r0,#0
|
|
|
|
+ mvn r0,r0
|
|
|
|
+ pop {pc}
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+function FpSysCall(sysnr,param1,param2:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL2'];
|
|
|
|
+{
|
|
|
|
+ Perform syscall and set errno variable if needed.
|
|
|
|
+}
|
|
|
|
+asm
|
|
|
|
+ push {r7}
|
|
|
|
+ mov r7,r0
|
|
|
|
+ mov r0,r1
|
|
|
|
+ mov r1,r2
|
|
|
|
+ // svc #0x0
|
|
|
|
+ // GNU 2.22 does not like svc #0x0
|
|
|
|
+ .byte 0,0xdf
|
|
|
|
+ mov r1,#126
|
|
|
|
+ cmn r0,r1
|
|
|
|
+ pop {r7}
|
|
|
|
+ bhi .Lnoexit
|
|
|
|
+ mov pc,lr
|
|
|
|
+.Lnoexit:
|
|
|
|
+ push {lr}
|
|
|
|
+ neg r0,r0
|
|
|
|
+ bl seterrno
|
|
|
|
+ mov r0,#0
|
|
|
|
+ mvn r0,r0
|
|
|
|
+ pop {pc}
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL3'];
|
|
|
|
+{
|
|
|
|
+ Perform syscall and set errno variable if needed.
|
|
|
|
+}
|
|
|
|
+asm
|
|
|
|
+ push {r7}
|
|
|
|
+ mov r7,r0
|
|
|
|
+ mov r0,r1
|
|
|
|
+ mov r1,r2
|
|
|
|
+ mov r2,r3
|
|
|
|
+ // svc #0x0
|
|
|
|
+ // GNU 2.22 does not like svc #0x0
|
|
|
|
+ .byte 0,0xdf
|
|
|
|
+ mov r1,#126
|
|
|
|
+ cmn r0,r1
|
|
|
|
+ pop {r7}
|
|
|
|
+ bhi .Lnoexit
|
|
|
|
+ mov pc,lr
|
|
|
|
+.Lnoexit:
|
|
|
|
+ push {lr}
|
|
|
|
+ neg r0,r0
|
|
|
|
+ bl seterrno
|
|
|
|
+ mov r0,#0
|
|
|
|
+ mvn r0,r0
|
|
|
|
+ pop {pc}
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; assembler; [public,alias:'FPC_SYSCALL4'];
|
|
|
|
+{
|
|
|
|
+ Perform syscall and set errno variable if needed.
|
|
|
|
+}
|
|
|
|
+asm
|
|
|
|
+ push {r6,r7}
|
|
|
|
+ push {r0}
|
|
|
|
+ mov r0,r1
|
|
|
|
+ mov r1,r2
|
|
|
|
+ mov r2,r3
|
|
|
|
+ ldr r3,param4
|
|
|
|
+ pop {r7}
|
|
|
|
+ // svc #0x0
|
|
|
|
+ // GNU 2.22 does not like svc #0x0
|
|
|
|
+ .byte 0,0xdf
|
|
|
|
+ mov r1,#126
|
|
|
|
+ cmn r0,r1
|
|
|
|
+ pop {r6,r7}
|
|
|
|
+ bls .LExit
|
|
|
|
+ neg r0,r0
|
|
|
|
+ bl seterrno
|
|
|
|
+ mov r0,#0
|
|
|
|
+ mvn r0,r0
|
|
|
|
+.LExit:
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function FpSysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL5'];
|
|
|
|
+{
|
|
|
|
+ Perform syscall and set errno variable if needed.
|
|
|
|
+}
|
|
|
|
+asm
|
|
|
|
+ push {r4,r7}
|
|
|
|
+ push {r0}
|
|
|
|
+ mov r0,r1
|
|
|
|
+ mov r1,r2
|
|
|
|
+ mov r2,r3
|
|
|
|
+ ldr r3,param4
|
|
|
|
+ ldr r4,param5
|
|
|
|
+ pop {r7}
|
|
|
|
+ // svc #0x0
|
|
|
|
+ // GNU 2.22 does not like svc #0x0
|
|
|
|
+ .byte 0,0xdf
|
|
|
|
+ mov r1,#126
|
|
|
|
+ cmn r0,r1
|
|
|
|
+ pop {r4,r7}
|
|
|
|
+ bls .LExit
|
|
|
|
+ neg r0,r0
|
|
|
|
+ bl seterrno
|
|
|
|
+ mov r0,#0
|
|
|
|
+ mvn r0,r0
|
|
|
|
+.LExit:
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL6'];
|
|
|
|
+{
|
|
|
|
+ Perform syscall and set errno variable if needed.
|
|
|
|
+}
|
|
|
|
+asm
|
|
|
|
+ push {r4,r5,r6,r7}
|
|
|
|
+ push {r0}
|
|
|
|
+ mov r0,r1
|
|
|
|
+ mov r1,r2
|
|
|
|
+ mov r2,r3
|
|
|
|
+ ldr r3,param4
|
|
|
|
+ ldr r4,param5
|
|
|
|
+ ldr r4,param6
|
|
|
|
+ pop {r7}
|
|
|
|
+ // svc #0x0
|
|
|
|
+ // GNU 2.22 does not like svc #0x0
|
|
|
|
+ .byte 0,0xdf
|
|
|
|
+ mov r1,#126
|
|
|
|
+ cmn r0,r1
|
|
|
|
+ pop {r4,r5,r6,r7}
|
|
|
|
+ bls .LExit
|
|
|
|
+ neg r0,r0
|
|
|
|
+ bl seterrno
|
|
|
|
+ mov r0,#0
|
|
|
|
+ mvn r0,r0
|
|
|
|
+.LExit:
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+{$else CPUTHUMB}
|
|
function FpSysCall(sysnr:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL0'];
|
|
function FpSysCall(sysnr:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL0'];
|
|
{
|
|
{
|
|
Perform syscall and set errno variable if needed.
|
|
Perform syscall and set errno variable if needed.
|
|
@@ -173,6 +366,8 @@ asm
|
|
.LExit:
|
|
.LExit:
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+{$endif CPUTHUMB}
|
|
|
|
+
|
|
{$else FPC_ABI_EABI}
|
|
{$else FPC_ABI_EABI}
|
|
|
|
|
|
function FpSysCall(sysnr:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL0'];
|
|
function FpSysCall(sysnr:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL0'];
|