Просмотр исходного кода

* changed i386 syscall from oldfpccall to register calling convention

git-svn-id: trunk@6776 -
ivost 18 лет назад
Родитель
Сommit
e7fb4e6a32
2 измененных файлов с 143 добавлено и 246 удалено
  1. 136 236
      rtl/linux/i386/syscall.inc
  2. 7 10
      rtl/linux/i386/syscallh.inc

+ 136 - 236
rtl/linux/i386/syscall.inc

@@ -19,262 +19,162 @@
 
 Procedure fpc_geteipasebx;[external name 'fpc_geteipasebx'];
 
-function FpSysCall(sysnr:TSysParam):TSysResult; assembler; oldfpccall;[public,alias:'FPC_SYSCALL0'];
-
+function FpSysCall(sysnr:TSysParam):TSysResult; assembler; register; [public,alias:'FPC_SYSCALL0'];
+{ Var sysnr located in register eax }
 asm
-{ load the registers... }
-  movl  sysnr,%eax
-  int   $0x80
-  cmpl  $-4095,%eax
-  jb   .LSyscOK
-  negl  %eax
-{$ifdef FPC_PIC}
-  call  fpc_geteipasebx
-  addl  $_GLOBAL_OFFSET_TABLE_,%ebx
-  movl  fpc_threadvar_relocate_proc@GOT(%ebx),%ecx
-  movl  (%ecx),%ecx
-  movl  Errno@GOT(%ebx),%edi
-{$else FPC_PIC}
-  leal  Errno,%edi
-  movl  fpc_threadvar_relocate_proc,%ecx
-{$endif FPC_PIC}
-  testl %ecx,%ecx
-  jne   .LThread
-  movl  %eax,4(%edi)
-  jmp   .LNoThread
-.LThread:
-  movl  %eax,%ebx
-  movl  (%edi),%eax
-  call  *%ecx
-  movl  %ebx,(%eax)
-.LNoThread:
-  movl  $-1,%eax
-.LSyscOK:
+//      movl  sysnr,%eax
+        int   $0x80
+        cmpl  $-4095,%eax
+        jb    .LSyscOK
+        negl  %eax
+        call  seterrno
+        movl  $-1,%eax
+  .LSyscOK:
 end;
 
-function FpSysCall(sysnr,param1 : TSysParam):TSysResult; assembler; oldfpccall;[public,alias:'FPC_SYSCALL1'];
-
+function FpSysCall(sysnr,param1 : TSysParam):TSysResult; assembler; register; [public,alias:'FPC_SYSCALL1'];
+{ Var sysnr located in register eax
+  Var param1 located in register edx }
 asm
-{ load the registers... }
-  movl sysnr,%eax
-  movl param1,%ebx
-  int $0x80
-  cmpl  $-4095,%eax
-  jb   .LSyscOK
-  negl  %eax
-{$ifdef FPC_PIC}
-  call  fpc_geteipasebx
-  addl  $_GLOBAL_OFFSET_TABLE_,%ebx
-  movl  fpc_threadvar_relocate_proc@GOT(%ebx),%ecx
-  movl  (%ecx),%ecx
-  movl  Errno@GOT(%ebx),%edi
-{$else FPC_PIC}
-  leal  Errno,%edi
-  movl  fpc_threadvar_relocate_proc,%ecx
-{$endif FPC_PIC}
-  testl %ecx,%ecx
-  jne   .LThread
-  movl  %eax,4(%edi)
-  jmp   .LNoThread
-.LThread:
-  movl  %eax,%ebx
-  movl  (%edi),%eax
-  call  *%ecx
-  movl  %ebx,(%eax)
-.LNoThread:
-  movl  $-1,%eax
-.LSyscOK:
+        movl  %ebx,%ecx
+//      movl  sysnr,%eax
+        movl  %edx,%ebx
+        int   $0x80
+        movl  %ecx,%ebx
+        cmpl  $-4095,%eax
+        jb    .LSyscOK
+        negl  %eax
+        call  seterrno
+        movl  $-1,%eax
+  .LSyscOK:
 end;
 
