* Initial versions

This commit is contained in:
marco 2004-05-16 20:48:32 +00:00
parent f9141c8d5e
commit 06dd389fce
2 changed files with 346 additions and 0 deletions

266
rtl/bsd/x86_64/syscall.inc Normal file
View File

@ -0,0 +1,266 @@
{
$Id$
This file is part of the Free Pascal run time library.
Copyright (c) 1999-2004 Marco van de Voort
member of the Free Pascal development team.
The syscalls for the *BSD AMD64 rtl
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************}
{
Origin of this file: copied from linux/x86_64 dir, blended with the
freebsd x86 changes and checked against objdump of a
x86_64/freebsdprog
- jge directly behind the syscall to branch on non-error
- rcx is used as scratch reg (fpc/Linux-x86_64 uses edx)
- More 6 and 7 param dosyscall because of the __syscall problem
}
{$ASMMODE GAS}
function do_sysCall(sysnr:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL0'];
asm
movq sysnr, %rax { Syscall number -> rax. }
syscall { Do the system call. }
jge .LSyscOK { branch to exit if ok, errorhandler otherwise}
movq %rax,%rcx
movq FPC_THREADVAR_RELOCATE,%rax
testq %rax,%rax
jne .LThread
movq %rcx,Errno+4
jmp .LNoThread
.LThread:
pushq %rcx
pushq Errno
call *%rax
popq %rcx
movq %rcx,(%rax)
.LNoThread:
movq $-1,%rax
movq rax,%rdx
.LSyscOK:
end;
function do_sysCall(sysnr,param1 : TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL1'];
asm
movq sysnr, %rax { Syscall number -> rax. }
movq param1, %rdi { shift arg1 - arg1. }
syscall { Do the system call. }
jge .LSyscOK { branch to exit if ok, errorhandler otherwise}
movq %rax,%rcx
movq FPC_THREADVAR_RELOCATE,%rax
testq %rax,%rax
jne .LThread
movq %rcx,Errno+4
jmp .LNoThread
.LThread:
pushq %rcx
pushq Errno
call *%rax
popq %rcx
movq %rcx,(%rax)
.LNoThread:
movq $-1,%rax
movq rax,%rdx
.LSyscOK:
end;
function do_sysCall(sysnr,param1,param2 : TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL2'];
asm
movq sysnr, %rax { Syscall number -> rax. }
movq param1, %rdi { shift arg1 - arg2. }
movq param2, %rsi
mov %rcx,%r10
syscall { Do the system call. }
jge .LSyscOK { branch to exit if ok, errorhandler otherwise}
movq %rax,%rcx
movq FPC_THREADVAR_RELOCATE,%rax
testq %rax,%rax
jne .LThread
movq %rcx,Errno+4
jmp .LNoThread
.LThread:
pushq %rcx
pushq Errno
call *%rax
popq %rcx
movq %rcx,(%rax)
.LNoThread:
movq $-1,%rax
movq rax,%rdx
.LSyscOK:
end;
function do_sysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL3'];
asm
movq sysnr, %rax { Syscall number -> rax. }
movq param1, %rdi { shift arg1 - arg3. }
movq param2, %rsi
movq param3, %rdx
mov %rcx,%r10
syscall { Do the system call. }
jge .LSyscOK { branch to exit if ok, errorhandler otherwise}
movq %rax,%rcx
movq FPC_THREADVAR_RELOCATE,%rax
testq %rax,%rax
jne .LThread
movq %rcx,Errno+4
jmp .LNoThread
.LThread:
pushq %rcx
pushq Errno
call *%rax
popq %rcx
movq %rcx,(%rax)
.LNoThread:
movq $-1,%rax
movq rax,%rdx
.LSyscOK:
end;
function do_sysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL4'];
asm
movq sysnr, %rax { Syscall number -> rax. }
movq param1, %rdi { shift arg1 - arg5. }
movq param2, %rsi
movq param3, %rdx
movq param4, %r10
mov %rcx,%r10
syscall { Do the system call. }
jge .LSyscOK { branch to exit if ok, errorhandler otherwise}
movq %rax,%rcx
movq FPC_THREADVAR_RELOCATE,%rax
testq %rax,%rax
jne .LThread
movq %rcx,Errno+4
jmp .LNoThread
.LThread:
pushq %rcx
pushq Errno
call *%rax
popq %rcx
movq %rcx,(%rax)
.LNoThread:
movq $-1,%rax
movq rax,%rdx
.LSyscOK:
end;
function do_sysCall(sysnr,param1,param2,param3,param4,param5 : TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL5'];
asm
movq sysnr, %rax { Syscall number -> rax. }
movq param1, %rdi { shift arg1 - arg5. }
movq param2, %rsi
movq param3, %rdx
movq param4, %r10
movq param5, %r8
mov %rcx,%r10
syscall { Do the system call. }
jge .LSyscOK { branch to exit if ok, errorhandler otherwise}
movq %rax,%rcx
movq FPC_THREADVAR_RELOCATE,%rax
testq %rax,%rax
jne .LThread
movq %rcx,Errno+4
jmp .LNoThread
.LThread:
pushq %rcx
pushq Errno
call *%rax
popq %rcx
movq %rcx,(%rax)
.LNoThread:
movq $-1,%rax
movq rax,%rdx
.LSyscOK:
end;
function do_sysCall(sysnr,param1,param2,param3,param4,param5,param6 : TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL6'];
asm
movq sysnr, %rax { Syscall number -> rax. }
movq param1, %rdi { shift arg1 - arg6. }
movq param2, %rsi
movq param3, %rdx
movq param4, %r10
movq param5, %r8
movq param6, %r9
mov %rcx,%r10
syscall { Do the system call. }
jge .LSyscOK { branch to exit if ok, errorhandler otherwise}
movq %rax,%rcx
movq FPC_THREADVAR_RELOCATE,%rax
testq %rax,%rax
jne .LThread
movq %rcx,Errno+4
jmp .LNoThread
.LThread:
pushq %rcx
pushq Errno
call *%rax
popq %rcx
movq %rcx,(%rax)
.LNoThread:
movq $-1,%rax
movq rax,%rdx
.LSyscOK:
end;
procedure actualsyscall; assembler; {inline requires a dummy push IIRC}
asm
syscall
jge .LSyscOK { branch to exit if ok, errorhandler otherwise}
movq %rax,%rcx
movq FPC_THREADVAR_RELOCATE,%rax
testq %rax,%rax
jne .LThread
movq %rcx,Errno+4
jmp .LNoThread
.LThread:
pushq %rcx
pushq Errno
call *%rax
popq %rcx
movq %rcx,(%rax)
.LNoThread:
movq $-1,%rax
movq rax,%rdx
.LSyscOK:
end;
function do__sysCall(sysnr,param1,param2,param3,param4,param5,param6,param7,Param8:TSysParam):TSysResult; {$ifndef VER1_0} oldfpccall;{$endif} external name 'FPC_DOSYS8';
// Hmm, we have to do something different :)
asm
movq param8,%rax
push %rax
movq param7,%rax
push %rax
xorq %rax, %rax
mov %rcx,%r10
call actualsyscall
add $16,%rsp
end;
{
$Log$
Revision 1.1 2004-05-16 20:48:32 marco
* Initial versions
}

View File

@ -0,0 +1,80 @@
{
$Id$
Copyright (c) 2002 by Marco van de Voort
Header for syscall in system unit for i386 *BSD.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
****************************************************************************
}
{$ifdef FPC_USE_SYSCALL}
Type
TSysResult = int64; // 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.
TSysParam = int64;
function do_sysCall(sysnr:TSysParam):TSysResult;{$ifndef VER1_0} oldfpccall;{$endif} external name 'FPC_DOSYS0';
function do_sysCall(sysnr,param1:TSysParam):TSysResult; {$ifndef VER1_0} oldfpccall;{$endif}external name 'FPC_DOSYS1';
function do_sysCall(sysnr,param1,param2:TSysParam):TSysResult; {$ifndef VER1_0} oldfpccall;{$endif} external name 'FPC_DOSYS2';
function do_sysCall(sysnr,param1,param2,param3:TSysParam):TSysResult;{$ifndef VER1_0} oldfpccall;{$endif} external name 'FPC_DOSYS3';
function do_sysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult;{$ifndef VER1_0} oldfpccall;{$endif} external name 'FPC_DOSYS4';
function do_sysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult; {$ifndef VER1_0} oldfpccall;{$endif} external name 'FPC_DOSYS5';
function do_sysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):int64;{$ifndef VER1_0} oldfpccall;{$endif} external name 'FPC_DOSYS6';
// special
function do__sysCall(sysnr,param1,param2,param3,param4,param5,param6,param7,Param8:TSysParam):TSysResult; {$ifndef VER1_0} oldfpccall;{$endif} external name 'FPC_DOSYS8';
{$endif}
{
$Log$
Revision 1.1 2004-05-16 20:48:32 marco
* Initial versions
Revision 1.9 2003/12/30 12:26:21 marco
* FPC_USE_LIBC
Revision 1.8 2003/09/15 20:08:49 marco
* small fixes. FreeBSD now cycles
Revision 1.7 2003/09/14 20:15:01 marco
* Unix reform stage two. Remove all calls from Unix that exist in Baseunix.
Revision 1.6 2003/05/30 19:58:40 marco
* Getting NetBSD/i386 to compile.
Revision 1.5 2003/01/05 19:01:28 marco
* FreeBSD compiles now with baseunix mods.
Revision 1.4 2002/10/16 18:44:00 marco
* and again for ftruncate (sigh)
Revision 1.3 2002/10/16 18:41:14 marco
* the 7 param syscall (for lseek and truncate) now returns a int64.
Revision 1.2 2002/09/07 16:01:17 peter
* old logs removed and tabs fixed
Revision 1.1 2002/08/20 08:28:14 marco
* Updates for new errno scheme.
}