* changed i386 syscall from oldfpccall to register calling convention

git-svn-id: trunk@6776 -
This commit is contained in:
ivost 2007-03-10 18:09:13 +00:00
parent ed87187cad
commit e7fb4e6a32
2 changed files with 143 additions and 246 deletions

View File

@ -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}

View File

@ -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';