-function FpSysCall(sysnr,param1,param2 : TSysParam):TSysResult; assembler; oldfpccall; [public,alias:'FPC_SYSCALL2'];
-
+function FpSysCall(sysnr,param1,param2 : TSysParam):TSysResult; assembler; register; [public,alias:'FPC_SYSCALL2'];
+{ Var sysnr located in register eax
+  Var param1 located in register edx
+  Var param2 located in register ecx }
 asm
-{ load the registers... }
-  movl sysnr,%eax
-  movl param1,%ebx
-  movl param2,%ecx
-  int $0x80
-  cmpl  $-4095,%eax
-  jb   .LSyscOK
-  negl  %eax
-{$ifdef FPC_PIC}
-  call  fpc_geteipasebx
-  addl  $_GLOBAL_OFFSET_TABLE_,%ebx
-  movl  fpc_threadvar_relocate_proc@GOT(%ebx),%ecx
-  movl  (%ecx),%ecx
-  movl  Errno@GOT(%ebx),%edi
-{$else FPC_PIC}
-  leal  Errno,%edi
-  movl  fpc_threadvar_relocate_proc,%ecx
-{$endif FPC_PIC}
-  testl %ecx,%ecx
-  jne   .LThread
-  movl  %eax,4(%edi)
-  jmp   .LNoThread
-.LThread:
-  movl  %eax,%ebx
-  movl (%edi),%eax
-  call  *%ecx
-  movl  %ebx,(%eax)
-.LNoThread:
-  movl  $-1,%eax
-.LSyscOK:
+        push  %ebx
+//      movl  sysnr,%eax
+        movl  %edx,%ebx
+//      movl  param2,%ecx
+        int   $0x80
+        pop   %ebx
+        cmpl  $-4095,%eax
+        jb    .LSyscOK
+        negl  %eax
+        call  seterrno
+        movl  $-1,%eax
+  .LSyscOK:
 end;
 
-function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler; oldfpccall; [public,alias:'FPC_SYSCALL3'];
-
+function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler; register; [public,alias:'FPC_SYSCALL3'];
+{ Var sysnr located in register eax
+  Var param1 located in register edx
+  Var param2 located in register ecx
+  Var param3 located at ebp+20 }
 asm
-{ load the registers... }
-  movl sysnr,%eax
-  movl param1,%ebx
-  movl param2,%ecx
-  movl param3,%edx
-  int $0x80
-  cmpl  $-4095,%eax
-  jb   .LSyscOK
-  negl  %eax
-{$ifdef FPC_PIC}
-  call  fpc_geteipasebx
-  addl  $_GLOBAL_OFFSET_TABLE_,%ebx
-  movl  fpc_threadvar_relocate_proc@GOT(%ebx),%ecx
-  movl  (%ecx),%ecx
-  movl  Errno@GOT(%ebx),%edi
-{$else FPC_PIC}
-  leal  Errno,%edi
-  movl  fpc_threadvar_relocate_proc,%ecx
-{$endif FPC_PIC}
-  testl %ecx,%ecx
-  jne   .LThread
-  movl  %eax,4(%edi)
-  jmp   .LNoThread
-.LThread:
-  movl  %eax,%ebx
-  movl  (%edi),%eax
-  call  *%ecx
-  movl  %ebx,(%eax)
-.LNoThread:
-  movl  $-1,%eax
-.LSyscOK:
+        push  %ebx
+//      movl  sysnr,%eax
+        movl  %edx,%ebx
+//      movl  param2,%ecx
+        movl  param3,%edx
+        int   $0x80
+        pop   %ebx
+        cmpl  $-4095,%eax
+        jb    .LSyscOK
+        negl  %eax
+        call  seterrno
+        movl  $-1,%eax
+  .LSyscOK:
 end;
 
-function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; assembler; oldfpccall; [public,alias:'FPC_SYSCALL4'];
-
+function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; assembler; register; [public,alias:'FPC_SYSCALL4'];
+{ Var sysnr located in register eax
+  Var param1 located in register edx
+  Var param2 located in register ecx
+  Var param3 located at ebp+20
+  Var param4 located at ebp+16 }
 asm
