PLT trampolines for s390-32.
authordrepper <drepper>
Sat, 29 Jan 2005 00:01:44 +0000 (00:01 +0000)
committerdrepper <drepper>
Sat, 29 Jan 2005 00:01:44 +0000 (00:01 +0000)
sysdeps/s390/s390-32/dl-trampoline.S [new file with mode: 0644]

diff --git a/sysdeps/s390/s390-32/dl-trampoline.S b/sysdeps/s390/s390-32/dl-trampoline.S
new file mode 100644 (file)
index 0000000..4ee2295
--- /dev/null
@@ -0,0 +1,133 @@
+/* PLT trampolines.  s390 version.
+   Copyright (C) 2005 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+/* This code is used in dl-runtime.c to call the `fixup' function
+   and then redirect to the address it returns.  */
+
+/* The PLT stubs will call _dl_runtime_resolve/_dl_runtime_profile
+ * with the following linkage:
+ *   r2 - r6 : parameter registers
+ *   f0, f2 : floating point parameter registers
+ *   24(r15), 28(r15) : PLT arguments PLT1, PLT2
+ *   96(r15) : additional stack parameters
+ * The normal clobber rules for function calls apply:
+ *   r0 - r5 : call clobbered
+ *   r6 - r13 :         call saved
+ *   r14 : return address (call clobbered)
+ *   r15 : stack pointer (call saved)
+ *   f4, f6 : call saved
+ *   f0 - f3, f5, f7 - f15 : call clobbered
+ */
+
+#include <sysdep.h>
+
+       .text
+       .globl _dl_runtime_resolve
+       .type _dl_runtime_resolve, @function
+       cfi_startproc
+       .align 16
+_dl_runtime_resolve:
+       stm    %r2,%r5,32(%r15)         # save registers
+       st     %r14,8(%r15)
+       lr     %r0,%r15                 # create stack frame
+       ahi    %r15,-96
+       cfi_adjust_cfa_offset (96)
+       st     0,0(%r15)
+       lm     %r2,%r3,120(%r15)        # load args saved by PLT
+       basr   %r1,0
+0:     l      %r14,1f-0b(%r1)
+       bas    %r14,0(%r14,%r1)         # call resolver
+       lr     %r1,%r2                  # function addr returned in r2
+       ahi    %r15,96                  # remove stack frame
+       cfi_adjust_cfa_offset (-96)
+       l      %r14,8(15)               # restore registers
+       lm     %r2,%r5,32(%r15)
+       br     %r1
+1:     .long  _dl_fixup - 0b
+       cfi_endproc
+       .size _dl_runtime_resolve, .-_dl_runtime_resolve
+
+
+       .globl _dl_runtime_profile
+       .type _dl_runtime_profile, @function
+       cfi_startproc
+       .align 16
+_dl_runtime_profile:
+       stm    %r2,%r6,32(%r15)         # save registers
+       std    %f0,56(%r15)
+       std    %f2,64(%r15)
+       st     %r6,8(%r15)
+       st     %r12,12(%r15)
+       st     %r14,16(%r15)
+       lr     %r12,%r15                # create stack frame
+       cfi_def_cfa_register (12)
+       ahi    %r15,-96
+       st     %r12,0(%r15)
+       lm     %r2,%r3,24(%r12)         # load arguments saved by PLT
+       lr     %r4,%r14                 # return address as third parameter
+       basr   %r1,0
+0:     l      %r14,6f-0b(%r1)
+       la     %r5,32(%r12)             # pointer to struct La_s390_32_regs
+       la     %r6,20(%r12)             # long int * framesize
+       bas    %r14,0(%r14,%r1)         # call resolver
+       lr     %r1,%r2                  # function addr returned in r2
+       icm    %r0,15,20(%r12)          # load & test framesize
+       jnm    2f
+       lm     %r2,%r6,32(%r12)
+       ld     %f0,56(%r12)
+       ld     %f2,64(%r12)
+       basr   %r14,%r1                 # call resolved function
+1:     lr     %r15,%r12                # remove stack frame
+       cfi_def_cfa_register (15)
+       l      %r14,16(%r15)            # restore registers
+       l      %r12,12(%r15)
+       l      %r6,8(%r15)
+       br     %r14
+       cfi_def_cfa_register (12)
+2:     jz     4f                       # framesize == 0 ?
+       ahi    %r0,7                    # align framesize to 8
+       lhi    %r2,-8
+       nr     %r0,%r2
+       slr    %r15,%r0                 # make room for framesize bytes
+       st     %r12,0(%r15)
+       la     %r2,96(%r15)
+       la     %r3,96(%r12)
+       srl    %r0,3
+3:     mvc    0(8,%r2),0(%r3)          # copy additional parameters
+       la     %r2,8(%r2)
+       la     %r3,8(%r3)
+       brct   %r0,3b
+4:     lm     %r2,%r6,32(%r12)         # load register parameters
+       ld     %f0,56(%r12)
+       ld     %f2,64(%r12)
+       basr   %r14,%r1                 # call resolved function
+       stm    %r2,%r3,72(%r12)
+       std    %f0,80(%r12)
+       lm     %r2,%r3,24(%r12)         # load arguments saved by PLT
+       basr   %r1,0
+5:     l      %r14,7f-5b(%r1)
+       la     %r4,32(%r12)             # pointer to struct La_s390_32_regs
+       la     %r5,72(%r12)             # pointer to struct La_s390_32_retval
+       basr   %r14,%r1                 # call _dl_call_pltexit 
+       j      1b
+6:     .long  _dl_profile_fixup - 0b
+7:     .long  _dl_call_pltexit - 5b
+       cfi_endproc
+       .size _dl_runtime_profile, .-_dl_runtime_profile
+