mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-21 08:29:28 +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 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'];
|
||||
{
|
||||
Perform syscall and set errno variable if needed.
|
||||
@ -173,6 +366,8 @@ asm
|
||||
.LExit:
|
||||
end;
|
||||
|
||||
{$endif CPUTHUMB}
|
||||
|
||||
{$else FPC_ABI_EABI}
|
||||
|
||||
function FpSysCall(sysnr:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL0'];
|
||||
|
@ -247,7 +247,13 @@ procedure linux_restore; cdecl; nostackframe; assembler;
|
||||
asm
|
||||
{$ifdef FPC_ABI_EABI}
|
||||
mov r7, syscall_nr_sigreturn
|
||||
{$ifdef CPUTHUMB}
|
||||
// svc #0x0
|
||||
// GNU 2.22 does not like svc #0x0
|
||||
.byte 0,0xdf
|
||||
{$else CPUTHUMB}
|
||||
swi #0x0
|
||||
{$endif CPUTHUMB}
|
||||
{$else}
|
||||
swi syscall_nr_sigreturn
|
||||
{$endif}
|
||||
@ -276,7 +282,13 @@ procedure linux_restore_rt; cdecl; nostackframe; assembler;
|
||||
asm
|
||||
{$ifdef FPC_ABI_EABI}
|
||||
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
|
||||
{$endif CPUTHUMB}
|
||||
{$else}
|
||||
swi syscall_nr_rt_sigreturn
|
||||
{$endif}
|
||||
|
Loading…
Reference in New Issue
Block a user