2.9
[glibc/nacl-glibc.git] / sysdeps / sh / dl-trampoline.S
blob79493d50b98266fab098db409c69d59fecee0833
1 /* PLT trampolines.  SH version.
2    Copyright (C) 2005 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, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
20 #include <sysdep.h>
22         .text
23         .globl _dl_runtime_resolve
24         .type _dl_runtime_resolve, @function
25         cfi_startproc
26         .align 5
27 _dl_runtime_resolve:
28         mov.l r2,@-r15
29         cfi_adjust_cfa_offset (4)
30         mov.l r3,@-r15
31         cfi_adjust_cfa_offset (4)
32         mov.l r4,@-r15
33         cfi_adjust_cfa_offset (4)
34         mov.l r5,@-r15
35         cfi_adjust_cfa_offset (4)
36         mov.l r6,@-r15
37         cfi_adjust_cfa_offset (4)
38         mov.l r7,@-r15
39         cfi_adjust_cfa_offset (4)
40         mov.l r12,@-r15
41         cfi_adjust_cfa_offset (4)
42         sts.l macl,@-r15
43         cfi_adjust_cfa_offset (4)
44         sts.l mach,@-r15
45         cfi_adjust_cfa_offset (4)
46         movt r3                 ! Save T flag.
47         mov.l r3,@-r15
48         cfi_adjust_cfa_offset (4)
49 #ifdef HAVE_FPU
50         sts.l   fpscr,@-r15
51         cfi_adjust_cfa_offset (4)
52         mov     #8,r3
53         swap.w  r3,r3
54         lds     r3,fpscr
55         fmov.s  fr11,@-r15
56         cfi_adjust_cfa_offset (4)
57         fmov.s  fr10,@-r15
58         cfi_adjust_cfa_offset (4)
59         fmov.s  fr9,@-r15
60         cfi_adjust_cfa_offset (4)
61         fmov.s  fr8,@-r15
62         cfi_adjust_cfa_offset (4)
63         fmov.s  fr7,@-r15
64         cfi_adjust_cfa_offset (4)
65         fmov.s  fr6,@-r15
66         cfi_adjust_cfa_offset (4)
67         fmov.s  fr5,@-r15
68         cfi_adjust_cfa_offset (4)
69         fmov.s  fr4,@-r15
70         cfi_adjust_cfa_offset (4)
71 #endif
72         sts.l pr,@-r15
73         cfi_adjust_cfa_offset (4)
74         tst r0,r0
75         bt 1f
76         mov r0,r2
78         mov r0,r4               ! PLT type
79         mov r2,r5               ! link map address
80 #ifdef SHARED
81         mov.l 2f,r2
82         mova 2f,r0
83         add r0,r2               ! Get GOT address in r2
84         mov.l 3f,r0
85         add r2,r0
86 #else
87         mov.l 3f,r0
88 #endif
89         jsr @r0                 ! Call resolver.
90          mov r1,r6              ! reloc offset
91         lds.l @r15+,pr          ! Get register content back.
92         cfi_adjust_cfa_offset (-4)
93 #ifdef HAVE_FPU
94         fmov.s  @r15+,fr4
95         cfi_adjust_cfa_offset (-4)
96         fmov.s  @r15+,fr5
97         cfi_adjust_cfa_offset (-4)
98         fmov.s  @r15+,fr6
99         cfi_adjust_cfa_offset (-4)
100         fmov.s  @r15+,fr7
101         cfi_adjust_cfa_offset (-4)
102         fmov.s  @r15+,fr8
103         cfi_adjust_cfa_offset (-4)
104         fmov.s  @r15+,fr9
105         cfi_adjust_cfa_offset (-4)
106         fmov.s  @r15+,fr10
107         cfi_adjust_cfa_offset (-4)
108         fmov.s  @r15+,fr11
109         cfi_adjust_cfa_offset (-4)
110         lds.l   @r15+,fpscr
111         cfi_adjust_cfa_offset (-4)
112 #endif
113         mov.l @r15+,r3
114         cfi_adjust_cfa_offset (-4)
115         shal r3                 ! Lode T flag.
116         lds.l @r15+,mach
117         cfi_adjust_cfa_offset (-4)
118         lds.l @r15+,macl
119         cfi_adjust_cfa_offset (-4)
120         mov.l @r15+,r12
121         cfi_adjust_cfa_offset (-4)
122         mov.l @r15+,r7
123         cfi_adjust_cfa_offset (-4)
124         mov.l @r15+,r6
125         cfi_adjust_cfa_offset (-4)
126         mov.l @r15+,r5
127         cfi_adjust_cfa_offset (-4)
128         mov.l @r15+,r4
129         cfi_adjust_cfa_offset (-4)
130         mov.l @r15+,r3
131         cfi_adjust_cfa_offset (-4)
132         jmp @r0                 ! Jump to function address.
133          mov.l @r15+,r2
134         cfi_adjust_cfa_offset (-4)
135         .align 2
136 #ifdef SHARED
137 2:      .long _GLOBAL_OFFSET_TABLE_
138 3:      .long _dl_fixup@GOTOFF
139 #else
140 3:      .long _dl_fixup
141 #endif
142         cfi_endproc
143         .size _dl_runtime_resolve, .-_dl_runtime_resolve
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
303 5:      
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_call_pltexit@GOTOFF
428 #else
429 8:      .long _dl_call_pltexit
430 #endif
431         .size _dl_runtime_profile, .-_dl_runtime_profile