]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/powerpc/powerpc32/dl-trampoline.S
Update copyright notices with scripts/update-copyrights
[thirdparty/glibc.git] / sysdeps / powerpc / powerpc32 / dl-trampoline.S
CommitLineData
2413fdba 1/* PLT trampolines. PPC32 version.
d4697bc9 2 Copyright (C) 2005-2014 Free Software Foundation, Inc.
2413fdba
UD
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
59ba27a6
PE
16 License along with the GNU C Library; if not, see
17 <http://www.gnu.org/licenses/>. */
2413fdba
UD
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:
a7e91561 26 cfi_startproc
2413fdba
UD
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.
85555eeb 29 stwu r1,-64(r1)
a7e91561 30 cfi_adjust_cfa_offset (64)
85555eeb
UD
31 stw r0,12(r1)
32 stw r3,16(r1)
33 stw r4,20(r1)
2413fdba 34 # The code that calls this has put parameters for `fixup' in r12 and r11.
85555eeb
UD
35 mr r3,r12
36 stw r5,24(r1)
37 mr r4,r11
38 stw r6,28(r1)
39 mflr r0
2413fdba 40 # We also need to save some of the condition register fields
85555eeb 41 stw r7,32(r1)
f17efcb4
UD
42 # Don't clobber the caller's LRSAVE, it is needed by _mcount.
43 stw r0,48(r1)
44 cfi_offset (lr, -16)
85555eeb
UD
45 stw r8,36(r1)
46 mfcr r0
47 stw r9,40(r1)
48 stw r10,44(r1)
49 stw r0,8(r1)
2413fdba
UD
50 bl _dl_fixup@local
51 # 'fixup' returns the address we want to branch to.
85555eeb 52 mtctr r3
2413fdba 53 # Put the registers back...
f17efcb4 54 lwz r0,48(r1)
85555eeb
UD
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)
2413fdba 67 # ...unwind the stack frame, and jump to the PLT entry we updated.
85555eeb 68 addi r1,r1,64
2413fdba 69 bctr
a7e91561 70 cfi_endproc
2413fdba
UD
71 .size _dl_runtime_resolve,.-_dl_runtime_resolve
72
9f0d7b6d 73#ifndef PROF
2413fdba
UD
74 .align 2
75 .globl _dl_prof_resolve
76 .type _dl_prof_resolve,@function
77_dl_prof_resolve:
a7e91561 78 cfi_startproc
2413fdba
UD
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.
85555eeb 81 stwu r1,-320(r1)
a7e91561 82 cfi_adjust_cfa_offset (320)
85555eeb
UD
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)
2413fdba 123 # The code that calls this has put parameters for `fixup' in r12 and r11.
85555eeb
UD
124 mr r3,r12
125 stw r5,24(r1)
126 mr r4,r11
127 stw r6,28(r1)
128 mflr r5
2413fdba 129 # We also need to save some of the condition register fields.
85555eeb 130 stw r7,32(r1)
f17efcb4
UD
131 # Don't clobber the caller's LRSAVE, it is needed by _mcount.
132 stw r5,308(r1)
133 cfi_offset (lr, -12)
85555eeb
UD
134 stw r8,36(r1)
135 mfcr r0
136 stw r9,40(r1)
137 stw r10,44(r1)
138 stw r0,8(r1)
a2421a68 139#ifndef __NO_FPRS__
85555eeb
UD
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)
a2421a68 149#endif
85555eeb
UD
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)
2413fdba
UD
156 bl _dl_profile_fixup@local
157 # 'fixup' returns the address we want to branch to.
85555eeb 158 mtctr r3
2413fdba 159 # Put the registers back...
f17efcb4 160 lwz r0,308(r1)
85555eeb
UD
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)
a2421a68 173#ifndef __NO_FPRS__
85555eeb
UD
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)
a2421a68 183#endif
2413fdba 184 # ...unwind the stack frame, and jump to the PLT entry we updated.
85555eeb 185 addi r1,r1,320
2413fdba 186 bctr
a7e91561 187 cfi_endproc
2413fdba 188 .size _dl_prof_resolve,.-_dl_prof_resolve
9f0d7b6d 189#endif