2
0
Эх сурвалжийг харах

* x86_64-linux: assembler helpers syscalls do not need a stackframe

git-svn-id: trunk@48512 -
florian 4 жил өмнө
parent
commit
91586331b5

+ 18 - 6
rtl/linux/x86_64/syscall.inc

@@ -20,9 +20,10 @@
 procedure mcount; external name 'mcount';
 {$endif FPC_PROFILE}
 
-function FpSysCall(sysnr:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL0'];
+function FpSysCall(sysnr:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL0'];
 
 asm
+  pushq %rax              { keep stack aligned }
 {$ifdef FPC_PROFILE}
   pushq sysnr
   call mcount
@@ -37,11 +38,13 @@ asm
   call  seterrno@PLT
   movq  $-1,%rax
 .LSyscOK:
+  popq %rcx               { remove alignment }
 end;
 
-function FpSysCall(sysnr,param1 : TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL1'];
+function FpSysCall(sysnr,param1 : TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL1'];
 
 asm
+  pushq %rax              { keep stack aligned }
 {$ifdef FPC_PROFILE}
   pushq sysnr
   pushq param1
@@ -59,11 +62,13 @@ asm
   call  seterrno@PLT
   movq  $-1,%rax
 .LSyscOK:
+  popq %rcx               { remove alignment }
 end;
 
-function FpSysCall(sysnr,param1,param2 : TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL2'];
+function FpSysCall(sysnr,param1,param2 : TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL2'];
 
 asm
+  pushq %rax              { keep stack aligned }
 {$ifdef FPC_PROFILE}
   pushq sysnr
   pushq param1
@@ -84,11 +89,13 @@ asm
   call  seterrno@PLT
   movq  $-1,%rax
 .LSyscOK:
+  popq %rcx               { remove alignment }
 end;
 
-function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL3'];
+function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL3'];
 
 asm
+  pushq %rax              { keep stack aligned }
 {$ifdef FPC_PROFILE}
   pushq sysnr
   pushq param1
@@ -112,11 +119,13 @@ asm
   call  seterrno@PLT
   movq  $-1,%rax
 .LSyscOK:
+  popq %rcx               { remove alignment }
 end;
 
-function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL4'];
+function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL4'];
 
 asm
+  pushq %rax              { keep stack aligned }
 {$ifdef FPC_PROFILE}
   pushq sysnr
   pushq param1
@@ -143,11 +152,13 @@ asm
   call  seterrno@PLT
   movq  $-1,%rax
 .LSyscOK:
+  popq %rcx               { remove alignment }
 end;
 
-function FpSysCall(sysnr,param1,param2,param3,param4,param5 : TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL5'];
+function FpSysCall(sysnr,param1,param2,param3,param4,param5 : TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL5'];
 
 asm
+  pushq %rax              { keep stack aligned }
 {$ifdef FPC_PROFILE}
   pushq sysnr
   pushq param1
@@ -177,6 +188,7 @@ asm
   call  seterrno@PLT
   movq  $-1,%rax
 .LSyscOK:
+  popq %rcx               { remove alignment }
 end;