Selaa lähdekoodia

* call seterrno instead of manually handling the setting setting the errno
threadvar (and having to deal with differences between the ELFv1 and ELFv2
ABIs regarding indirect function calls, + future ability to have the
compiler generate PIC for those routines)
o includes workaround for lack of linkage area size allocation in current
released PPC64 versions, remove after 3.0.2 has been released

git-svn-id: trunk@30213 -

Jonas Maebe 10 vuotta sitten
vanhempi
commit
82d92dbf50
1 muutettua tiedostoa jossa 63 lisäystä ja 314 poistoa
  1. 63 314
      rtl/linux/powerpc64/syscall.inc

+ 63 - 314
rtl/linux/powerpc64/syscall.inc

@@ -33,57 +33,21 @@ function FpSysCall(sysnr:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYS
   copies back the registers as they are after the SysCall.
 }
 var
-  temp : qword;
+  { workaround for incomplete linkage area reservation by FPC 3.0.0 and earlier,
+    remove after 3.0.2 is the minimum bootstrap version }
+  dummy: array[1..4] of ptruint;
   retaddress: ptruint;
 asm
   mr r0, r3
   sc
   bns .LDone
-  lis r10, (fpc_threadvar_relocate_proc)@highesta
-  ori r10, r10, (fpc_threadvar_relocate_proc)@highera
-  sldi r10, r10, 32
-  oris r10, r10, (fpc_threadvar_relocate_proc)@ha
-  ld r10, (fpc_threadvar_relocate_proc)@l(r10)
-  
-  cmpdi r10, 0
-  bne .LThreaded
-  lis r4, (Errno+8)@highesta
-  ori r4, r4, (Errno+8)@highera
-  sldi r4, r4, 32
-  oris r4, r4, (Errno+8)@ha
-  stw r3, (Errno+8)@l(r4)
-  b .LFailed
-.LThreaded:
-  std r3, temp
-  mflr r3
-  std r3, retaddress
-
-  // load actual function entry into r9
-  ld r9, 0(r10)
-  // save old TOC value
-  std r2, 40(r1)
-  // move function entry into ctr
-  mtctr r9
-  // load new TOC value
-  ld r2, 8(r10)
-  // load environment pointer from TOC
-  ld r11, 16(r10)
-  // load parameters
-  lis r4, (errno)@highesta
-  ori r4, r4, (errno)@highera
-  sldi r4, r4, 32
-  oris r4, r4, (errno)@ha
-  lwz r3, (errno)@l(r4)
-  bctrl
-  // restore old TOC value
-  ld r2, 40(r1)
-  
-  ld r4, temp
-  ld r5, retaddress
-  std r4, 0(r3)
-  mtlr r5
-.LFailed:
+  mflr r4
+  std r4, retaddress
+  bl seterrno
+  nop
+  ld r4, retaddress
   li r3, -1
+  mtlr r4
 .LDone:
 end;
 
@@ -93,58 +57,22 @@ function FpSysCall(sysnr,param1:TSysParam):TSysResult; assembler;[public,alias:'
   copies back the registers as they are after the SysCall.
 }
 var
-  temp : qword;
+  { workaround for incomplete linkage area reservation by FPC 3.0.0 and earlier,
+    remove after 3.0.2 is the minimum bootstrap version }
+  dummy: array[1..4] of ptruint;
   retaddress: ptruint;
 asm
   mr r0, r3
   mr r3, r4
   sc
   bns .LDone
