Browse Source

* Optimize syscalls for arm-linux.

git-svn-id: trunk@8191 -
yury 18 years ago
parent
commit
4b8777eb5a
1 changed files with 35 additions and 228 deletions
  1. 35 228
      rtl/linux/arm/syscall.inc

+ 35 - 228
rtl/linux/arm/syscall.inc

@@ -22,272 +22,79 @@
                      --- Main:The System Call Self ---
 *****************************************************************************}
 
-function FpSysCall(sysnr:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL0'];
+function FpSysCall(sysnr:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL0'];
 {
-  This function puts the registers in place, does the call, and then
-  copies back the registers as they are after the SysCall.
+  Perform syscall and set errno variable if needed.
 }
-var
-  _r4 : dword;
 asm
-  str  r4,_r4
-  swi  #0x900071
-  cmn  r0,#126
-  bls  .LDone
-  rsb  r4,r0,#0
-  ldr  r2,.Lthread_var
-  ldr  r2,[r2]
-  ldr  r0,.LErrno
-  cmp  r2,#0
-  bne  .LThread
-  str  r4,[r0,#4]
-  mvn  r0,#0
-  b    .LDone
-.LThread:
-  ldr  r0,[r0]
-  mov  lr,pc
-  mov  pc,r2
-  str  r4,[r0]
-  mvn  r0,#0
-  b    .LDone
-.LErrno:
-  .word Errno
-.Lthread_var:
-  .word fpc_threadvar_relocate_proc
-.LDone:
-  ldr r4,_r4
-end ['r4'];
+  swi   #0x900071
+  cmn   r0,#126
+  movls pc,lr
+  stmfd sp!,{lr}
+  rsb   r0,r0,#0
+  bl    seterrno
+  mvn   r0,#0
+  ldmfd sp!,{pc}
+end;
+
 
+procedure FPC_SYSCALL; external name 'FPC_SYSCALL0';
 
-function FpSysCall(sysnr,param1:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL1'];
+function FpSysCall(sysnr,param1:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL1'];
 {
-  This function puts the registers in place, does the call, and then
-  copies back the registers as they are after the SysCall.
+  Jump to FPC_SYSCALL0 because code for FPC_SYSCALL0-FPC_SYSCALL3 is the same.
 }
-var
-  _r4 : dword;
 asm
-  str  r4,_r4
-  swi  #0x900071
-  cmn  r0,#126
-  bls  .LDone
-  rsb  r4,r0,#0
-  ldr  r2,.Lthread_var
-  ldr  r2,[r2]
-  ldr  r0,.LErrno
-  cmp  r2,#0
-  bne  .LThread
-  str  r4,[r0,#4]
-  mvn  r0,#0
-  b    .LDone
-.LThread:
-  ldr  r0,[r0]
-  mov  lr,pc
-  mov  pc,r2
-  str  r4,[r0]
-  mvn  r0,#0
-  b    .LDone
-.LErrno:
-  .word Errno
-.Lthread_var:
-  .word fpc_threadvar_relocate_proc
-.LDone:
-  ldr r4,_r4
-end ['r4'];
+  b FPC_SYSCALL
+end;
 
 
-function FpSysCall(sysnr,param1,param2:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL2'];
+function FpSysCall(sysnr,param1,param2:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL2'];
 {
-  This function puts the registers in place, does the call, and then
-  copies back the registers as they are after the SysCall.
+  Jump to FPC_SYSCALL0 because code for FPC_SYSCALL0-FPC_SYSCALL3 is the same.
 }
-var
-  _r4 : dword;
 asm
-  str  r4,_r4
-  swi  #0x900071
-  cmn  r0,#126
-  bls  .LDone
-  rsb  r4,r0,#0
-  ldr  r2,.Lthread_var
-  ldr  r2,[r2]
-  ldr  r0,.LErrno
-  cmp  r2,#0
-  bne  .LThread
-  str  r4,[r0,#4]
-  mvn  r0,#0
-  b    .LDone
-.LThread:
-  ldr  r0,[r0]
-  mov  lr,pc
-  mov  pc,r2
-  str  r4,[r0]
-  mvn  r0,#0
-  b    .LDone
-.LErrno:
-  .word Errno
-.Lthread_var:
-  .word fpc_threadvar_relocate_proc
-.LDone:
-  ldr r4,_r4
-end ['r4'];
+  b FPC_SYSCALL
+end;
 
 
-function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL3'];
+function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL3'];
 {
-  This function puts the registers in place, does the call, and then
-  copies back the registers as they are after the SysCall.
+  Jump to FPC_SYSCALL0 because code for FPC_SYSCALL0-FPC_SYSCALL3 is the same.
 }
-var
-  _r4 : dword;
 asm
-  str  r4,_r4
-  swi  #0x900071
-  cmn  r0,#126
-  bls  .LDone
-  rsb  r4,r0,#0
-  ldr  r2,.Lthread_var
-  ldr  r2,[r2]
-  ldr  r0,.LErrno
-  cmp  r2,#0
-  bne  .LThread
-  str  r4,[r0,#4]
-  mvn  r0,#0
-  b    .LDone
-.LThread:
-  ldr  r0,[r0]
-  mov  lr,pc
-  mov  pc,r2
-  str  r4,[r0]
-  mvn  r0,#0
-  b    .LDone
-.LErrno:
-  .word Errno
-.Lthread_var:
-  .word fpc_threadvar_relocate_proc
-.LDone:
-  ldr r4,_r4
-end ['r4'];
+  b FPC_SYSCALL
+end;
 
 
-function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL4'];
+function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; assembler; [public,alias:'FPC_SYSCALL4'];
 {
-  This function puts the registers in place, does the call, and then
-  copies back the registers as they are after the SysCall.
+  This function loads some parameters from stack and calls FPC_SYSCALL0.
 }
-var
-  _r4 : dword;
 asm
-  str  r4,_r4
   ldr  r4,param4
-  swi  #0x900071
-  cmn  r0,#126
-  bls  .LDone
-  rsb  r4,r0,#0
-  ldr  r2,.Lthread_var
-  ldr  r2,[r2]
-  ldr  r0,.LErrno
-  cmp  r2,#0
-  bne  .LThread
-  str  r4,[r0,#4]
-  mvn  r0,#0
-  b    .LDone
-.LThread:
-  ldr  r0,[r0]
-  mov  lr,pc
-  mov  pc,r2
-  str  r4,[r0]
-  mvn  r0,#0
-  b    .LDone
-.LErrno:
-  .word Errno
-.Lthread_var:
-  .word fpc_threadvar_relocate_proc
-.LDone:
-  ldr r4,_r4
+  bl FPC_SYSCALL
 end ['r4'];
 
 
 function FpSysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL5'];
 {
-  This function puts the registers in place, does the call, and then
-  copies back the registers as they are after the SysCall.
+  This function loads some parameters from stack and calls FPC_SYSCALL0.
 }
-var
-  _r4,_r5 : dword;
 asm
-  str  r4,_r4
-  str  r5,_r5
-  ldr  r5,param5
   ldr  r4,param4
-  swi  #0x900071
-  cmn  r0,#126
-  bls  .LDone
-  rsb  r4,r0,#0
-  ldr  r2,.Lthread_var
-  ldr  r2,[r2]
-  ldr  r0,.LErrno
-  cmp  r2,#0
-  bne  .LThread
-  str  r4,[r0,#4]
-  mvn  r0,#0
-  b    .LDone
-.LThread:
-  ldr  r0,[r0]
-  mov  lr,pc
-  mov  pc,r2
-  str  r4,[r0]
-  mvn  r0,#0
-  b    .LDone
-.LErrno:
-  .word Errno
-.Lthread_var:
-  .word fpc_threadvar_relocate_proc
-.LDone:
-  ldr r4,_r4
-  ldr r5,_r5
+  ldr  r5,param5
+  bl FPC_SYSCALL
 end ['r4','r5'];
 
 
 function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL6'];
 {
-  This function puts the registers in place, does the call, and then
-  copies back the registers as they are after the SysCall.
+  This function loads some parameters from stack and calls FPC_SYSCALL0.
 }
-var
-  _r4,_r5,_r6 : dword;
 asm
-  str  r4,_r4
-  str  r5,_r5
-  str  r6,_r6
-  ldr  r6,param6
-  ldr  r5,param5
   ldr  r4,param4
-  swi  #0x900071
-  cmn  r0,#126
-  bls  .LDone
-  rsb  r4,r0,#0
-  ldr  r2,.Lthread_var
-  ldr  r2,[r2]
-  ldr  r0,.LErrno
-  cmp  r2,#0
-  bne  .LThread
-  str  r4,[r0,#4]
-  mvn  r0,#0
-  b    .LDone
-.LThread:
-  ldr  r0,[r0]
-  mov  lr,pc
-  mov  pc,r2
-  str  r4,[r0]
-  mvn  r0,#0
-  b    .LDone
-.LErrno:
-  .word Errno
-.Lthread_var:
-  .word fpc_threadvar_relocate_proc
-.LDone:
-  ldr r4,_r4
-  ldr r5,_r5
-  ldr r6,_r6
+  ldr  r5,param5
+  ldr  r6,param6
+  bl FPC_SYSCALL
 end ['r4','r5','r6'];