Răsfoiți Sursa

* fixed error handling of system calls

florian 20 ani în urmă
părinte
comite
b55c225f9b
1 a modificat fișierele cu 109 adăugiri și 35 ștergeri
  1. 109 35
      rtl/linux/arm/syscall.inc

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

@@ -32,15 +32,26 @@ asm
   swi  #0x900071
   cmn  r0,#126
   bls  .LDone
-  ldr  r1,.LErrno
-  rsb  r0,r0,#0
-  str  r0,[r1]
+  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:
+  mov  pc,r2
+  str  r4,[r0]
   mvn  r0,#0
   b    .LDone
 .LErrno:
   .word Errno
+.Lthread_var:
+  .word fpc_threadvar_relocate_proc
 .LDone:
-end;
+end ['r4'];
 
 
 function FpSysCall(sysnr,param1:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL1'];
@@ -52,15 +63,26 @@ asm
   swi  #0x900071
   cmn  r0,#126
   bls  .LDone
-  ldr  r1,.LErrno
-  rsb  r0,r0,#0
-  str  r0,[r1]
+  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:
+  mov  pc,r2
+  str  r4,[r0]
   mvn  r0,#0
   b    .LDone
 .LErrno:
   .word Errno
+.Lthread_var:
+  .word fpc_threadvar_relocate_proc
 .LDone:
-end;
+end ['r4'];
 
 
 function FpSysCall(sysnr,param1,param2:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL2'];
@@ -72,15 +94,26 @@ asm
   swi  #0x900071
   cmn  r0,#126
   bls  .LDone
-  ldr  r1,.LErrno
-  rsb  r0,r0,#0
-  str  r0,[r1]
+  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:
+  mov  pc,r2
+  str  r4,[r0]
   mvn  r0,#0
   b    .LDone
 .LErrno:
   .word Errno
+.Lthread_var:
+  .word fpc_threadvar_relocate_proc
 .LDone:
-end;
+end ['r4'];
 
 
 function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL3'];
@@ -92,15 +125,26 @@ asm
   swi  #0x900071
   cmn  r0,#126
   bls  .LDone
-  ldr  r1,.LErrno
-  rsb  r0,r0,#0
-  str  r0,[r1]
+  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:
+  mov  pc,r2
+  str  r4,[r0]
   mvn  r0,#0
   b    .LDone
 .LErrno:
   .word Errno
+.Lthread_var:
+  .word fpc_threadvar_relocate_proc
 .LDone:
-end;
+end ['r4'];
 
 
 function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL4'];
@@ -109,21 +153,30 @@ function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; asse
   copies back the registers as they are after the SysCall.
 }
 asm
-  stmfd r13!,{r4}
   ldr  r4,param4
   swi  #0x900071
   cmn  r0,#126
   bls  .LDone
-  ldr  r1,.LErrno
-  rsb  r0,r0,#0
-  str  r0,[r1]
+  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:
+  mov  pc,r2
+  str  r4,[r0]
   mvn  r0,#0
   b    .LDone
 .LErrno:
   .word Errno
+.Lthread_var:
+  .word fpc_threadvar_relocate_proc
 .LDone:
-  ldmfd r13!,{r4}
-end;
+end ['r4'];
 
 
 function FpSysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL5'];
@@ -132,22 +185,31 @@ function FpSysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResul
   copies back the registers as they are after the SysCall.
 }
 asm
-  stmfd r13!,{r4-r5}
   ldr  r5,param5
   ldr  r4,param4
   swi  #0x900071
   cmn  r0,#126
   bls  .LDone
-  ldr  r1,.LErrno
-  rsb  r0,r0,#0
-  str  r0,[r1]
+  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:
+  mov  pc,r2
+  str  r4,[r0]
   mvn  r0,#0
   b    .LDone
 .LErrno:
   .word Errno
+.Lthread_var:
+  .word fpc_threadvar_relocate_proc
 .LDone:
-  ldmfd r13!,{r4-r5}
-end;
+end ['r4','r5'];
 
 
 function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL6'];
@@ -156,28 +218,40 @@ function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TS
   copies back the registers as they are after the SysCall.
 }
 asm
-  stmfd r13!,{r4-r6}
   ldr  r6,param6
   ldr  r5,param5
   ldr  r4,param4
   swi  #0x900071
   cmn  r0,#126
   bls  .LDone
-  ldr  r1,.LErrno
-  rsb  r0,r0,#0
-  str  r0,[r1]
+  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:
+  mov  pc,r2
+  str  r4,[r0]
   mvn  r0,#0
   b    .LDone
 .LErrno:
   .word Errno
+.Lthread_var:
+  .word fpc_threadvar_relocate_proc
 .LDone:
-  ldmfd r13!,{r4-r6}
-end;
+end ['r4','r5','r6'];
 
 
 {
   $Log$
-  Revision 1.5  2004-02-06 23:06:16  florian
+  Revision 1.6  2005-01-04 14:13:58  florian
+    * fixed error handling of system calls
+
+  Revision 1.5  2004/02/06 23:06:16  florian
     - killed tsyscallregs
 
   Revision 1.4  2004/01/20 21:01:57  florian