1/* PLT trampolines. SH version.
2 Copyright (C) 2005-2024 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#ifdef SHARED
146 .globl _dl_runtime_profile
147 .type _dl_runtime_profile,@function
148 cfi_startproc
149 .align 5
150_dl_runtime_profile:
151 mov.l r12,@-r15
152 cfi_adjust_cfa_offset (4)
153#ifdef HAVE_FPU
154 sts.l fpscr,@-r15
155 cfi_adjust_cfa_offset (4)
156 mov #8,r12
157 swap.w r12,r12
158 lds r12,fpscr
159 fmov.s fr11,@-r15
160 cfi_adjust_cfa_offset (4)
161 fmov.s fr10,@-r15
162 cfi_adjust_cfa_offset (4)
163 fmov.s fr9,@-r15
164 cfi_adjust_cfa_offset (4)
165 fmov.s fr8,@-r15
166 cfi_adjust_cfa_offset (4)
167 fmov.s fr7,@-r15
168 cfi_adjust_cfa_offset (4)
169 fmov.s fr6,@-r15
170 cfi_adjust_cfa_offset (4)
171 fmov.s fr5,@-r15
172 cfi_adjust_cfa_offset (4)
173 fmov.s fr4,@-r15
174 cfi_adjust_cfa_offset (4)
175#else
176 add #-36,r15
177 cfi_adjust_cfa_offset (36)
178#endif
179 mov.l r7,@-r15
180 cfi_adjust_cfa_offset (4)
181 mov.l r6,@-r15
182 cfi_adjust_cfa_offset (4)
183 mov.l r5,@-r15
184 cfi_adjust_cfa_offset (4)
185 mov.l r4,@-r15
186 cfi_adjust_cfa_offset (4)
187 mov.l r3,@-r15
188 cfi_adjust_cfa_offset (4)
189 mov.l r2,@-r15
190 cfi_adjust_cfa_offset (4)
191 sts.l macl,@-r15
192 cfi_adjust_cfa_offset (4)
193 sts.l mach,@-r15
194 cfi_adjust_cfa_offset (4)
195 movt r3 ! Save T flag.
196 mov.l r3,@-r15
197 cfi_adjust_cfa_offset (4)
198 sts.l pr,@-r15
199 cfi_adjust_cfa_offset (4)
200 tst r0,r0
201 bt 1f
202 mov r0,r2
2031:
204 mov r0,r4 ! PLT type
205 mov r2,r5 ! link map address
206 sts pr,r7 ! return address
207 add #-24,r15
208 cfi_adjust_cfa_offset (24)
209 mov #40,r0
210 add r15,r0
211 mov.l r0,@r15 ! Address of the register structure
212 mov #-1,r0
213 mov.l r0,@(8,r15)
214 mov #8,r0
215 add r15,r0
216 mov.l r0,@(4,r15)
217 mov.l r5,@(12,r15)
218 mov.l r1,@(16,r15)
219#ifdef SHARED
220 mov.l 2f,r12
221 mova 2f,r0
222 add r0,r12 ! Get GOT address in r12
223 mov.l 3f,r0
224 add r12,r0
225#else
226 mov.l 3f,r0
227#endif
228 jsr @r0 ! Call resolver.
229 mov r1,r6 ! reloc offset
230 mov.l @(8,r15),r1
231 cmp/pz r1
232 bt 4f
233 add #24,r15
234 cfi_adjust_cfa_offset (-24)
235 lds.l @r15+,pr ! Get register content back.
236 cfi_adjust_cfa_offset (-4)
237 mov.l @r15+,r3
238 cfi_adjust_cfa_offset (-4)
239 shal r3 ! Lode T flag.
240 lds.l @r15+,mach
241 cfi_adjust_cfa_offset (-4)
242 lds.l @r15+,macl
243 cfi_adjust_cfa_offset (-4)
244 mov.l @r15+,r2
245 cfi_adjust_cfa_offset (-4)
246 mov.l @r15+,r3
247 cfi_adjust_cfa_offset (-4)
248 mov.l @r15+,r4
249 cfi_adjust_cfa_offset (-4)
250 mov.l @r15+,r5
251 cfi_adjust_cfa_offset (-4)
252 mov.l @r15+,r6
253 cfi_adjust_cfa_offset (-4)
254 mov.l @r15+,r7
255 cfi_adjust_cfa_offset (-4)
256#ifdef HAVE_FPU
257 fmov.s @r15+,fr4
258 cfi_adjust_cfa_offset (-4)
259 fmov.s @r15+,fr5
260 cfi_adjust_cfa_offset (-4)
261 fmov.s @r15+,fr6
262 cfi_adjust_cfa_offset (-4)
263 fmov.s @r15+,fr7
264 cfi_adjust_cfa_offset (-4)
265 fmov.s @r15+,fr8
266 cfi_adjust_cfa_offset (-4)
267 fmov.s @r15+,fr9
268 cfi_adjust_cfa_offset (-4)
269 fmov.s @r15+,fr10
270 cfi_adjust_cfa_offset (-4)
271 fmov.s @r15+,fr11
272 cfi_adjust_cfa_offset (-4)
273 lds.l @r15+,fpscr
274 cfi_adjust_cfa_offset (-4)
275#else
276 add #36,r15
277 cfi_adjust_cfa_offset (-36)
278#endif
279 jmp @r0 ! Jump to function address.
280 mov.l @r15+,r12
281 cfi_adjust_cfa_offset (-4)
282 .align 2
283#ifdef SHARED
2842: .long _GLOBAL_OFFSET_TABLE_
2853: .long _dl_profile_fixup@GOTOFF
286#else
2873: .long _dl_profile_fixup
288#endif
289
290 cfi_adjust_cfa_offset (104)
2914:
292 mov #104,r3
293 add r15,r3 ! Original stack
294 mov.l r8,@(20,r15)
295 cfi_rel_offset (r8, 20)
296 mov r15,r8
297 sub r1,r15
298 shlr2 r15
299 shll2 r15
300 mov r15,r4
301 shlr2 r1
302 tst r1,r1
3035:
304 bt/s 6f
305 dt r1
306 mov.l @r3+,r2
307 mov.l r2,@r4
308 bra 5b
309 add #4,r4
3106:
311 mov.l @r8,r12
312 mov.l @r12+,r2
313 mov.l @r12+,r3
314 mov.l @r12+,r4
315 mov.l @r12+,r5
316 mov.l @r12+,r6
317 mov.l @r12+,r7
318#ifdef HAVE_FPU
319 fmov.s @r12+,fr4
320 fmov.s @r12+,fr5
321 fmov.s @r12+,fr6
322 fmov.s @r12+,fr7
323 fmov.s @r12+,fr8
324 fmov.s @r12+,fr9
325 fmov.s @r12+,fr10
326 fmov.s @r12+,fr11
327 lds.l @r12+,fpscr
328#else
329 add #36,r2
330#endif
331 jsr @r0 ! Call function.
332 nop
333 mov r8,r15
334 mov.l @(12,r15),r4 ! link map address
335 mov.l @(16,r15),r5 ! reloc offset
336 mov.l @r15,r6 ! input registers
337#ifdef HAVE_FPU
338 mov #16,r8
339 add r15,r8
340 fmov.s fr1,@-r8
341 fmov.s fr0,@-r8
342#else
343 mov #8,r8
344 add r15,r8
345#endif
346 mov.l r1,@-r8
347 mov.l r0,@-r8
348 mov.l @(20,r15),r8
349 cfi_restore (r8)
350#ifdef SHARED
351 mov.l 7f,r12
352 mova 7f,r0
353 add r0,r12 ! Get GOT address in r12
354 mov.l 8f,r0
355 add r12,r0
356#else
357 mov.l 8f,r0
358#endif
359 jsr @r0
360 mov r15,r7 ! output registers
361 mov.l @r15+,r0
362 cfi_adjust_cfa_offset (-4)
363 mov.l @r15+,r1
364 cfi_adjust_cfa_offset (-4)
365#ifdef HAVE_FPU
366 fmov.s @r15+,fr0
367 cfi_adjust_cfa_offset (-4)
368 fmov.s @r15+,fr1
369 cfi_adjust_cfa_offset (-4)
370 add #8,r15
371 cfi_adjust_cfa_offset (-8)
372#else
373 add #16,r15
374 cfi_adjust_cfa_offset (-16)
375#endif
376 lds.l @r15+,pr ! Get register content back.
377 cfi_adjust_cfa_offset (-4)
378 mov.l @r15+,r3
379 cfi_adjust_cfa_offset (-4)
380 shal r3 ! Lode T flag.
381 lds.l @r15+,mach
382 cfi_adjust_cfa_offset (-4)
383 lds.l @r15+,macl
384 cfi_adjust_cfa_offset (-4)
385 mov.l @r15+,r2
386 cfi_adjust_cfa_offset (-4)
387 mov.l @r15+,r3
388 cfi_adjust_cfa_offset (-4)
389 mov.l @r15+,r4
390 cfi_adjust_cfa_offset (-4)
391 mov.l @r15+,r5
392 cfi_adjust_cfa_offset (-4)
393 mov.l @r15+,r6
394 cfi_adjust_cfa_offset (-4)
395 mov.l @r15+,r7
396 cfi_adjust_cfa_offset (-4)
397#ifdef HAVE_FPU
398 fmov.s @r15+,fr4
399 cfi_adjust_cfa_offset (-4)
400 fmov.s @r15+,fr5
401 cfi_adjust_cfa_offset (-4)
402 fmov.s @r15+,fr6
403 cfi_adjust_cfa_offset (-4)
404 fmov.s @r15+,fr7
405 cfi_adjust_cfa_offset (-4)
406 fmov.s @r15+,fr8
407 cfi_adjust_cfa_offset (-4)
408 fmov.s @r15+,fr9
409 cfi_adjust_cfa_offset (-4)
410 fmov.s @r15+,fr10
411 cfi_adjust_cfa_offset (-4)
412 fmov.s @r15+,fr11
413 cfi_adjust_cfa_offset (-4)
414 lds.l @r15+,fpscr
415 cfi_adjust_cfa_offset (-4)
416#else
417 add #36,r15
418 cfi_adjust_cfa_offset (-36)
419#endif
420 rts ! Jump to function address.
421 mov.l @r15+,r12
422 cfi_adjust_cfa_offset (-4)
423 cfi_endproc
424 .align 2
425#ifdef SHARED
4267: .long _GLOBAL_OFFSET_TABLE_
4278: .long _dl_audit_pltexit@GOTOFF
428#else
4298: .long _dl_audit_pltexit
430#endif
431 .size _dl_runtime_profile, .-_dl_runtime_profile
432#endif /* SHARED */
433

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