elf: Make dl-rseq-symbols Linux only
[glibc.git] / sysdeps / sh / dl-trampoline.S
blobe2bbbd0756d6123812e544011f74d6423d815d44
1 /* PLT trampolines.  SH version.
2    Copyright (C) 2005-2024 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
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.
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.
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/>.  */
19 #include <sysdep.h>
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
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
136 2:      .long _GLOBAL_OFFSET_TABLE_
137 3:      .long _dl_fixup@GOTOFF
138 #else
139 3:      .long _dl_fixup
140 #endif
141         cfi_endproc
142         .size _dl_runtime_resolve, .-_dl_runtime_resolve
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
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
284 2:      .long _GLOBAL_OFFSET_TABLE_
285 3:      .long _dl_profile_fixup@GOTOFF
286 #else
287 3:      .long _dl_profile_fixup
288 #endif
290         cfi_adjust_cfa_offset (104)
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
304         bt/s 6f
305          dt r1
306         mov.l @r3+,r2
307         mov.l r2,@r4
308         bra 5b
309          add #4,r4
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
426 7:      .long _GLOBAL_OFFSET_TABLE_
427 8:      .long _dl_audit_pltexit@GOTOFF
428 #else
429 8:      .long _dl_audit_pltexit
430 #endif
431         .size _dl_runtime_profile, .-_dl_runtime_profile
432 #endif /* SHARED */