-{ load the registers... }
-  movl sysnr,%eax
-  movl param1,%ebx
-  movl param2,%ecx
-  movl param3,%edx
-  movl param4,%esi
-  int $0x80
-  cmpl  $-4095,%eax
-  jb   .LSyscOK
-  negl  %eax
-{$ifdef FPC_PIC}
-  call  fpc_geteipasebx
-  addl  $_GLOBAL_OFFSET_TABLE_,%ebx
-  movl  fpc_threadvar_relocate_proc@GOT(%ebx),%ecx
-  movl  (%ecx),%ecx
-  movl  Errno@GOT(%ebx),%edi
-{$else FPC_PIC}
-  leal  Errno,%edi
-  movl  fpc_threadvar_relocate_proc,%ecx
-{$endif FPC_PIC}
-  testl %ecx,%ecx
-  jne   .LThread
-  movl  %eax,4(%edi)
-  jmp   .LNoThread
-.LThread:
-  movl  %eax,%ebx
-  movl  (%edi),%eax
-  call  *%ecx
-  movl  %ebx,(%eax)
-.LNoThread:
-  movl  $-1,%eax
-.LSyscOK:
+        push  %ebx
+        push  %esi
+//      movl  sysnr,%eax
+        movl  %edx,%ebx
+//      movl  param2,%ecx
+        movl  param3,%edx
+        movl  param4,%esi
+        int   $0x80
+        pop   %esi
+        pop   %ebx
+        cmpl  $-4095,%eax
+        jb    .LSyscOK
+        negl  %eax
+        call  seterrno
+        movl  $-1,%eax
+  .LSyscOK:
 end;
 
-function FpSysCall(sysnr,param1,param2,param3,param4,param5 : TSysParam):TSysResult; assembler; oldfpccall;[public,alias:'FPC_SYSCALL5'];
-
+function FpSysCall(sysnr,param1,param2,param3,param4,param5 : TSysParam):TSysResult; assembler; register; [public,alias:'FPC_SYSCALL5'];
+{ Var sysnr located in register eax
+  Var param1 located in register edx
+  Var param2 located in register ecx
+  Var param3 located at ebp+20
+  Var param4 located at ebp+16
+  Var param5 located at ebp+12 }
 asm
-{ load the registers... }
-  movl sysnr,%eax
-  movl param1,%ebx
-  movl param2,%ecx
-  movl param3,%edx
-  movl param4,%esi
-  movl param5,%edi
-  int $0x80
-  cmpl  $-4095,%eax
-  jb   .LSyscOK
-  negl  %eax
-{$ifdef FPC_PIC}
-  call  fpc_geteipasebx
-  addl  $_GLOBAL_OFFSET_TABLE_,%ebx
-  movl  fpc_threadvar_relocate_proc@GOT(%ebx),%ecx
-  movl  (%ecx),%ecx
-  movl  Errno@GOT(%ebx),%edi
-{$else FPC_PIC}
-  leal  Errno,%edi
-  movl  fpc_threadvar_relocate_proc,%ecx
-{$endif FPC_PIC}
-  testl %ecx,%ecx
-  jne   .LThread
-  movl  %eax,4(%edi)
-  jmp   .LNoThread
-.LThread:
-  movl  %eax,%ebx
-  movl  (%edi),%eax
-  call  *%ecx
-  movl  %ebx,(%eax)
-.LNoThread:
-  movl  $-1,%eax
-.LSyscOK:
+        push  %ebx
+        push  %esi
+        push  %edi
+//      movl  sysnr,%eax
+        movl  %edx,%ebx
+//      movl  param2,%ecx
+        movl  param3,%edx
+        movl  param4,%esi
+        movl  param5,%edi
+        int   $0x80
+        pop   %edi
+        pop   %esi
+        pop   %ebx
+        cmpl  $-4095,%eax
+        jb    .LSyscOK
+        negl  %eax
+        call  seterrno
+        movl  $-1,%eax
+  .LSyscOK:
 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; oldfpccall;[public,alias:'FPC_SYSCALL6'];
