瀏覽代碼

* don't destroy registers in syscall helpers

git-svn-id: trunk@6342 -
florian 18 年之前
父節點
當前提交
9fe04923ad
共有 1 個文件被更改,包括 34 次插入0 次删除
  1. 34 0
      rtl/linux/arm/syscall.inc

+ 34 - 0
rtl/linux/arm/syscall.inc

@@ -27,7 +27,10 @@ function FpSysCall(sysnr:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYS
   This function puts the registers in place, does the call, and then
   This function puts the registers in place, does the call, and then
   copies back the registers as they are after the SysCall.
   copies back the registers as they are after the SysCall.
 }
 }
+var
+  _r4 : dword;
 asm
 asm
+  str  r4,_r4
   swi  #0x900071
   swi  #0x900071
   cmn  r0,#126
   cmn  r0,#126
   bls  .LDone
   bls  .LDone
@@ -50,6 +53,7 @@ asm
 .Lthread_var:
 .Lthread_var:
   .word fpc_threadvar_relocate_proc
   .word fpc_threadvar_relocate_proc
 .LDone:
 .LDone:
+  ldr r4,_r4
 end ['r4'];
 end ['r4'];
 
 
 
 
@@ -58,7 +62,10 @@ function FpSysCall(sysnr,param1:TSysParam):TSysResult; assembler;[public,alias:'
   This function puts the registers in place, does the call, and then
   This function puts the registers in place, does the call, and then
   copies back the registers as they are after the SysCall.
   copies back the registers as they are after the SysCall.
 }
 }
+var
+  _r4 : dword;
 asm
 asm
+  str  r4,_r4
   swi  #0x900071
   swi  #0x900071
   cmn  r0,#126
   cmn  r0,#126
   bls  .LDone
   bls  .LDone
@@ -81,6 +88,7 @@ asm
 .Lthread_var:
 .Lthread_var:
   .word fpc_threadvar_relocate_proc
   .word fpc_threadvar_relocate_proc
 .LDone:
 .LDone:
+  ldr r4,_r4
 end ['r4'];
 end ['r4'];
 
 
 
 
@@ -89,7 +97,10 @@ function FpSysCall(sysnr,param1,param2:TSysParam):TSysResult; assembler;[public,
   This function puts the registers in place, does the call, and then
   This function puts the registers in place, does the call, and then
   copies back the registers as they are after the SysCall.
   copies back the registers as they are after the SysCall.
 }
 }
+var
+  _r4 : dword;
 asm
 asm
+  str  r4,_r4
   swi  #0x900071
   swi  #0x900071
   cmn  r0,#126
   cmn  r0,#126
   bls  .LDone
   bls  .LDone
@@ -112,6 +123,7 @@ asm
 .Lthread_var:
 .Lthread_var:
   .word fpc_threadvar_relocate_proc
   .word fpc_threadvar_relocate_proc
 .LDone:
 .LDone:
+  ldr r4,_r4
 end ['r4'];
 end ['r4'];
 
 
 
 
@@ -120,7 +132,10 @@ function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler;[
   This function puts the registers in place, does the call, and then
   This function puts the registers in place, does the call, and then
   copies back the registers as they are after the SysCall.
   copies back the registers as they are after the SysCall.
 }
 }
+var
+  _r4 : dword;
 asm
 asm
+  str  r4,_r4
   swi  #0x900071
   swi  #0x900071
   cmn  r0,#126
   cmn  r0,#126
   bls  .LDone
   bls  .LDone
@@ -143,6 +158,7 @@ asm
 .Lthread_var:
 .Lthread_var:
   .word fpc_threadvar_relocate_proc
   .word fpc_threadvar_relocate_proc
 .LDone:
 .LDone:
+  ldr r4,_r4
 end ['r4'];
 end ['r4'];
 
 
 
 
@@ -151,7 +167,10 @@ function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; asse
   This function puts the registers in place, does the call, and then
   This function puts the registers in place, does the call, and then
   copies back the registers as they are after the SysCall.
   copies back the registers as they are after the SysCall.
 }
 }
+var
+  _r4 : dword;
 asm
 asm
+  str  r4,_r4
   ldr  r4,param4
   ldr  r4,param4
   swi  #0x900071
   swi  #0x900071
   cmn  r0,#126
   cmn  r0,#126
@@ -175,6 +194,7 @@ asm
 .Lthread_var:
 .Lthread_var:
   .word fpc_threadvar_relocate_proc
   .word fpc_threadvar_relocate_proc
 .LDone:
 .LDone:
+  ldr r4,_r4
 end ['r4'];
 end ['r4'];
 
 
 
 
@@ -183,7 +203,11 @@ function FpSysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResul
   This function puts the registers in place, does the call, and then
   This function puts the registers in place, does the call, and then
   copies back the registers as they are after the SysCall.
   copies back the registers as they are after the SysCall.
 }
 }
+var
+  _r4,_r5 : dword;
 asm
 asm
+  str  r4,_r4
+  str  r5,_r5
   ldr  r5,param5
   ldr  r5,param5
   ldr  r4,param4
   ldr  r4,param4
   swi  #0x900071
   swi  #0x900071
@@ -208,6 +232,8 @@ asm
 .Lthread_var:
 .Lthread_var:
   .word fpc_threadvar_relocate_proc
   .word fpc_threadvar_relocate_proc
 .LDone:
 .LDone:
+  ldr r4,_r4
+  ldr r5,_r5
 end ['r4','r5'];
 end ['r4','r5'];
 
 
 
 
@@ -216,7 +242,12 @@ function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TS
   This function puts the registers in place, does the call, and then
   This function puts the registers in place, does the call, and then
   copies back the registers as they are after the SysCall.
   copies back the registers as they are after the SysCall.
 }
 }
+var
+  _r4,_r5,_r6 : dword;
 asm
 asm
+  str  r4,_r4
+  str  r5,_r5
+  str  r6,_r6
   ldr  r6,param6
   ldr  r6,param6
   ldr  r5,param5
   ldr  r5,param5
   ldr  r4,param4
   ldr  r4,param4
@@ -242,6 +273,9 @@ asm
 .Lthread_var:
 .Lthread_var:
   .word fpc_threadvar_relocate_proc
   .word fpc_threadvar_relocate_proc
 .LDone:
 .LDone:
+  ldr r4,_r4
+  ldr r5,_r5
+  ldr r6,_r6
 end ['r4','r5','r6'];
 end ['r4','r5','r6'];