+ linux syscalls for arm thumb

git-svn-id: trunk@23987 -
This commit is contained in:
florian 2013-03-24 21:39:34 +00:00
parent 9dc03c809e
commit a433d53117
2 changed files with 207 additions and 0 deletions

View File

@ -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'];

View File

@ -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}