2
0
Эх сурвалжийг харах

+ linux syscalls for arm thumb

git-svn-id: trunk@23987 -
florian 12 жил өмнө
parent
commit
a433d53117

+ 195 - 0
rtl/linux/arm/syscall.inc

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

+ 12 - 0
rtl/linux/ossysc.inc

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