fpc/rtl/bsd/x86_64/syscall.inc
2004-05-18 20:05:01 +00:00

273 lines
6.5 KiB
PHP

{
$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+8
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+8
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+8
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+8
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+8
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+8
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+8
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+8
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
movq $syscall_nr__syscall, %rax
mov %rcx,%r10
call actualsyscall
add $16,%rsp
end;
{
$Log$
Revision 1.3 2004-05-18 20:05:01 marco
* errno+4 becomes errno+8
Revision 1.2 2004/05/16 21:01:23 marco
* syscallnr for __syscall entered
Revision 1.1 2004/05/16 20:48:32 marco
* Initial versions
}