1/* PLT trampolines. PPC32 version. 2 Copyright (C) 2005-2022 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library; if not, see 17 <https://www.gnu.org/licenses/>. */ 18 19#include <sysdep.h> 20 21 .section ".text" 22 .align 2 23 .globl _dl_runtime_resolve 24 .type _dl_runtime_resolve,@function 25_dl_runtime_resolve: 26 cfi_startproc 27 # We need to save the registers used to pass parameters, and register 0, 28 # which is used by _mcount; the registers are saved in a stack frame. 29 stwu r1,-64(r1) 30 cfi_adjust_cfa_offset (64) 31 stw r0,12(r1) 32 stw r3,16(r1) 33 stw r4,20(r1) 34 # The code that calls this has put parameters for `fixup' in r12 and r11. 35 mr r3,r12 36 stw r5,24(r1) 37 mr r4,r11 38 stw r6,28(r1) 39 mflr r0 40 # We also need to save some of the condition register fields 41 stw r7,32(r1) 42 # Don't clobber the caller's LRSAVE, it is needed by _mcount. 43 stw r0,48(r1) 44 cfi_offset (lr, -16) 45 stw r8,36(r1) 46 mfcr r0 47 stw r9,40(r1) 48 stw r10,44(r1) 49 stw r0,8(r1) 50 bl _dl_fixup@local 51 # 'fixup' returns the address we want to branch to. 52 mtctr r3 53 # Put the registers back... 54 lwz r0,48(r1) 55 lwz r10,44(r1) 56 lwz r9,40(r1) 57 mtlr r0 58 lwz r8,36(r1) 59 lwz r0,8(r1) 60 lwz r7,32(r1) 61 lwz r6,28(r1) 62 mtcrf 0xFF,r0 63 lwz r5,24(r1) 64 lwz r4,20(r1) 65 lwz r3,16(r1) 66 lwz r0,12(r1) 67 # ...unwind the stack frame, and jump to the PLT entry we updated. 68 addi r1,r1,64 69 bctr 70 cfi_endproc 71 .size _dl_runtime_resolve,.-_dl_runtime_resolve 72 73#ifndef PROF 74 .align 2 75 .globl _dl_prof_resolve 76 .type _dl_prof_resolve,@function 77_dl_prof_resolve: 78 cfi_startproc 79 # We need to save the registers used to pass parameters, and register 0, 80 # which is used by _mcount; the registers are saved in a stack frame. 81 stwu r1,-320(r1) 82 cfi_adjust_cfa_offset (320) 83 /* Stack layout: 84 85 +312 stackframe 86 +308 lr 87 +304 r1 88 +288 v12 89 +272 v11 90 +256 v10 91 +240 v9 92 +224 v8 93 +208 v7 94 +192 v6 95 +176 v5 96 +160 v4 97 +144 v3 98 +128 v2 99 +112 v1 100 +104 fp8 101 +96 fp7 102 +88 fp6 103 +80 fp5 104 +72 fp4 105 +64 fp3 106 +56 fp2 107 +48 fp1 108 +44 r10 109 +40 r9 110 +36 r8 111 +32 r7 112 +28 r6 113 +24 r5 114 +20 r4 115 +16 r3 116 +12 r0 117 +8 cr 118 r1 link 119 */ 120 stw r0,12(r1) 121 stw r3,16(r1) 122 stw r4,20(r1) 123 # The code that calls this has put parameters for `fixup' in r12 and r11. 124 mr r3,r12 125 stw r5,24(r1) 126 mr r4,r11 127 stw r6,28(r1) 128 mflr r5 129 # We also need to save some of the condition register fields. 130 stw r7,32(r1) 131 # Don't clobber the caller's LRSAVE, it is needed by _mcount. 132 stw r5,308(r1) 133 cfi_offset (lr, -12) 134 stw r8,36(r1) 135 mfcr r0 136 stw r9,40(r1) 137 stw r10,44(r1) 138 stw r0,8(r1) 139#ifndef __NO_FPRS__ 140 # Save the floating point registers 141 stfd fp1,48(r1) 142 stfd fp2,56(r1) 143 stfd fp3,64(r1) 144 stfd fp4,72(r1) 145 stfd fp5,80(r1) 146 stfd fp6,88(r1) 147 stfd fp7,96(r1) 148 stfd fp8,104(r1) 149#endif 150 # XXX TODO: store vmx registers 151 # Load the extra parameters. 152 addi r6,r1,16 153 addi r7,r1,312 154 li r0,-1 155 stw r0,0(r7) 156 bl _dl_profile_fixup@local 157 # 'fixup' returns the address we want to branch to. 158 mtctr r3 159 # Put the registers back... 160 lwz r0,308(r1) 161 lwz r10,44(r1) 162 lwz r9,40(r1) 163 mtlr r0 164 lwz r8,36(r1) 165 lwz r0,8(r1) 166 lwz r7,32(r1) 167 lwz r6,28(r1) 168 mtcrf 0xFF,r0 169 lwz r5,24(r1) 170 lwz r4,20(r1) 171 lwz r3,16(r1) 172 lwz r0,12(r1) 173#ifndef __NO_FPRS__ 174 # Load the floating point registers. 175 lfd fp1,48(r1) 176 lfd fp2,56(r1) 177 lfd fp3,64(r1) 178 lfd fp4,72(r1) 179 lfd fp5,80(r1) 180 lfd fp6,88(r1) 181 lfd fp7,96(r1) 182 lfd fp8,104(r1) 183#endif 184 # ...unwind the stack frame, and jump to the PLT entry we updated. 185 addi r1,r1,320 186 bctr 187 cfi_endproc 188 .size _dl_prof_resolve,.-_dl_prof_resolve 189#endif 190