-  lis r10, (fpc_threadvar_relocate_proc)@highesta
-  ori r10, r10, (fpc_threadvar_relocate_proc)@highera
-  sldi r10, r10, 32
-  oris r10, r10, (fpc_threadvar_relocate_proc)@ha
-  ld r10, (fpc_threadvar_relocate_proc)@l(r10)
-  
-  cmpdi r10, 0
-  bne .LThreaded
-  lis r4, (Errno+8)@highesta
-  ori r4, r4, (Errno+8)@highera
-  sldi r4, r4, 32
-  oris r4, r4, (Errno+8)@ha
-  stw r3, (Errno+8)@l(r4)
-  b .LFailed
-.LThreaded:
-  std r3, temp
-  mflr r3
-
-  // load actual function entry into r9
-  ld r9, 0(r10)
-  // save old TOC value
-  std r2, 40(r1)
-  // move function entry into ctr
-  mtctr r9
-  // load new TOC value
-  ld r2, 8(r10)
-  // load environment pointer from TOC
-  ld r11, 16(r10)
-  // load parameters
-  lis r4, (errno)@highesta
-  ori r4, r4, (errno)@highera
-  sldi r4, r4, 32
-  oris r4, r4, (errno)@ha
-  std r3, retaddress
-  lwz r3, (errno)@l(r4)
-  bctrl
-  // restore old TOC value
-  ld r2, 40(r1)
-
-  ld r4, temp
-  ld r5, retaddress
-  std r4, 0(r3)
-  mtlr r5
-.LFailed:
+  mflr r4
+  std r4, retaddress
+  bl seterrno
+  nop
+  ld r4, retaddress
   li r3, -1
+  mtlr r4
 .LDone:
 end;
 
@@ -154,7 +82,9 @@ function FpSysCall(sysnr,param1,param2:TSysParam):TSysResult; assembler;[public,
   copies back the registers as they are after the SysCall.
 }
 var
-  temp : qword;
+  { workaround for incomplete linkage area reservation by FPC 3.0.0 and earlier,
+    remove after 3.0.2 is the minimum bootstrap version }
+  dummy: array[1..4] of ptruint;
   retaddress: ptruint;
 asm
   mr r0, r3
@@ -162,50 +92,13 @@ asm
   mr r4, r5
   sc
   bns .LDone
-  lis r10, (fpc_threadvar_relocate_proc)@highesta
-  ori r10, r10, (fpc_threadvar_relocate_proc)@highera
-  sldi r10, r10, 32
-  oris r10, r10, (fpc_threadvar_relocate_proc)@ha
-  ld r10, (fpc_threadvar_relocate_proc)@l(r10)
-  
-  cmpdi r10, 0
-  bne .LThreaded
-  lis r4, (Errno+8)@highesta
-  ori r4, r4, (Errno+8)@highera
-  sldi r4, r4, 32
-  oris r4, r4, (Errno+8)@ha
-  stw r3, (Errno+8)@l(r4)
-  b .LFailed
-.LThreaded:
-  std r3, temp
-  mflr r3
-  // load actual function entry into r9
-  ld r9, 0(r10)
-  // save old TOC value
-  std r2, 40(r1)
-  // move function entry into ctr
-  mtctr r9
-  // load new TOC value
-  ld r2, 8(r10)
-  // load environment pointer from TOC
-  ld r11, 16(r10)
-  // load parameters
-  lis r4, (errno)@highesta
-  ori r4, r4, (errno)@highera
-  sldi r4, r4, 32
-  oris r4, r4, (errno)@ha
-  std r3, retaddress
-  lwz r3, (errno)@l(r4)
-  bctrl
-  // restore old TOC value
-  ld r2, 40(r1)
-
-  ld r4, temp
-  ld r5, retaddress
-  std r4, 0(r3)
-  mtlr r5
-.LFailed:
+  mflr r4
+  std r4, retaddress
+  bl seterrno
+  nop
+  ld r4, retaddress
   li r3, -1
+  mtlr r4
 .LDone:
 end;
 
@@ -216,7 +109,9 @@ function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler;[
   copies back the registers as they are after the SysCall.
 }
 var
-  temp : qword;
+  { workaround for incomplete linkage area reservation by FPC 3.0.0 and earlier,
+    remove after 3.0.2 is the minimum bootstrap version }
+  dummy: array[1..4] of ptruint;
   retaddress: ptruint;
 asm
   mr r0, r3
@@ -225,51 +120,13 @@ asm
   mr r5, r6
   sc
   bns .LDone
