|
Packit |
6c4009 |
/* PLT trampolines. PPC32 version.
|
|
Packit |
6c4009 |
Copyright (C) 2005-2018 Free Software Foundation, Inc.
|
|
Packit |
6c4009 |
This file is part of the GNU C Library.
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
The GNU C Library is free software; you can redistribute it and/or
|
|
Packit |
6c4009 |
modify it under the terms of the GNU Lesser General Public
|
|
Packit |
6c4009 |
License as published by the Free Software Foundation; either
|
|
Packit |
6c4009 |
version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
The GNU C Library is distributed in the hope that it will be useful,
|
|
Packit |
6c4009 |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
6c4009 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
6c4009 |
Lesser General Public License for more details.
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
You should have received a copy of the GNU Lesser General Public
|
|
Packit |
6c4009 |
License along with the GNU C Library; if not, see
|
|
Packit |
6c4009 |
<http://www.gnu.org/licenses/>. */
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
#include <sysdep.h>
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
.section ".text"
|
|
Packit |
6c4009 |
.align 2
|
|
Packit |
6c4009 |
.globl _dl_runtime_resolve
|
|
Packit |
6c4009 |
.type _dl_runtime_resolve,@function
|
|
Packit |
6c4009 |
_dl_runtime_resolve:
|
|
Packit |
6c4009 |
cfi_startproc
|
|
Packit |
6c4009 |
# We need to save the registers used to pass parameters, and register 0,
|
|
Packit |
6c4009 |
# which is used by _mcount; the registers are saved in a stack frame.
|
|
Packit |
6c4009 |
stwu r1,-64(r1)
|
|
Packit |
6c4009 |
cfi_adjust_cfa_offset (64)
|
|
Packit |
6c4009 |
stw r0,12(r1)
|
|
Packit |
6c4009 |
stw r3,16(r1)
|
|
Packit |
6c4009 |
stw r4,20(r1)
|
|
Packit |
6c4009 |
# The code that calls this has put parameters for `fixup' in r12 and r11.
|
|
Packit |
6c4009 |
mr r3,r12
|
|
Packit |
6c4009 |
stw r5,24(r1)
|
|
Packit |
6c4009 |
mr r4,r11
|
|
Packit |
6c4009 |
stw r6,28(r1)
|
|
Packit |
6c4009 |
mflr r0
|
|
Packit |
6c4009 |
# We also need to save some of the condition register fields
|
|
Packit |
6c4009 |
stw r7,32(r1)
|
|
Packit |
6c4009 |
# Don't clobber the caller's LRSAVE, it is needed by _mcount.
|
|
Packit |
6c4009 |
stw r0,48(r1)
|
|
Packit |
6c4009 |
cfi_offset (lr, -16)
|
|
Packit |
6c4009 |
stw r8,36(r1)
|
|
Packit |
6c4009 |
mfcr r0
|
|
Packit |
6c4009 |
stw r9,40(r1)
|
|
Packit |
6c4009 |
stw r10,44(r1)
|
|
Packit |
6c4009 |
stw r0,8(r1)
|
|
Packit |
6c4009 |
bl _dl_fixup@local
|
|
Packit |
6c4009 |
# 'fixup' returns the address we want to branch to.
|
|
Packit |
6c4009 |
mtctr r3
|
|
Packit |
6c4009 |
# Put the registers back...
|
|
Packit |
6c4009 |
lwz r0,48(r1)
|
|
Packit |
6c4009 |
lwz r10,44(r1)
|
|
Packit |
6c4009 |
lwz r9,40(r1)
|
|
Packit |
6c4009 |
mtlr r0
|
|
Packit |
6c4009 |
lwz r8,36(r1)
|
|
Packit |
6c4009 |
lwz r0,8(r1)
|
|
Packit |
6c4009 |
lwz r7,32(r1)
|
|
Packit |
6c4009 |
lwz r6,28(r1)
|
|
Packit |
6c4009 |
mtcrf 0xFF,r0
|
|
Packit |
6c4009 |
lwz r5,24(r1)
|
|
Packit |
6c4009 |
lwz r4,20(r1)
|
|
Packit |
6c4009 |
lwz r3,16(r1)
|
|
Packit |
6c4009 |
lwz r0,12(r1)
|
|
Packit |
6c4009 |
# ...unwind the stack frame, and jump to the PLT entry we updated.
|
|
Packit |
6c4009 |
addi r1,r1,64
|
|
Packit |
6c4009 |
bctr
|
|
Packit |
6c4009 |
cfi_endproc
|
|
Packit |
6c4009 |
.size _dl_runtime_resolve,.-_dl_runtime_resolve
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
#ifndef PROF
|
|
Packit |
6c4009 |
.align 2
|
|
Packit |
6c4009 |
.globl _dl_prof_resolve
|
|
Packit |
6c4009 |
.type _dl_prof_resolve,@function
|
|
Packit |
6c4009 |
_dl_prof_resolve:
|
|
Packit |
6c4009 |
cfi_startproc
|
|
Packit |
6c4009 |
# We need to save the registers used to pass parameters, and register 0,
|
|
Packit |
6c4009 |
# which is used by _mcount; the registers are saved in a stack frame.
|
|
Packit |
6c4009 |
stwu r1,-320(r1)
|
|
Packit |
6c4009 |
cfi_adjust_cfa_offset (320)
|
|
Packit |
6c4009 |
/* Stack layout:
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
+312 stackframe
|
|
Packit |
6c4009 |
+308 lr
|
|
Packit |
6c4009 |
+304 r1
|
|
Packit |
6c4009 |
+288 v12
|
|
Packit |
6c4009 |
+272 v11
|
|
Packit |
6c4009 |
+256 v10
|
|
Packit |
6c4009 |
+240 v9
|
|
Packit |
6c4009 |
+224 v8
|
|
Packit |
6c4009 |
+208 v7
|
|
Packit |
6c4009 |
+192 v6
|
|
Packit |
6c4009 |
+176 v5
|
|
Packit |
6c4009 |
+160 v4
|
|
Packit |
6c4009 |
+144 v3
|
|
Packit |
6c4009 |
+128 v2
|
|
Packit |
6c4009 |
+112 v1
|
|
Packit |
6c4009 |
+104 fp8
|
|
Packit |
6c4009 |
+96 fp7
|
|
Packit |
6c4009 |
+88 fp6
|
|
Packit |
6c4009 |
+80 fp5
|
|
Packit |
6c4009 |
+72 fp4
|
|
Packit |
6c4009 |
+64 fp3
|
|
Packit |
6c4009 |
+56 fp2
|
|
Packit |
6c4009 |
+48 fp1
|
|
Packit |
6c4009 |
+44 r10
|
|
Packit |
6c4009 |
+40 r9
|
|
Packit |
6c4009 |
+36 r8
|
|
Packit |
6c4009 |
+32 r7
|
|
Packit |
6c4009 |
+28 r6
|
|
Packit |
6c4009 |
+24 r5
|
|
Packit |
6c4009 |
+20 r4
|
|
Packit |
6c4009 |
+16 r3
|
|
Packit |
6c4009 |
+12 r0
|
|
Packit |
6c4009 |
+8 cr
|
|
Packit |
6c4009 |
r1 link
|
|
Packit |
6c4009 |
*/
|
|
Packit |
6c4009 |
stw r0,12(r1)
|
|
Packit |
6c4009 |
stw r3,16(r1)
|
|
Packit |
6c4009 |
stw r4,20(r1)
|
|
Packit |
6c4009 |
# The code that calls this has put parameters for `fixup' in r12 and r11.
|
|
Packit |
6c4009 |
mr r3,r12
|
|
Packit |
6c4009 |
stw r5,24(r1)
|
|
Packit |
6c4009 |
mr r4,r11
|
|
Packit |
6c4009 |
stw r6,28(r1)
|
|
Packit |
6c4009 |
mflr r5
|
|
Packit |
6c4009 |
# We also need to save some of the condition register fields.
|
|
Packit |
6c4009 |
stw r7,32(r1)
|
|
Packit |
6c4009 |
# Don't clobber the caller's LRSAVE, it is needed by _mcount.
|
|
Packit |
6c4009 |
stw r5,308(r1)
|
|
Packit |
6c4009 |
cfi_offset (lr, -12)
|
|
Packit |
6c4009 |
stw r8,36(r1)
|
|
Packit |
6c4009 |
mfcr r0
|
|
Packit |
6c4009 |
stw r9,40(r1)
|
|
Packit |
6c4009 |
stw r10,44(r1)
|
|
Packit |
6c4009 |
stw r0,8(r1)
|
|
Packit |
6c4009 |
#ifndef __NO_FPRS__
|
|
Packit |
6c4009 |
# Save the floating point registers
|
|
Packit |
6c4009 |
stfd fp1,48(r1)
|
|
Packit |
6c4009 |
stfd fp2,56(r1)
|
|
Packit |
6c4009 |
stfd fp3,64(r1)
|
|
Packit |
6c4009 |
stfd fp4,72(r1)
|
|
Packit |
6c4009 |
stfd fp5,80(r1)
|
|
Packit |
6c4009 |
stfd fp6,88(r1)
|
|
Packit |
6c4009 |
stfd fp7,96(r1)
|
|
Packit |
6c4009 |
stfd fp8,104(r1)
|
|
Packit |
6c4009 |
#endif
|
|
Packit |
6c4009 |
# XXX TODO: store vmx registers
|
|
Packit |
6c4009 |
# Load the extra parameters.
|
|
Packit |
6c4009 |
addi r6,r1,16
|
|
Packit |
6c4009 |
addi r7,r1,312
|
|
Packit |
6c4009 |
li r0,-1
|
|
Packit |
6c4009 |
stw r0,0(r7)
|
|
Packit |
6c4009 |
bl _dl_profile_fixup@local
|
|
Packit |
6c4009 |
# 'fixup' returns the address we want to branch to.
|
|
Packit |
6c4009 |
mtctr r3
|
|
Packit |
6c4009 |
# Put the registers back...
|
|
Packit |
6c4009 |
lwz r0,308(r1)
|
|
Packit |
6c4009 |
lwz r10,44(r1)
|
|
Packit |
6c4009 |
lwz r9,40(r1)
|
|
Packit |
6c4009 |
mtlr r0
|
|
Packit |
6c4009 |
lwz r8,36(r1)
|
|
Packit |
6c4009 |
lwz r0,8(r1)
|
|
Packit |
6c4009 |
lwz r7,32(r1)
|
|
Packit |
6c4009 |
lwz r6,28(r1)
|
|
Packit |
6c4009 |
mtcrf 0xFF,r0
|
|
Packit |
6c4009 |
lwz r5,24(r1)
|
|
Packit |
6c4009 |
lwz r4,20(r1)
|
|
Packit |
6c4009 |
lwz r3,16(r1)
|
|
Packit |
6c4009 |
lwz r0,12(r1)
|
|
Packit |
6c4009 |
#ifndef __NO_FPRS__
|
|
Packit |
6c4009 |
# Load the floating point registers.
|
|
Packit |
6c4009 |
lfd fp1,48(r1)
|
|
Packit |
6c4009 |
lfd fp2,56(r1)
|
|
Packit |
6c4009 |
lfd fp3,64(r1)
|
|
Packit |
6c4009 |
lfd fp4,72(r1)
|
|
Packit |
6c4009 |
lfd fp5,80(r1)
|
|
Packit |
6c4009 |
lfd fp6,88(r1)
|
|
Packit |
6c4009 |
lfd fp7,96(r1)
|
|
Packit |
6c4009 |
lfd fp8,104(r1)
|
|
Packit |
6c4009 |
#endif
|
|
Packit |
6c4009 |
# ...unwind the stack frame, and jump to the PLT entry we updated.
|
|
Packit |
6c4009 |
addi r1,r1,320
|
|
Packit |
6c4009 |
bctr
|
|
Packit |
6c4009 |
cfi_endproc
|
|
Packit |
6c4009 |
.size _dl_prof_resolve,.-_dl_prof_resolve
|
|
Packit |
6c4009 |
#endif
|