|
@@ -22,195 +22,170 @@
|
|
|
function FpSysCall(sysnr:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL0'];
|
|
|
|
|
|
asm
|
|
|
-{ load the registers... }
|
|
|
- movl sysnr,%eax
|
|
|
- int $0x80
|
|
|
- testl %eax,%eax
|
|
|
- jns .LSyscOK
|
|
|
- negl %eax
|
|
|
-{$ifdef VER1_0}
|
|
|
- movl %eax,Errno
|
|
|
-{$else}
|
|
|
- movl %eax,%edx
|
|
|
- movl FPC_THREADVAR_RELOCATE,%eax
|
|
|
- testl %eax,%eax
|
|
|
+ movq sysnr, %rax { Syscall number -> rax. }
|
|
|
+ movq %rsi, %rdi { shift arg1 - arg5. }
|
|
|
+ movq %rdx, %rsi
|
|
|
+ movq %rcx, %rdx
|
|
|
+ movq %r8, %r10
|
|
|
+ movq %r9, %r8
|
|
|
+ syscall { Do the system call. }
|
|
|
+ cmpq $-4095, %rax { Check %rax for error. }
|
|
|
+ jnae .LSyscOK { Jump to error handler if error. }
|
|
|
+ negq %rax
|
|
|
+ movq %rax,%rdx
|
|
|
+ movq FPC_THREADVAR_RELOCATE,%rax
|
|
|
+ testq %rax,%rax
|
|
|
jne .LThread
|
|
|
- movl %edx,Errno+4
|
|
|
+ movq %rdx,Errno+4
|
|
|
jmp .LNoThread
|
|
|
.LThread:
|
|
|
- pushl %edx
|
|
|
- pushl Errno
|
|
|
- call *%eax
|
|
|
- popl %edx
|
|
|
- movl %edx,(%eax)
|
|
|
+ pushq %rdx
|
|
|
+ pushq Errno
|
|
|
+ call *%rax
|
|
|
+ popq %rdx
|
|
|
+ movq %rdx,(%rax)
|
|
|
.LNoThread:
|
|
|
- movl $-1,%eax
|
|
|
-{$endif}
|
|
|
+ movq $-1,%rax
|
|
|
.LSyscOK:
|
|
|
end;
|
|
|
|
|
|
function FpSysCall(sysnr,param1 : TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL1'];
|
|
|
|
|
|
asm
|
|
|
-{ load the registers... }
|
|
|
- movl sysnr,%eax
|
|
|
- movl param1,%ebx
|
|
|
- int $0x80
|
|
|
- testl %eax,%eax
|
|
|
- jns .LSyscOK
|
|
|
- negl %eax
|
|
|
-{$ifdef VER1_0}
|
|
|
- movl %eax,Errno
|
|
|
-{$else}
|
|
|
- movl %eax,%edx
|
|
|
- movl FPC_THREADVAR_RELOCATE,%eax
|
|
|
- testl %eax,%eax
|
|
|
+ movq sysnr, %rax { Syscall number -> rax. }
|
|
|
+ movq param1, %rdi { shift arg1 - arg5. }
|
|
|
+ syscall { Do the system call. }
|
|
|
+ cmpq $-4095, %rax { Check %rax for error. }
|
|
|
+ jnae .LSyscOK { Jump to error handler if error. }
|
|
|
+ negq %rax
|
|
|
+ movq %rax,%rdx
|
|
|
+ movq FPC_THREADVAR_RELOCATE,%rax
|
|
|
+ testq %rax,%rax
|
|
|
jne .LThread
|
|
|
- movl %edx,Errno+4
|
|
|
+ movq %rdx,Errno+4
|
|
|
jmp .LNoThread
|
|
|
.LThread:
|
|
|
- pushl %edx
|
|
|
- pushl Errno
|
|
|
- call *%eax
|
|
|
- popl %edx
|
|
|
- movl %edx,(%eax)
|
|
|
+ pushq %rdx
|
|
|
+ pushq Errno
|
|
|
+ call *%rax
|
|
|
+ popq %rdx
|
|
|
+ movq %rdx,(%rax)
|
|
|
.LNoThread:
|
|
|
- movl $-1,%eax
|
|
|
-{$endif}
|
|
|
+ movq $-1,%rax
|
|
|
.LSyscOK:
|
|
|
end;
|
|
|
|
|
|
function FpSysCall(sysnr,param1,param2 : TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL2'];
|
|
|
|
|
|
asm
|
|
|
-{ load the registers... }
|
|
|
- movl sysnr,%eax
|
|
|
- movl param1,%ebx
|
|
|
- movl param2,%ecx
|
|
|
- int $0x80
|
|
|
- testl %eax,%eax
|
|
|
- jns .LSyscOK
|
|
|
- negl %eax
|
|
|
-{$ifdef VER1_0}
|
|
|
- movl %eax,Errno
|
|
|
-{$else}
|
|
|
- movl %eax,%edx
|
|
|
- movl FPC_THREADVAR_RELOCATE,%eax
|
|
|
- testl %eax,%eax
|
|
|
+ movq sysnr, %rax { Syscall number -> rax. }
|
|
|
+ movq param1, %rdi { shift arg1 - arg5. }
|
|
|
+ movq param2, %rsi
|
|
|
+ syscall { Do the system call. }
|
|
|
+ cmpq $-4095, %rax { Check %rax for error. }
|
|
|
+ jnae .LSyscOK { Jump to error handler if error. }
|
|
|
+ negq %rax
|
|
|
+ movq %rax,%rdx
|
|
|
+ movq FPC_THREADVAR_RELOCATE,%rax
|
|
|
+ testq %rax,%rax
|
|
|
jne .LThread
|
|
|
- movl %edx,Errno+4
|
|
|
+ movq %rdx,Errno+4
|
|
|
jmp .LNoThread
|
|
|
.LThread:
|
|
|
- pushl %edx
|
|
|
- pushl Errno
|
|
|
- call *%eax
|
|
|
- popl %edx
|
|
|
- movl %edx,(%eax)
|
|
|
+ pushq %rdx
|
|
|
+ pushq Errno
|
|
|
+ call *%rax
|
|
|
+ popq %rdx
|
|
|
+ movq %rdx,(%rax)
|
|
|
.LNoThread:
|
|
|
- movl $-1,%eax
|
|
|
-{$endif}
|
|
|
+ movq $-1,%rax
|
|
|
.LSyscOK:
|
|
|
end;
|
|
|
|
|
|
function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL3'];
|
|
|
|
|
|
asm
|
|
|
-{ load the registers... }
|
|
|
- movl sysnr,%eax
|
|
|
- movl param1,%ebx
|
|
|
- movl param2,%ecx
|
|
|
- movl param3,%edx
|
|
|
- int $0x80
|
|
|
- testl %eax,%eax
|
|
|
- jns .LSyscOK
|
|
|
- negl %eax
|
|
|
-{$ifdef VER1_0}
|
|
|
- movl %eax,Errno
|
|
|
-{$else}
|
|
|
- movl %eax,%edx
|
|
|
- movl FPC_THREADVAR_RELOCATE,%eax
|
|
|
- testl %eax,%eax
|
|
|
+ movq sysnr, %rax { Syscall number -> rax. }
|
|
|
+ movq param1, %rdi { shift arg1 - arg5. }
|
|
|
+ movq param2, %rsi
|
|
|
+ movq param3, %rdx
|
|
|
+ syscall { Do the system call. }
|
|
|
+ cmpq $-4095, %rax { Check %rax for error. }
|
|
|
+ jnae .LSyscOK { Jump to error handler if error. }
|
|
|
+ negq %rax
|
|
|
+ movq %rax,%rdx
|
|
|
+ movq FPC_THREADVAR_RELOCATE,%rax
|
|
|
+ testq %rax,%rax
|
|
|
jne .LThread
|
|
|
- movl %edx,Errno+4
|
|
|
+ movq %rdx,Errno+4
|
|
|
jmp .LNoThread
|
|
|
.LThread:
|
|
|
- pushl %edx
|
|
|
- pushl Errno
|
|
|
- call *%eax
|
|
|
- popl %edx
|
|
|
- movl %edx,(%eax)
|
|
|
+ pushq %rdx
|
|
|
+ pushq Errno
|
|
|
+ call *%rax
|
|
|
+ popq %rdx
|
|
|
+ movq %rdx,(%rax)
|
|
|
.LNoThread:
|
|
|
- movl $-1,%eax
|
|
|
-{$endif}
|
|
|
+ movq $-1,%rax
|
|
|
.LSyscOK:
|
|
|
end;
|
|
|
|
|
|
function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL4'];
|
|
|
|
|
|
asm
|
|
|
-{ load the registers... }
|
|
|
- movl sysnr,%eax
|
|
|
- movl param1,%ebx
|
|
|
- movl param2,%ecx
|
|
|
- movl param3,%edx
|
|
|
- movl param4,%esi
|
|
|
- int $0x80
|
|
|
- testl %eax,%eax
|
|
|
- jns .LSyscOK
|
|
|
- negl %eax
|
|
|
-{$ifdef VER1_0}
|
|
|
- movl %eax,Errno
|
|
|
-{$else}
|
|
|
- movl %eax,%edx
|
|
|
- movl FPC_THREADVAR_RELOCATE,%eax
|
|
|
- testl %eax,%eax
|
|
|
+ movq sysnr, %rax { Syscall number -> rax. }
|
|
|
+ movq param1, %rdi { shift arg1 - arg5. }
|
|
|
+ movq param2, %rsi
|
|
|
+ movq param3, %rdx
|
|
|
+ movq param4, %r10
|
|
|
+ syscall { Do the system call. }
|
|
|
+ cmpq $-4095, %rax { Check %rax for error. }
|
|
|
+ jnae .LSyscOK { Jump to error handler if error. }
|
|
|
+ negq %rax
|
|
|
+ movq %rax,%rdx
|
|
|
+ movq FPC_THREADVAR_RELOCATE,%rax
|
|
|
+ testq %rax,%rax
|
|
|
jne .LThread
|
|
|
- movl %edx,Errno+4
|
|
|
+ movq %rdx,Errno+4
|
|
|
jmp .LNoThread
|
|
|
.LThread:
|
|
|
- pushl %edx
|
|
|
- pushl Errno
|
|
|
- call *%eax
|
|
|
- popl %edx
|
|
|
- movl %edx,(%eax)
|
|
|
+ pushq %rdx
|
|
|
+ pushq Errno
|
|
|
+ call *%rax
|
|
|
+ popq %rdx
|
|
|
+ movq %rdx,(%rax)
|
|
|
.LNoThread:
|
|
|
- movl $-1,%eax
|
|
|
-{$endif}
|
|
|
+ movq $-1,%rax
|
|
|
.LSyscOK:
|
|
|
end;
|
|
|
|
|
|
function FpSysCall(sysnr,param1,param2,param3,param4,param5 : TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL5'];
|
|
|
|
|
|
asm
|
|
|
-{ load the registers... }
|
|
|
- movl sysnr,%eax
|
|
|
- movl param1,%ebx
|
|
|
- movl param2,%ecx
|
|
|
- movl param3,%edx
|
|
|
- movl param4,%esi
|
|
|
- movl param5,%edi
|
|
|
- int $0x80
|
|
|
- testl %eax,%eax
|
|
|
- jns .LSyscOK
|
|
|
- negl %eax
|
|
|
-{$ifdef VER1_0}
|
|
|
- movl %eax,Errno
|
|
|
-{$else}
|
|
|
- movl %eax,%edx
|
|
|
- movl FPC_THREADVAR_RELOCATE,%eax
|
|
|
- testl %eax,%eax
|
|
|
+ movq sysnr, %rax { Syscall number -> rax. }
|
|
|
+ movq param1, %rdi { shift arg1 - arg5. }
|
|
|
+ movq param2, %rsi
|
|
|
+ movq param3, %rdx
|
|
|
+ movq param4, %r10
|
|
|
+ movq param5, %r8
|
|
|
+ syscall { Do the system call. }
|
|
|
+ cmpq $-4095, %rax { Check %rax for error. }
|
|
|
+ jnae .LSyscOK { Jump to error handler if error. }
|
|
|
+ negq %rax
|
|
|
+ movq %rax,%rdx
|
|
|
+ movq FPC_THREADVAR_RELOCATE,%rax
|
|
|
+ testq %rax,%rax
|
|
|
jne .LThread
|
|
|
- movl %edx,Errno+4
|
|
|
+ movq %rdx,Errno+4
|
|
|
jmp .LNoThread
|
|
|
.LThread:
|
|
|
- pushl %edx
|
|
|
- pushl Errno
|
|
|
- call *%eax
|
|
|
- popl %edx
|
|
|
- movl %edx,(%eax)
|
|
|
+ pushq %rdx
|
|
|
+ pushq Errno
|
|
|
+ call *%rax
|
|
|
+ popq %rdx
|
|
|
+ movq %rdx,(%rax)
|
|
|
.LNoThread:
|
|
|
- movl $-1,%eax
|
|
|
-{$endif}
|
|
|
+ movq $-1,%rax
|
|
|
.LSyscOK:
|
|
|
end;
|
|
|
|
|
@@ -268,27 +243,16 @@ Procedure FpSysCall( callnr:TSysParam;var regs : SysCallregs );assembler;
|
|
|
}
|
|
|
{$define fpc_syscall_ok}
|
|
|
asm
|
|
|
-{ load the registers... }
|
|
|
- movl 12(%ebp),%eax
|
|
|
- movl 4(%eax),%ebx
|
|
|
- movl 8(%eax),%ecx
|
|
|
- movl 12(%eax),%edx
|
|
|
- movl 16(%eax),%esi
|
|
|
- movl 20(%eax),%edi
|
|
|
-{ set the call number }
|
|
|
- movl 8(%ebp),%eax
|
|
|
-{ Go ! }
|
|
|
- int $0x80
|
|
|
-{ Put back the registers... }
|
|
|
- pushl %eax
|
|
|
- movl 12(%ebp),%eax
|
|
|
- movl %edi,20(%eax)
|
|
|
- movl %esi,16(%eax)
|
|
|
- movl %edx,12(%eax)
|
|
|
- movl %ecx,8(%eax)
|
|
|
- movl %ebx,4(%eax)
|
|
|
- popl %ebx
|
|
|
- movl %ebx,(%eax)
|
|
|
+ pushq %rdi
|
|
|
+ movq sysnr, %rax { Syscall number -> rax. }
|
|
|
+ movq 8(%rdi),%rsi { load paras }
|
|
|
+ movq 16(%rdi),%rdx
|
|
|
+ movq 24(%rdi),%r10
|
|
|
+ movq 32(%rdi),%r8
|
|
|
+ movq (%rdi),%rdi
|
|
|
+ syscall { Do the system call. }
|
|
|
+ popq %rdi
|
|
|
+ movq %rax,(%rdi)
|
|
|
end;
|
|
|
|
|
|
{$ASMMODE DEFAULT}
|
|
@@ -301,7 +265,7 @@ Function SysCall( callnr:longint;var regs : SysCallregs ):longint;
|
|
|
}
|
|
|
begin
|
|
|
FpSysCall(callnr,regs);
|
|
|
- if regs.reg1<0 then
|
|
|
+ if regs.reg1>=$fffffffffffff001 then
|
|
|
begin
|
|
|
{$IFDEF SYSCALL_DEBUG}
|
|
|
If DoSysCallDebug then
|
|
@@ -340,10 +304,12 @@ end;
|
|
|
|
|
|
{
|
|
|
$Log$
|
|
|
- Revision 1.2 2004-02-05 01:16:12 florian
|
|
|
+ Revision 1.3 2004-02-06 15:58:21 florian
|
|
|
+ * fixed x86-64 assembler problems
|
|
|
+
|
|
|
+ Revision 1.2 2004/02/05 01:16:12 florian
|
|
|
+ completed x86-64/linux system unit
|
|
|
|
|
|
Revision 1.1 2003/04/30 22:11:06 florian
|
|
|
+ for a lot of x86-64 dependend files mostly dummies added
|
|
|
}
|
|
|
-
|