-  lis r10, (fpc_threadvar_relocate_proc)@highesta
-  ori r10, r10, (fpc_threadvar_relocate_proc)@highera
-  sldi r10, r10, 32
-  oris r10, r10, (fpc_threadvar_relocate_proc)@ha
-  ld r10, (fpc_threadvar_relocate_proc)@l(r10)
-  
-  cmpdi r10, 0
-  bne .LThreaded
-  lis r4, (Errno+8)@highesta
-  ori r4, r4, (Errno+8)@highera
-  sldi r4, r4, 32
-  oris r4, r4, (Errno+8)@ha
-  stw r3, (Errno+8)@l(r4)
-  b .LFailed
-.LThreaded:
-  std r3, temp
-  mflr r3
-
-  // load actual function entry into r9
-  ld r9, 0(r10)
-  // save old TOC value
-  std r2, 40(r1)
-  // move function entry into ctr
-  mtctr r9
-  // load new TOC value
-  ld r2, 8(r10)
-  // load environment pointer from TOC
-  ld r11, 16(r10)
-  // load parameters
-  lis r4, (errno)@highesta
-  ori r4, r4, (errno)@highera
-  sldi r4, r4, 32
-  oris r4, r4, (errno)@ha
-  std r3, retaddress
-  lwz r3, (errno)@l(r4)
-  bctrl
-
-  // restore old TOC value
-  ld r2, 40(r1)
-  ld r4, temp
-  ld r5, retaddress
-  std r4, 0(r3)
-  mtlr r5
-.LFailed:
+  mflr r4
+  std r4, retaddress
+  bl seterrno
+  nop
+  ld r4, retaddress
   li r3, -1
+  mtlr r4
 .LDone:
 end;
 
@@ -280,7 +137,9 @@ function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; asse
   copies back the registers as they are after the SysCall.
 }
 var
-  temp : qword;
+  { workaround for incomplete linkage area reservation by FPC 3.0.0 and earlier,
+    remove after 3.0.2 is the minimum bootstrap version }
+  dummy: array[1..4] of ptruint;
   retaddress: ptruint;
 asm
   mr r0, r3
@@ -290,51 +149,13 @@ asm
   mr r6, r7
   sc
   bns .LDone
-  lis r10, (fpc_threadvar_relocate_proc)@highesta
-  ori r10, r10, (fpc_threadvar_relocate_proc)@highera
-  sldi r10, r10, 32
-  oris r10, r10, (fpc_threadvar_relocate_proc)@ha
-  ld r10, (fpc_threadvar_relocate_proc)@l(r10)
-  
-  cmpdi r10, 0
-  bne .LThreaded
-  lis r4, (Errno+8)@highesta
-  ori r4, r4, (Errno+8)@highera
-  sldi r4, r4, 32
-  oris r4, r4, (Errno+8)@ha
-  stw r3, (Errno+8)@l(r4)
-  b .LFailed
-.LThreaded:
-  std r3, temp
-  mflr r3
-
-  // load actual function entry into r9
-  ld r9, 0(r10)
-  // save old TOC value
-  std r2, 40(r1)
-  // move function entry into ctr
-  mtctr r9
-  // load new TOC value
-  ld r2, 8(r10)
-  // load environment pointer from TOC
-  ld r11, 16(r10)
-  // load parameters
-  lis r4, (errno)@highesta
-  ori r4, r4, (errno)@highera
-  sldi r4, r4, 32
-  oris r4, r4, (errno)@ha
-  std r3, retaddress
-  lwz r3, (errno)@l(r4)
-  bctrl
-
-  // restore old TOC value
-  ld r2, 40(r1)
-  ld r4, temp
-  ld r5, retaddress
-  std r4, 0(r3)
-  mtlr r5
-.LFailed:
+  mflr r4
+  std r4, retaddress
+  bl seterrno
+  nop
+  ld r4, retaddress
   li r3, -1
+  mtlr r4
 .LDone:
 end;
 
@@ -345,7 +166,9 @@ function FpSysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResul
   copies back the registers as they are after the SysCall.
 }
 var
-  temp : qword;
+  { workaround for incomplete linkage area reservation by FPC 3.0.0 and earlier,
+    remove after 3.0.2 is the minimum bootstrap version }
+  dummy: array[1..4] of ptruint;
   retaddress: ptruint;
 asm
   mr r0, r3
