mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 07:26:24 +02:00
+ linux syscalls for arm thumb
git-svn-id: trunk@23987 -
This commit is contained in:
parent
9dc03c809e
commit
a433d53117
@ -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'];
|
||||||
|
@ -247,7 +247,13 @@ procedure linux_restore; cdecl; nostackframe; assembler;
|
|||||||
asm
|
asm
|
||||||
{$ifdef FPC_ABI_EABI}
|
{$ifdef FPC_ABI_EABI}
|
||||||
mov r7, syscall_nr_sigreturn
|
mov r7, syscall_nr_sigreturn
|
||||||
|
{$ifdef CPUTHUMB}
|
||||||
|
// svc #0x0
|
||||||
|
// GNU 2.22 does not like svc #0x0
|
||||||
|
.byte 0,0xdf
|
||||||
|
{$else CPUTHUMB}
|
||||||
swi #0x0
|
swi #0x0
|
||||||
|
{$endif CPUTHUMB}
|
||||||
{$else}
|
{$else}
|
||||||
swi syscall_nr_sigreturn
|
swi syscall_nr_sigreturn
|
||||||
{$endif}
|
{$endif}
|
||||||
@ -276,7 +282,13 @@ procedure linux_restore_rt; cdecl; nostackframe; assembler;
|
|||||||
asm
|
asm
|
||||||
{$ifdef FPC_ABI_EABI}
|
{$ifdef FPC_ABI_EABI}
|
||||||
mov r7, syscall_nr_rt_sigreturn
|
mov r7, syscall_nr_rt_sigreturn
|
||||||
|
{$ifdef CPUTHUMB}
|
||||||
|
// svc #0x0
|
||||||
|
// GNU 2.22 does not like svc #0x0
|
||||||
|
.byte 0,0xdf
|
||||||
|
{$else CPUTHUMB}
|
||||||
swi #0x0
|
swi #0x0
|
||||||
|
{$endif CPUTHUMB}
|
||||||
{$else}
|
{$else}
|
||||||
swi syscall_nr_rt_sigreturn
|
swi syscall_nr_rt_sigreturn
|
||||||
{$endif}
|
{$endif}
|
||||||
|
Loading…
Reference in New Issue
Block a user