Browse Source

* Threadvar support for Errno
* Fixed syscall error return check
* Uncommented Syscall with 6 parameters, only 5 were really set

peter 22 years ago
parent
commit
6154a3076e
2 changed files with 158 additions and 53 deletions
  1. 146 48
      rtl/linux/i386/syscall.inc
  2. 12 5
      rtl/linux/i386/syscallh.inc

+ 146 - 48
rtl/linux/i386/syscall.inc

@@ -6,7 +6,7 @@
 
 
     The syscalls for the new RTL, moved to platform dependant dir.
     The syscalls for the new RTL, moved to platform dependant dir.
     Old linux calling convention is stil kept.
     Old linux calling convention is stil kept.
-    
+
     See the file COPYING.FPC, included in this distribution,
     See the file COPYING.FPC, included in this distribution,
     for details about the copyright.
     for details about the copyright.
 
 
@@ -23,15 +23,28 @@ function FpSysCall(sysnr:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYS
 
 
 asm
 asm
 { load the registers... }
 { load the registers... }
-  movl sysnr,%eax
-  int $0x80
-  test %eax,%eax
-  jae   .LSysc
-  negl %eax
-  mov  %eax,Errno
-  mov  $-1,%eax
-.LSysc:
-end;     
+  movl  sysnr,%eax
+  int   $0x80
+  testl %eax,%eax
+  jns   .LSyscEnd
+  negl  %eax
+  pushl %edx
+  pushl %eax
+  movl  FPC_THREADVAR_RELOCATE,%eax
+  testl %eax,%eax
+  jne   .LThread
+  leal  Errno+4,%eax
+  jmp   .LNoThread
+.LThread:
+  pushl Errno
+  call  *%eax
+.LNoThread:
+  popl  %edx
+  movl  %edx,(%eax)
+  popl  %edx
+  movl  $-1,%eax
+.LSyscEnd:
+end;
 
 
 function FpSysCall(sysnr,param1 : TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL1'];
 function FpSysCall(sysnr,param1 : TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL1'];
 
 
@@ -40,12 +53,25 @@ asm
   movl sysnr,%eax
   movl sysnr,%eax
   movl param1,%ebx
   movl param1,%ebx
   int $0x80
   int $0x80
-  test %eax,%eax
-  jae   .LSysc
-  negl %eax
-  mov  %eax,Errno
-  mov  $-1,%eax
-.LSysc:
+  testl %eax,%eax
+  jns   .LSyscEnd
+  negl  %eax
+  pushl %edx
+  pushl %eax
+  movl  FPC_THREADVAR_RELOCATE,%eax
+  testl %eax,%eax
+  jne   .LThread
+  leal  ErrNo+4,%eax
+  jmp   .LNoThread
+.LThread:
+  pushl Errno
+  call  *%eax
+.LNoThread:
+  popl  %edx
+  movl  %edx,(%eax)
+  popl  %edx
+  movl  $-1,%eax
+.LSyscEnd:
 end;
 end;
 
 
 function FpSysCall(sysnr,param1,param2 : TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL2'];
 function FpSysCall(sysnr,param1,param2 : TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL2'];
@@ -56,13 +82,25 @@ asm
   movl param1,%ebx
   movl param1,%ebx
   movl param2,%ecx
   movl param2,%ecx
   int $0x80
   int $0x80
-  test %eax,%eax
-  jae   .LSysc
-  negl %eax
-  mov  %eax,Errno
-  mov  $-1,%eax
-.LSysc:
-
+  testl %eax,%eax
+  jns   .LSyscEnd
+  negl  %eax
+  pushl %edx
+  pushl %eax
+  movl  FPC_THREADVAR_RELOCATE,%eax
+  testl %eax,%eax
+  jne   .LThread
+  leal  ErrNo+4,%eax
+  jmp   .LNoThread
+.LThread:
+  pushl Errno
+  call  *%eax
+.LNoThread:
+  popl  %edx
+  movl  %edx,(%eax)
+  popl  %edx
+  movl  $-1,%eax
+.LSyscEnd:
 end;
 end;
 
 
 function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL3'];
 function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL3'];
@@ -74,12 +112,25 @@ asm
   movl param2,%ecx
   movl param2,%ecx
   movl param3,%edx
   movl param3,%edx
   int $0x80
   int $0x80
-  test %eax,%eax
-  jae   .LSysc
-  negl %eax
-  mov  %eax,Errno
-  mov  $-1,%eax
-.LSysc:
+  testl %eax,%eax
+  jns   .LSyscEnd
+  negl  %eax
+  pushl %edx
+  pushl %eax
+  movl  FPC_THREADVAR_RELOCATE,%eax
+  testl %eax,%eax
+  jne   .LThread
+  leal  ErrNo+4,%eax
+  jmp   .LNoThread
+.LThread:
+  pushl Errno
+  call  *%eax
+.LNoThread:
+  popl  %edx
+  movl  %edx,(%eax)
+  popl  %edx
+  movl  $-1,%eax
+.LSyscEnd:
 end;
 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'];
@@ -92,12 +143,25 @@ asm
   movl param3,%edx
   movl param3,%edx
   movl param4,%esi
   movl param4,%esi
   int $0x80
   int $0x80
-  test %eax,%eax
-  jae   .LSysc
-  negl %eax
-  mov  %eax,Errno
-  mov  $-1,%eax
-.LSysc:
+  testl %eax,%eax
+  jns   .LSyscEnd
+  negl  %eax
+  pushl %edx
+  pushl %eax
+  movl  FPC_THREADVAR_RELOCATE,%eax
+  testl %eax,%eax
+  jne   .LThread
+  leal  ErrNo+4,%eax
+  jmp   .LNoThread
+.LThread:
+  pushl Errno
+  call  *%eax
+.LNoThread:
+  popl  %edx
+  movl  %edx,(%eax)
+  popl  %edx
+  movl  $-1,%eax
+.LSyscEnd:
 end;
 end;
 
 
 function FpSysCall(sysnr,param1,param2,param3,param4,param5 : TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL5'];
 function FpSysCall(sysnr,param1,param2,param3,param4,param5 : TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL5'];
@@ -111,14 +175,29 @@ asm
   movl param4,%esi
   movl param4,%esi
   movl param5,%edi
   movl param5,%edi
   int $0x80
   int $0x80
-  test %eax,%eax
-  jae   .LSysc
-  negl %eax
-  mov  %eax,Errno
-  mov  $-1,%eax
-.LSysc:
+  testl %eax,%eax
+  jns   .LSyscEnd
+  negl  %eax
+  pushl %edx
+  pushl %eax
+  movl  FPC_THREADVAR_RELOCATE,%eax
+  testl %eax,%eax
+  jne   .LThread
+  leal  ErrNo+4,%eax
+  jmp   .LNoThread
+.LThread:
+  pushl Errno
+  call  *%eax
+.LNoThread:
+  popl  %edx
+  movl  %edx,(%eax)
+  popl  %edx
+  movl  $-1,%eax
+.LSyscEnd:
 end;
 end;
 
 
+{$ifdef notsupported}
+{ Only 5 params are pushed, so it'll not work as expected (PFV) }
 function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6 : TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL6'];
 function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6 : TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL6'];
 
 
 asm
 asm
@@ -130,13 +209,27 @@ asm
   movl param4,%esi
   movl param4,%esi
   movl param5,%edi
   movl param5,%edi
   int $0x80
   int $0x80
-  test %eax,%eax
-  jae   .LSysc
-  negl %eax
-  mov  %eax,Errno
-  mov  $-1,%eax
-.LSysc:
+  testl %eax,%eax
+  jns   .LSyscEnd
+  negl  %eax
+  pushl %edx
+  pushl %eax
+  movl  FPC_THREADVAR_RELOCATE,%eax
+  testl %eax,%eax
+  jne   .LThread
+  leal  ErrNo+4,%eax
+  jmp   .LNoThread
+.LThread:
+  pushl Errno
+  call  *%eax
+.LNoThread:
+  popl  %edx
+  movl  %edx,(%eax)
+  popl  %edx
+  movl  $-1,%eax
+.LSyscEnd:
 end;
 end;
+{$endif notsupported}
 
 
 {No debugging for syslinux include !}
 {No debugging for syslinux include !}
 {$IFDEF SYS_LINUX}
 {$IFDEF SYS_LINUX}
@@ -227,7 +320,12 @@ end;
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.3  2002-12-18 16:46:37  marco
+  Revision 1.4  2002-12-18 20:41:33  peter
+    * Threadvar support for Errno
+    * Fixed syscall error return check
+    * Uncommented Syscall with 6 parameters, only 5 were really set
+
+  Revision 1.3  2002/12/18 16:46:37  marco
    * Some mods.
    * Some mods.
 
 
   Revision 1.2  2002/11/16 15:37:47  marco
   Revision 1.2  2002/11/16 15:37:47  marco

+ 12 - 5
rtl/linux/i386/syscallh.inc

@@ -25,11 +25,11 @@
 Type
 Type
 
 
   TSysResult = longint; // all platforms, cint=32-bit.
   TSysResult = longint; // all platforms, cint=32-bit.
-			// On platforms with off_t =64-bit, people should
-			// use int64, and typecast all calls that don't 
-			// return off_t to cint.
+                        // On platforms with off_t =64-bit, people should
+                        // use int64, and typecast all calls that don't
+                        // return off_t to cint.
 
 
-// I don't think this is going to work on several platforms 
+// I don't think this is going to work on several platforms
 // 64-bit machines don't have only 64-bit params.
 // 64-bit machines don't have only 64-bit params.
 
 
   TSysParam  = Longint;
   TSysParam  = Longint;
@@ -40,11 +40,18 @@ function Do_SysCall(sysnr,param1,param2:TSysParam):TSysResult;  external name 'F
 function Do_SysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; external name 'FPC_SYSCALL3';
 function Do_SysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; external name 'FPC_SYSCALL3';
 function Do_SysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; external name 'FPC_SYSCALL4';
 function Do_SysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; external name 'FPC_SYSCALL4';
 function Do_SysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult;  external name 'FPC_SYSCALL5';
 function Do_SysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult;  external name 'FPC_SYSCALL5';
+{$ifdef notsupported}
 function Do_SysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TSysResult;  external name 'FPC_SYSCALL5';
 function Do_SysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TSysResult;  external name 'FPC_SYSCALL5';
+{$endif notsupported}
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.2  2002-12-18 16:46:37  marco
+  Revision 1.3  2002-12-18 20:41:33  peter
+    * Threadvar support for Errno
+    * Fixed syscall error return check
+    * Uncommented Syscall with 6 parameters, only 5 were really set
+
+  Revision 1.2  2002/12/18 16:46:37  marco
    * Some mods.
    * Some mods.
 
 
   Revision 1.1  2002/11/16 15:37:47  marco
   Revision 1.1  2002/11/16 15:37:47  marco