1/* PLT trampolines. SH 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 .text
22 .globl _dl_runtime_resolve
23 .type _dl_runtime_resolve, @function
24 cfi_startproc
25 .align 5
26_dl_runtime_resolve:
27 mov.l r2,@-r15
28 cfi_adjust_cfa_offset (4)
29 mov.l r3,@-r15
30 cfi_adjust_cfa_offset (4)
31 mov.l r4,@-r15
32 cfi_adjust_cfa_offset (4)
33 mov.l r5,@-r15
34 cfi_adjust_cfa_offset (4)
35 mov.l r6,@-r15
36 cfi_adjust_cfa_offset (4)
37 mov.l r7,@-r15
38 cfi_adjust_cfa_offset (4)
39 mov.l r12,@-r15
40 cfi_adjust_cfa_offset (4)
41 sts.l macl,@-r15
42 cfi_adjust_cfa_offset (4)
43 sts.l mach,@-r15
44 cfi_adjust_cfa_offset (4)
45 movt r3 ! Save T flag.
46 mov.l r3,@-r15
47 cfi_adjust_cfa_offset (4)
48#ifdef HAVE_FPU
49 sts.l fpscr,@-r15
50 cfi_adjust_cfa_offset (4)
51 mov #8,r3
52 swap.w r3,r3
53 lds r3,fpscr
54 fmov.s fr11,@-r15
55 cfi_adjust_cfa_offset (4)
56 fmov.s fr10,@-r15
57 cfi_adjust_cfa_offset (4)
58 fmov.s fr9,@-r15
59 cfi_adjust_cfa_offset (4)
60 fmov.s fr8,@-r15
61 cfi_adjust_cfa_offset (4)
62 fmov.s fr7,@-r15
63 cfi_adjust_cfa_offset (4)
64 fmov.s fr6,@-r15
65 cfi_adjust_cfa_offset (4)
66 fmov.s fr5,@-r15
67 cfi_adjust_cfa_offset (4)
68 fmov.s fr4,@-r15
69 cfi_adjust_cfa_offset (4)
70#endif
71 sts.l pr,@-r15
72 cfi_adjust_cfa_offset (4)
73 tst r0,r0
74 bt 1f
75 mov r0,r2
761:
77 mov r0,r4 ! PLT type
78 mov r2,r5 ! link map address
79#ifdef SHARED
80 mov.l 2f,r2
81 mova 2f,r0
82 add r0,r2 ! Get GOT address in r2
83 mov.l 3f,r0
84 add r2,r0
85#else
86 mov.l 3f,r0
87#endif
88 jsr @r0 ! Call resolver.
89 mov r1,r6 ! reloc offset
90 lds.l @r15+,pr ! Get register content back.
91 cfi_adjust_cfa_offset (-4)
92#ifdef HAVE_FPU
93 fmov.s @r15+,fr4
94 cfi_adjust_cfa_offset (-4)
95 fmov.s @r15+,fr5
96 cfi_adjust_cfa_offset (-4)
97 fmov.s @r15+,fr6
98 cfi_adjust_cfa_offset (-4)
99 fmov.s @r15+,fr7
100 cfi_adjust_cfa_offset (-4)
101 fmov.s @r15+,fr8
102 cfi_adjust_cfa_offset (-4)
103 fmov.s @r15+,fr9
104 cfi_adjust_cfa_offset (-4)
105 fmov.s @r15+,fr10
106 cfi_adjust_cfa_offset (-4)
107 fmov.s @r15+,fr11
108 cfi_adjust_cfa_offset (-4)
109 lds.l @r15+,fpscr
110 cfi_adjust_cfa_offset (-4)
111#endif
112 mov.l @r15+,r3
113 cfi_adjust_cfa_offset (-4)
114 shal r3 ! Lode T flag.
115 lds.l @r15+,mach
116 cfi_adjust_cfa_offset (-4)
117 lds.l @r15+,macl
118 cfi_adjust_cfa_offset (-4)
119 mov.l @r15+,r12
120 cfi_adjust_cfa_offset (-4)
121 mov.l @r15+,r7
122 cfi_adjust_cfa_offset (-4)
123 mov.l @r15+,r6
124 cfi_adjust_cfa_offset (-4)
125 mov.l @r15+,r5
126 cfi_adjust_cfa_offset (-4)
127 mov.l @r15+,r4
128 cfi_adjust_cfa_offset (-4)
129 mov.l @r15+,r3
130 cfi_adjust_cfa_offset (-4)
131 jmp @r0 ! Jump to function address.
132 mov.l @r15+,r2
133 cfi_adjust_cfa_offset (-4)
134 .align 2
135#ifdef SHARED
1362: .long _GLOBAL_OFFSET_TABLE_
1373: .long _dl_fixup@GOTOFF
138#else
1393: .long _dl_fixup
140#endif
141 cfi_endproc
142 .size _dl_runtime_resolve, .-_dl_runtime_resolve
143
144
145 .globl _dl_runtime_profile
146 .type _dl_runtime_profile,@function
147 cfi_startproc
148 .align 5
149_dl_runtime_profile:
150 mov.l r12,@-r15
151 cfi_adjust_cfa_offset (4)
152#ifdef HAVE_FPU
153 sts.l fpscr,@-r15
154 cfi_adjust_cfa_offset (4)
155 mov #8,r12
156 swap.w r12,r12
157 lds r12,fpscr
158 fmov.s fr11,@-r15
159 cfi_adjust_cfa_offset (4)
160 fmov.s fr10,@-r15
161 cfi_adjust_cfa_offset (4)
162 fmov.s fr9,@-r15
163 cfi_adjust_cfa_offset (4)
164 fmov.s fr8,@-r15
165 cfi_adjust_cfa_offset (4)
166 fmov.s fr7,@-r15
167 cfi_adjust_cfa_offset (4)
168 fmov.s fr6,@-r15
169 cfi_adjust_cfa_offset (4)
170 fmov.s fr5,@-r15
171 cfi_adjust_cfa_offset (4)
172 fmov.s fr4,@-r15
173 cfi_adjust_cfa_offset (4)
174#else
175 add #-36,r15
176 cfi_adjust_cfa_offset (36)
177#endif
178 mov.l r7,@-r15
179 cfi_adjust_cfa_offset (4)
180 mov.l r6,@-r15
181 cfi_adjust_cfa_offset (4)
182 mov.l r5,@-r15
183 cfi_adjust_cfa_offset (4)
184 mov.l r4,@-r15
185 cfi_adjust_cfa_offset (4)
186 mov.l r3,@-r15
187 cfi_adjust_cfa_offset (4)
188 mov.l r2,@-r15
189 cfi_adjust_cfa_offset (4)
190 sts.l macl,@-r15
191 cfi_adjust_cfa_offset (4)
192 sts.l mach,@-r15
193 cfi_adjust_cfa_offset (4)
194 movt r3 ! Save T flag.
195 mov.l r3,@-r15
196 cfi_adjust_cfa_offset (4)
197 sts.l pr,@-r15
198 cfi_adjust_cfa_offset (4)
199 tst r0,r0
200 bt 1f
201 mov r0,r2
2021:
203 mov r0,r4 ! PLT type
204 mov r2,r5 ! link map address
205 sts pr,r7 ! return address
206 add #-24,r15
207 cfi_adjust_cfa_offset (24)
208 mov #40,r0
209 add r15,r0
210 mov.l r0,@r15 ! Address of the register structure
211 mov #-1,r0
212 mov.l r0,@(8,r15)
213 mov #8,r0
214 add r15,r0
215 mov.l r0,@(4,r15)
216 mov.l r5,@(12,r15)
217 mov.l r1,@(16,r15)
218#ifdef SHARED
219 mov.l 2f,r12
220 mova 2f,r0
221 add r0,r12 ! Get GOT address in r12
222 mov.l 3f,r0
223 add r12,r0
224#else
225 mov.l 3f,r0
226#endif
227 jsr @r0 ! Call resolver.
228 mov r1,r6 ! reloc offset
229 mov.l @(8,r15),r1
230 cmp/pz r1
231 bt 4f
232 add #24,r15
233 cfi_adjust_cfa_offset (-24)
234 lds.l @r15+,pr ! Get register content back.
235 cfi_adjust_cfa_offset (-4)
236 mov.l @r15+,r3
237 cfi_adjust_cfa_offset (-4)
238 shal r3 ! Lode T flag.
239 lds.l @r15+,mach
240 cfi_adjust_cfa_offset (-4)
241 lds.l @r15+,macl
242 cfi_adjust_cfa_offset (-4)
243 mov.l @r15+,r2
244 cfi_adjust_cfa_offset (-4)
245 mov.l @r15+,r3
246 cfi_adjust_cfa_offset (-4)
247 mov.l @r15+,r4
248 cfi_adjust_cfa_offset (-4)
249 mov.l @r15+,r5
250 cfi_adjust_cfa_offset (-4)
251 mov.l @r15+,r6
252 cfi_adjust_cfa_offset (-4)
253 mov.l @r15+,r7
254 cfi_adjust_cfa_offset (-4)
255#ifdef HAVE_FPU
256 fmov.s @r15+,fr4
257 cfi_adjust_cfa_offset (-4)
258 fmov.s @r15+,fr5
259 cfi_adjust_cfa_offset (-4)
260 fmov.s @r15+,fr6
261 cfi_adjust_cfa_offset (-4)
262 fmov.s @r15+,fr7
263 cfi_adjust_cfa_offset (-4)
264 fmov.s @r15+,fr8
265 cfi_adjust_cfa_offset (-4)
266 fmov.s @r15+,fr9
267 cfi_adjust_cfa_offset (-4)
268 fmov.s @r15+,fr10
269 cfi_adjust_cfa_offset (-4)
270 fmov.s @r15+,fr11
271 cfi_adjust_cfa_offset (-4)
272 lds.l @r15+,fpscr
273 cfi_adjust_cfa_offset (-4)
274#else
275 add #36,r15
276 cfi_adjust_cfa_offset (-36)
277#endif
278 jmp @r0 ! Jump to function address.
279 mov.l @r15+,r12
280 cfi_adjust_cfa_offset (-4)
281 .align 2
282#ifdef SHARED
2832: .long _GLOBAL_OFFSET_TABLE_
2843: .long _dl_profile_fixup@GOTOFF
285#else
2863: .long _dl_profile_fixup
287#endif
288
289 cfi_adjust_cfa_offset (104)
2904:
291 mov #104,r3
292 add r15,r3 ! Original stack
293 mov.l r8,@(20,r15)
294 cfi_rel_offset (r8, 20)
295 mov r15,r8
296 sub r1,r15
297 shlr2 r15
298 shll2 r15
299 mov r15,r4
300 shlr2 r1
301 tst r1,r1
3025:
303 bt/s 6f
304 dt r1
305 mov.l @r3+,r2
306 mov.l r2,@r4
307 bra 5b
308 add #4,r4
3096:
310 mov.l @r8,r12
311 mov.l @r12+,r2
312 mov.l @r12+,r3
313 mov.l @r12+,r4
314 mov.l @r12+,r5
315 mov.l @r12+,r6
316 mov.l @r12+,r7
317#ifdef HAVE_FPU
318 fmov.s @r12+,fr4
319 fmov.s @r12+,fr5
320 fmov.s @r12+,fr6
321 fmov.s @r12+,fr7
322 fmov.s @r12+,fr8
323 fmov.s @r12+,fr9
324 fmov.s @r12+,fr10
325 fmov.s @r12+,fr11
326 lds.l @r12+,fpscr
327#else
328 add #36,r2
329#endif
330 jsr @r0 ! Call function.
331 nop
332 mov r8,r15
333 mov.l @(12,r15),r4 ! link map address
334 mov.l @(16,r15),r5 ! reloc offset
335 mov.l @r15,r6 ! input registers
336#ifdef HAVE_FPU
337 mov #16,r8
338 add r15,r8
339 fmov.s fr1,@-r8
340 fmov.s fr0,@-r8
341#else
342 mov #8,r8
343 add r15,r8
344#endif
345 mov.l r1,@-r8
346 mov.l r0,@-r8
347 mov.l @(20,r15),r8
348 cfi_restore (r8)
349#ifdef SHARED
350 mov.l 7f,r12
351 mova 7f,r0
352 add r0,r12 ! Get GOT address in r12
353 mov.l 8f,r0
354 add r12,r0
355#else
356 mov.l 8f,r0
357#endif
358 jsr @r0
359 mov r15,r7 ! output registers
360 mov.l @r15+,r0
361 cfi_adjust_cfa_offset (-4)
362 mov.l @r15+,r1
363 cfi_adjust_cfa_offset (-4)
364#ifdef HAVE_FPU
365 fmov.s @r15+,fr0
366 cfi_adjust_cfa_offset (-4)
367 fmov.s @r15+,fr1
368 cfi_adjust_cfa_offset (-4)
369 add #8,r15
370 cfi_adjust_cfa_offset (-8)
371#else
372 add #16,r15
373 cfi_adjust_cfa_offset (-16)
374#endif
375 lds.l @r15+,pr ! Get register content back.
376 cfi_adjust_cfa_offset (-4)
377 mov.l @r15+,r3
378 cfi_adjust_cfa_offset (-4)
379 shal r3 ! Lode T flag.
380 lds.l @r15+,mach
381 cfi_adjust_cfa_offset (-4)
382 lds.l @r15+,macl
383 cfi_adjust_cfa_offset (-4)
384 mov.l @r15+,r2
385 cfi_adjust_cfa_offset (-4)
386 mov.l @r15+,r3
387 cfi_adjust_cfa_offset (-4)
388 mov.l @r15+,r4
389 cfi_adjust_cfa_offset (-4)
390 mov.l @r15+,r5
391 cfi_adjust_cfa_offset (-4)
392 mov.l @r15+,r6
393 cfi_adjust_cfa_offset (-4)
394 mov.l @r15+,r7
395 cfi_adjust_cfa_offset (-4)
396#ifdef HAVE_FPU
397 fmov.s @r15+,fr4
398 cfi_adjust_cfa_offset (-4)
399 fmov.s @r15+,fr5
400 cfi_adjust_cfa_offset (-4)
401 fmov.s @r15+,fr6
402 cfi_adjust_cfa_offset (-4)
403 fmov.s @r15+,fr7
404 cfi_adjust_cfa_offset (-4)
405 fmov.s @r15+,fr8
406 cfi_adjust_cfa_offset (-4)
407 fmov.s @r15+,fr9
408 cfi_adjust_cfa_offset (-4)
409 fmov.s @r15+,fr10
410 cfi_adjust_cfa_offset (-4)
411 fmov.s @r15+,fr11
412 cfi_adjust_cfa_offset (-4)
413 lds.l @r15+,fpscr
414 cfi_adjust_cfa_offset (-4)
415#else
416 add #36,r15
417 cfi_adjust_cfa_offset (-36)
418#endif
419 rts ! Jump to function address.
420 mov.l @r15+,r12
421 cfi_adjust_cfa_offset (-4)
422 cfi_endproc
423 .align 2
424#ifdef SHARED
4257: .long _GLOBAL_OFFSET_TABLE_
4268: .long _dl_audit_pltexit@GOTOFF
427#else
4288: .long _dl_audit_pltexit
429#endif
430 .size _dl_runtime_profile, .-_dl_runtime_profile
431

source code of glibc/sysdeps/sh/dl-trampoline.S