Browse Source

* fixed eabi syscalls: preserve non-volative registers

git-svn-id: trunk@11197 -
florian 17 years ago
parent
commit
3341418267
1 changed files with 138 additions and 6 deletions
  1. 138 6
      rtl/linux/arm/syscall.inc

+ 138 - 6
rtl/linux/arm/syscall.inc

@@ -28,16 +28,75 @@ function FpSysCall(sysnr:TSysParam):TSysResult; assembler; nostackframe; [public
   Perform syscall and set errno variable if needed.
   Perform syscall and set errno variable if needed.
 }
 }
 asm
 asm
-  // for now we are lazy
+  str   r7,[sp,#-4]!
+  mov   r7,r0
+  swi   #0x0
+  ldr   r7,[sp],#4
+  cmn   r0,#126
+  ldr   r7,[sp],#4
+  movls pc,lr
+  stmfd sp!,{lr}
+  rsb   r0,r0,#0
+  bl    seterrno
+  mvn   r0,#0
+  ldmfd sp!,{pc}
+end;
+
+
+function FpSysCall(sysnr,param1:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL1'];
+{
+  Jump to FPC_SYSCALL0 because code for FPC_SYSCALL0-FPC_SYSCALL3 is the same.
+}
+asm
+  str   r7,[sp,#-4]!
+  mov   r7,r0
+  mov   r0,r1
+  swi   #0x0
+  cmn   r0,#126
+  ldr   r7,[sp],#4
+  movls pc,lr
+  stmfd sp!,{lr}
+  rsb   r0,r0,#0
+  bl    seterrno
+  mvn   r0,#0
+  ldmfd sp!,{pc}
+end;
+
+
+function FpSysCall(sysnr,param1,param2:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL2'];
+{
+  Jump to FPC_SYSCALL0 because code for FPC_SYSCALL0-FPC_SYSCALL3 is the same.
+}
+asm
+  str   r7,[sp,#-4]!
+  mov   r7,r0
+  mov   r0,r1
+  mov   r1,r2
+  swi   #0x0
+  cmn   r0,#126
+  ldr   r7,[sp],#4
+  movls pc,lr
+  stmfd sp!,{lr}
+  rsb   r0,r0,#0
+  bl    seterrno
+  mvn   r0,#0
+  ldmfd sp!,{pc}
+end;
+
+
+function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL3'];
+{
+  Jump to FPC_SYSCALL0 because code for FPC_SYSCALL0-FPC_SYSCALL3 is the same.
+}
+asm
+  str   r7,[sp,#-4]!
   mov   r7,r0
   mov   r7,r0
   mov   r0,r1
   mov   r0,r1
   mov   r1,r2
   mov   r1,r2
   mov   r2,r3
   mov   r2,r3
-  mov   r3,r4
-  mov   r4,r5
-  mov   r5,r6
   swi   #0x0
   swi   #0x0
   cmn   r0,#126
   cmn   r0,#126
+  ldr   r7,[sp],#4
   movls pc,lr
   movls pc,lr
   stmfd sp!,{lr}
   stmfd sp!,{lr}
   rsb   r0,r0,#0
   rsb   r0,r0,#0
@@ -45,7 +104,81 @@ asm
   mvn   r0,#0
   mvn   r0,#0
   ldmfd sp!,{pc}
   ldmfd sp!,{pc}
 end;
 end;
+
+
+function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; assembler; [public,alias:'FPC_SYSCALL4'];
+{
+  This function loads some parameters from stack and calls FPC_SYSCALL0.
+}
+asm
+  str   r7,[sp,#-4]!
+  mov   r7,r0
+  mov   r0,r1
+  mov   r1,r2
+  mov   r2,r3
+  ldr   r3,param4
+  swi   #0x0
+  cmn   r0,#126
+  ldr   r7,[sp],#4
+  movls pc,lr
+  stmfd sp!,{lr}
+  rsb   r0,r0,#0
+  bl    seterrno
+  mvn   r0,#0
+  ldmfd sp!,{pc}
+end;
+
+
+function FpSysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL5'];
+{
+  This function loads some parameters from stack and calls FPC_SYSCALL0.
+}
+asm
+  stmfd sp!,{r4,r7}
+  mov   r7,r0
+  mov   r0,r1
+  mov   r1,r2
+  mov   r2,r3
+  ldr   r3,param4
+  ldr   r4,param5
+  swi   #0x0
+  cmn   r0,#126
+  ldmfd sp!,{r4,r7}
+  movls pc,lr
+  stmfd sp!,{lr}
+  rsb   r0,r0,#0
+  bl    seterrno
+  mvn   r0,#0
+  ldmfd sp!,{pc}
+end;
+
+
+function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL6'];
+{
+  This function loads some parameters from stack and calls FPC_SYSCALL0.
+}
+asm
+  stmfd sp!,{r4,r5,r7}
+  mov   r7,r0
+  mov   r0,r1
+  mov   r1,r2
+  mov   r2,r3
+  ldr   r3,param4
+  ldr   r4,param5
+  ldr   r5,param6
+  swi   #0x0
+  cmn   r0,#126
+  ldmfd sp!,{r4,r5,r7}
+  movls pc,lr
+  stmfd sp!,{lr}
+  rsb   r0,r0,#0
+  bl    seterrno
+  mvn   r0,#0
+  ldmfd sp!,{pc}
+end;
+
 {$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'];
 {
 {
   Perform syscall and set errno variable if needed.
   Perform syscall and set errno variable if needed.
@@ -60,8 +193,6 @@ asm
   mvn   r0,#0
   mvn   r0,#0
   ldmfd sp!,{pc}
   ldmfd sp!,{pc}
 end;
 end;
-{$endif FPC_ABI_EABI}
-
 
 
 procedure FPC_SYSCALL; external name 'FPC_SYSCALL0';
 procedure FPC_SYSCALL; external name 'FPC_SYSCALL0';
 
 
@@ -129,3 +260,4 @@ asm
   bl FPC_SYSCALL
   bl FPC_SYSCALL
   ldmfd sp!,{r4,r5,r6}
   ldmfd sp!,{r4,r5,r6}
 end;
 end;
+{$endif FPC_ABI_EABI}