@@ -356,51 +179,13 @@ asm
   mr r7, r8
   sc
   bns .LDone
-  lis r10, (fpc_threadvar_relocate_proc)@highesta
-  ori r10, r10, (fpc_threadvar_relocate_proc)@highera
-  sldi r10, r10, 32
-  oris r10, r10, (fpc_threadvar_relocate_proc)@ha
-  ld r10, (fpc_threadvar_relocate_proc)@l(r10)
-  
-  cmpdi r10, 0
-  bne  .LThreaded
-  lis r4, (Errno+8)@highesta
-  ori r4, r4, (Errno+8)@highera
-  sldi r4, r4, 32
-  oris r4, r4, (Errno+8)@ha
-  stw r3, (Errno+8)@l(r4)
-  b .LFailed
-.LThreaded:
-  std r3, temp
-  mflr r3
-
-  // load actual function entry into r9
-  ld r9, 0(r10)
-  // save old TOC value
-  std r2, 40(r1)
-  // move function entry into ctr
-  mtctr r9
-  // load new TOC value
-  ld r2, 8(r10)
-  // load environment pointer from TOC
-  ld r11, 16(r10)
-  // load parameters
-  lis r4, (errno)@highesta
-  ori r4, r4, (errno)@highera
-  sldi r4, r4, 32
-  oris r4, r4, (errno)@ha
-  std r3, retaddress
-  lwz r3, (errno)@l(r4)
-  bctrl
-  // restore old TOC value
-  ld r2, 40(r1)
-
-  ld r4, temp
-  ld r5, retaddress
-  std r4, 0(r3)
-  mtlr r5
-.LFailed:
+  mflr r4
+  std r4, retaddress
+  bl seterrno
+  nop
+  ld r4, retaddress
   li r3, -1
+  mtlr r4
 .LDone:
 end;
 
@@ -411,7 +196,9 @@ function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TS
   copies back the registers as they are after the SysCall.
 }
 var
-  temp : qword;
+  { workaround for incomplete linkage area reservation by FPC 3.0.0 and earlier,
+    remove after 3.0.2 is the minimum bootstrap version }
+  dummy: array[1..4] of ptruint;
   retaddress: ptruint;
 asm
   mr r0, r3
@@ -423,50 +210,12 @@ asm
   mr r8, r9
   sc
   bns .LDone
-  lis r10, (fpc_threadvar_relocate_proc)@highesta
-  ori r10, r10, (fpc_threadvar_relocate_proc)@highera
-  sldi r10, r10, 32
-  oris r10, r10, (fpc_threadvar_relocate_proc)@ha
-  ld r10, (fpc_threadvar_relocate_proc)@l(r10)
-  
-  cmpdi r10, 0
-  bne .LThreaded
-  lis r4, (Errno+8)@highesta
-  ori r4, r4, (Errno+8)@highera
-  sldi r4, r4, 32
-  oris r4, r4, (Errno+8)@ha
-  stw r3, (Errno+8)@l(r4)
-  b .LFailed
-.LThreaded:
-  std r3, temp
-  mflr r3
-
-  // load actual function entry into r9
-  ld r9, 0(r10)
-  // save old TOC value
-  std r2, 40(r1)
-  // move function entry into ctr
-  mtctr r9
-  // load new TOC value
-  ld r2, 8(r10)
-  // load environment pointer from TOC
-  ld r11, 16(r10)
-  // load parameters
-  lis r4, (errno)@highesta
-  ori r4, r4, (errno)@highera
-  sldi r4, r4, 32
-  oris r4, r4, (errno)@ha
-  std r3, retaddress
-  lwz r3, (errno)@l(r4)
-  bctrl
-  // restore old TOC value
-  ld r2, 40(r1)
-
-  ld r4, temp
-  ld r5, retaddress
-  std r4, 0(r3)
-  mtlr r5
-.LFailed:
+  mflr r4
+  std r4, retaddress
+  bl seterrno
+  nop
+  ld r4, retaddress
   li r3, -1
+  mtlr r4
 .LDone:
 end;