-
+function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6: TSysParam):TSysResult; assembler; register; [public,alias:'FPC_SYSCALL6'];
+{ Var sysnr located in register eax
+  Var param1 located in register edx
+  Var param2 located in register ecx
+  Var param3 located at ebp+20
+  Var param4 located at ebp+16
+  Var param5 located at ebp+12
+  Var param6 located at ebp+8 }
 asm
-{ load the registers... }
-  push %ebp
-  movl sysnr,%eax
-  movl param1,%ebx
-  movl param2,%ecx
-  movl param3,%edx
-  movl param4,%esi
-  movl param5,%edi
-  movl param6,%ebp
-  int $0x80
-  pop  %ebp
-  cmpl  $-4095,%eax
-  jb   .LSyscOK
-  negl  %eax
-{$ifdef FPC_PIC}
-  call  fpc_geteipasebx
-  addl  $_GLOBAL_OFFSET_TABLE_,%ebx
-  movl  fpc_threadvar_relocate_proc@GOT(%ebx),%ecx
-  movl  (%ecx),%ecx
-  movl  Errno@GOT(%ebx),%edi
-{$else FPC_PIC}
-  leal  Errno,%edi
-  movl  fpc_threadvar_relocate_proc,%ecx
-{$endif FPC_PIC}
-  testl %ecx,%ecx
-  jne   .LThread
-  movl  %eax,4(%edi)
-  jmp   .LNoThread
-.LThread:
-  movl  %eax,%ebx
-  movl  (%edi),%eax
-  call  *%ecx
-  movl  %ebx,(%eax)
-.LNoThread:
-  movl  $-1,%eax
-.LSyscOK:
+        push  %ebx
+        push  %esi
+        push  %edi
+        push  %ebp
+//      movl  sysnr,%eax
+        movl  %edx,%ebx
+//      movl  param2,%ecx
+        movl  param3,%edx
+        movl  param4,%esi
+        movl  param5,%edi
+        movl  param6,%ebp
+        int   $0x80
+        pop   %ebp
+        pop   %edi
+        pop   %esi
+        pop   %ebx
+        cmpl  $-4095,%eax
+        jb    .LSyscOK
+        negl  %eax
+        call  seterrno
+        movl  $-1,%eax
+  .LSyscOK:
 end;
-{.$endif notsupported}
 
 {No debugging for syslinux include !}
 {$IFDEF SYS_LINUX}

+ 7 - 10
rtl/linux/i386/syscallh.inc

@@ -33,13 +33,10 @@ Type
 
   TSysParam  = Longint;
 
-function Do_SysCall(sysnr:TSysParam):TSysResult;  oldfpccall; external name 'FPC_SYSCALL0';
-function Do_SysCall(sysnr,param1:TSysParam):TSysResult; oldfpccall; external name 'FPC_SYSCALL1';
-function Do_SysCall(sysnr,param1,param2:TSysParam):TSysResult;  oldfpccall; external name 'FPC_SYSCALL2';
-function Do_SysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; oldfpccall; external name 'FPC_SYSCALL3';
-function Do_SysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; oldfpccall; external name 'FPC_SYSCALL4';
-function Do_SysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult;  oldfpccall; external name 'FPC_SYSCALL5';
-{.$ifdef notsupported}
-function Do_SysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TSysResult;  oldfpccall; external name 'FPC_SYSCALL6';
-{.$endif notsupported}
-
+function Do_SysCall(sysnr:TSysParam):TSysResult; register; external name 'FPC_SYSCALL0';
+function Do_SysCall(sysnr,param1:TSysParam):TSysResult; register; external name 'FPC_SYSCALL1';
+function Do_SysCall(sysnr,param1,param2:TSysParam):TSysResult; register; external name 'FPC_SYSCALL2';
+function Do_SysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; register; external name 'FPC_SYSCALL3';
+function Do_SysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; register; external name 'FPC_SYSCALL4';
+function Do_SysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult; register; external name 'FPC_SYSCALL5';
+function Do_SysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TSysResult; register; external name 'FPC_SYSCALL6';