Relocate alpha from ports to libc
[glibc.git] / sysdeps / alpha / dl-trampoline.S
blob2f3b66b67e1a3e0fb17c4abed12471f2844b98f5
1 /* PLT trampolines.  Alpha version.
2    Copyright (C) 2005-2014 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    <http://www.gnu.org/licenses/>.  */
19 #include <sysdep.h>
21         .set noat
23 .macro savei regno, offset
24         stq     $\regno, \offset($30)
25         cfi_rel_offset(\regno, \offset)
26 .endm
28 .macro savef regno, offset
29         stt     $f\regno, \offset($30)
30         cfi_rel_offset(\regno+32, \offset)
31 .endm
33         .align  4
34         .globl  _dl_runtime_resolve_new
35         .ent    _dl_runtime_resolve_new
37 #undef FRAMESIZE
38 #define FRAMESIZE       14*8
40 _dl_runtime_resolve_new:
41         .frame  $30, FRAMESIZE, $26, 0
42         .mask   0x4000000, 0
44         ldah    $29, 0($27)             !gpdisp!1
45         lda     $30, -FRAMESIZE($30)
46         stq     $26, 0*8($30)
47         stq     $16, 2*8($30)
49         stq     $17, 3*8($30)
50         lda     $29, 0($29)             !gpdisp!1
51         stq     $18, 4*8($30)
52         mov     $28, $16                /* link_map from .got.plt */
54         stq     $19, 5*8($30)
55         mov     $25, $17                /* offset of reloc entry */
56         stq     $20, 6*8($30)
57         mov     $26, $18                /* return address */
59         stq     $21, 7*8($30)
60         stt     $f16, 8*8($30)
61         stt     $f17, 9*8($30)
62         stt     $f18, 10*8($30)
64         stt     $f19, 11*8($30)
65         stt     $f20, 12*8($30)
66         stt     $f21, 13*8($30)
67         .prologue 2
69         bsr     $26, _dl_fixup          !samegp
70         mov     $0, $27
72         ldq     $26, 0*8($30)
73         ldq     $16, 2*8($30)
74         ldq     $17, 3*8($30)
75         ldq     $18, 4*8($30)
76         ldq     $19, 5*8($30)
77         ldq     $20, 6*8($30)
78         ldq     $21, 7*8($30)
79         ldt     $f16, 8*8($30)
80         ldt     $f17, 9*8($30)
81         ldt     $f18, 10*8($30)
82         ldt     $f19, 11*8($30)
83         ldt     $f20, 12*8($30)
84         ldt     $f21, 13*8($30)
85         lda     $30, FRAMESIZE($30)
86         jmp     $31, ($27), 0
87         .end    _dl_runtime_resolve_new
89         .globl  _dl_runtime_profile_new
90         .type   _dl_runtime_profile_new, @function
92 #undef FRAMESIZE
93 #define FRAMESIZE       20*8
95         /* We save the registers in a different order than desired by
96            .mask/.fmask, so we have to use explicit cfi directives.  */
97         cfi_startproc
99 _dl_runtime_profile_new:
100         ldah    $29, 0($27)             !gpdisp!2
101         lda     $30, -FRAMESIZE($30)
102         savei   26, 0*8
103         stq     $16, 2*8($30)
105         stq     $17, 3*8($30)
106         lda     $29, 0($29)             !gpdisp!2
107         stq     $18, 4*8($30)
108         lda     $1, FRAMESIZE($30)      /* incoming sp value */
110         stq     $1, 1*8($30)
111         stq     $19, 5*8($30)
112         stq     $20, 6*8($30)
113         mov     $28, $16                /* link_map from .got.plt */
115         stq     $21, 7*8($30)
116         mov     $25, $17                /* offset of reloc entry */
117         stt     $f16, 8*8($30)
118         mov     $26, $18                /* return address */
120         stt     $f17, 9*8($30)
121         mov     $30, $19                /* La_alpha_regs address */
122         stt     $f18, 10*8($30)
123         lda     $20, 14*8($30)          /* framesize address */
125         stt     $f19, 11*8($30)
126         stt     $f20, 12*8($30)
127         stt     $f21, 13*8($30)
128         stq     $28, 16*8($30)
129         stq     $25, 17*8($30)
131         bsr     $26, _dl_profile_fixup  !samegp
132         mov     $0, $27
134         /* Discover if we're wrapping this call.  */
135         ldq     $18, 14*8($30)
136         bge     $18, 1f
138         ldq     $26, 0*8($30)
139         ldq     $16, 2*8($30)
140         ldq     $17, 3*8($30)
141         ldq     $18, 4*8($30)
142         ldq     $19, 5*8($30)
143         ldq     $20, 6*8($30)
144         ldq     $21, 7*8($30)
145         ldt     $f16, 8*8($30)
146         ldt     $f17, 9*8($30)
147         ldt     $f18, 10*8($30)
148         ldt     $f19, 11*8($30)
149         ldt     $f20, 12*8($30)
150         ldt     $f21, 13*8($30)
151         lda     $30, FRAMESIZE($30)
152         jmp     $31, ($27), 0
155         /* Create a frame pointer and allocate a new argument frame.  */
156         savei   15, 15*8
157         mov     $30, $15
158         cfi_def_cfa_register (15)
159         addq    $18, 15, $18
160         bic     $18, 15, $18
161         subq    $30, $18, $30
163         /* Save the call destination around memcpy.  */
164         stq     $0, 14*8($30)
166         /* Copy the stack arguments into place.  */
167         lda     $16, 0($30)
168         lda     $17, FRAMESIZE($15)
169         jsr     $26, memcpy
170         ldgp    $29, 0($26)
172         /* Reload the argument registers.  */
173         ldq     $27, 14*8($30)
174         ldq     $16, 2*8($15)
175         ldq     $17, 3*8($15)
176         ldq     $18, 4*8($15)
177         ldq     $19, 5*8($15)
178         ldq     $20, 6*8($15)
179         ldq     $21, 7*8($15)
180         ldt     $f16, 8*8($15)
181         ldt     $f17, 9*8($15)
182         ldt     $f18, 10*8($15)
183         ldt     $f19, 11*8($15)
184         ldt     $f20, 12*8($15)
185         ldt     $f21, 13*8($15)
187         jsr     $26, ($27), 0
188         ldgp    $29, 0($26)
190         /* Set up for call to _dl_call_pltexit.  */
191         ldq     $16, 16*8($15)
192         ldq     $17, 17*8($15)
193         stq     $0, 16*8($15)
194         lda     $18, 0($15)
195         stq     $1, 17*8($15)
196         lda     $19, 16*8($15)
197         stt     $f0, 18*8($15)
198         stt     $f1, 19*8($15)
199         bsr     $26, _dl_call_pltexit   !samegp
201         mov     $15, $30
202         cfi_def_cfa_register (30)
203         ldq     $26, 0($30)
204         ldq     $15, 15*8($30)
205         lda     $30, FRAMESIZE($30)
206         ret
208         cfi_endproc
209         .size   _dl_runtime_profile_new, .-_dl_runtime_profile_new
211         .align  4
212         .globl  _dl_runtime_resolve_old
213         .ent    _dl_runtime_resolve_old
215 #undef FRAMESIZE
216 #define FRAMESIZE       44*8
218 _dl_runtime_resolve_old:
219         lda     $30, -FRAMESIZE($30)
220         .frame  $30, FRAMESIZE, $26
221         /* Preserve all registers that C normally doesn't.  */
222         stq     $26, 0*8($30)
223         stq     $0, 1*8($30)
224         stq     $1, 2*8($30)
225         stq     $2, 3*8($30)
226         stq     $3, 4*8($30)
227         stq     $4, 5*8($30)
228         stq     $5, 6*8($30)
229         stq     $6, 7*8($30)
230         stq     $7, 8*8($30)
231         stq     $8, 9*8($30)
232         stq     $16, 10*8($30)
233         stq     $17, 11*8($30)
234         stq     $18, 12*8($30)
235         stq     $19, 13*8($30)
236         stq     $20, 14*8($30)
237         stq     $21, 15*8($30)
238         stq     $22, 16*8($30)
239         stq     $23, 17*8($30)
240         stq     $24, 18*8($30)
241         stq     $25, 19*8($30)
242         stq     $29, 20*8($30)
243         stt     $f0, 21*8($30)
244         stt     $f1, 22*8($30)
245         stt     $f10, 23*8($30)
246         stt     $f11, 24*8($30)
247         stt     $f12, 25*8($30)
248         stt     $f13, 26*8($30)
249         stt     $f14, 27*8($30)
250         stt     $f15, 28*8($30)
251         stt     $f16, 29*8($30)
252         stt     $f17, 30*8($30)
253         stt     $f18, 31*8($30)
254         stt     $f19, 32*8($30)
255         stt     $f20, 33*8($30)
256         stt     $f21, 34*8($30)
257         stt     $f22, 35*8($30)
258         stt     $f23, 36*8($30)
259         stt     $f24, 37*8($30)
260         stt     $f25, 38*8($30)
261         stt     $f26, 39*8($30)
262         stt     $f27, 40*8($30)
263         stt     $f28, 41*8($30)
264         stt     $f29, 42*8($30)
265         stt     $f30, 43*8($30)
266         .mask   0x27ff01ff, -FRAMESIZE
267         .fmask  0xfffffc03, -FRAMESIZE+21*8
268         /* Set up our GP.  */
269         br      $29, .+4
270         ldgp    $29, 0($29)
271         .prologue 0
272         /* Set up the arguments for _dl_fixup:
273            $16 = link_map out of plt0
274            $17 = offset of reloc entry = ($28 - $27 - 20) /12 * 24
275            $18 = return address
276         */
277         subq    $28, $27, $17
278         ldq     $16, 8($27)
279         subq    $17, 20, $17
280         mov     $26, $18
281         addq    $17, $17, $17
282         bsr     $26, _dl_fixup  !samegp
284         /* Move the destination address into position.  */
285         mov     $0, $27
286         /* Restore program registers.  */
287         ldq     $26, 0*8($30)
288         ldq     $0, 1*8($30)
289         ldq     $1, 2*8($30)
290         ldq     $2, 3*8($30)
291         ldq     $3, 4*8($30)
292         ldq     $4, 5*8($30)
293         ldq     $5, 6*8($30)
294         ldq     $6, 7*8($30)
295         ldq     $7, 8*8($30)
296         ldq     $8, 9*8($30)
297         ldq     $16, 10*8($30)
298         ldq     $17, 11*8($30)
299         ldq     $18, 12*8($30)
300         ldq     $19, 13*8($30)
301         ldq     $20, 14*8($30)
302         ldq     $21, 15*8($30)
303         ldq     $22, 16*8($30)
304         ldq     $23, 17*8($30)
305         ldq     $24, 18*8($30)
306         ldq     $25, 19*8($30)
307         ldq     $29, 20*8($30)
308         ldt     $f0, 21*8($30)
309         ldt     $f1, 22*8($30)
310         ldt     $f10, 23*8($30)
311         ldt     $f11, 24*8($30)
312         ldt     $f12, 25*8($30)
313         ldt     $f13, 26*8($30)
314         ldt     $f14, 27*8($30)
315         ldt     $f15, 28*8($30)
316         ldt     $f16, 29*8($30)
317         ldt     $f17, 30*8($30)
318         ldt     $f18, 31*8($30)
319         ldt     $f19, 32*8($30)
320         ldt     $f20, 33*8($30)
321         ldt     $f21, 34*8($30)
322         ldt     $f22, 35*8($30)
323         ldt     $f23, 36*8($30)
324         ldt     $f24, 37*8($30)
325         ldt     $f25, 38*8($30)
326         ldt     $f26, 39*8($30)
327         ldt     $f27, 40*8($30)
328         ldt     $f28, 41*8($30)
329         ldt     $f29, 42*8($30)
330         ldt     $f30, 43*8($30)
331         /* Flush the Icache after having modified the .plt code.  */
332         imb
333         /* Clean up and turn control to the destination */
334         lda     $30, FRAMESIZE($30)
335         jmp     $31, ($27)
337         .end    _dl_runtime_resolve_old
339         .globl  _dl_runtime_profile_old
340         .usepv  _dl_runtime_profile_old, no
341         .type   _dl_runtime_profile_old, @function
343         /* We save the registers in a different order than desired by
344            .mask/.fmask, so we have to use explicit cfi directives.  */
345         cfi_startproc
347 #undef FRAMESIZE
348 #define FRAMESIZE       50*8
350         .align  4
351 _dl_runtime_profile_old:
352         lda     $30, -FRAMESIZE($30)
353         cfi_adjust_cfa_offset (FRAMESIZE)
355         /* Preserve all argument registers.  This also constructs the
356            La_alpha_regs structure.  */
357         savei   26, 0*8
358         savei   16, 2*8
359         savei   17, 3*8
360         savei   18, 4*8
361         savei   19, 5*8
362         savei   20, 6*8
363         savei   21, 7*8
364         lda     $16, FRAMESIZE($30)
365         savef   16, 8*8
366         savef   17, 9*8
367         savef   18, 10*8
368         savef   19, 11*8
369         savef   20, 12*8
370         savef   21, 13*8
371         stq     $16, 1*8($30)
373         /* Preserve all registers that C normally doesn't.  */
374         savei   0, 14*8
375         savei   1, 15*8
376         savei   2, 16*8
377         savei   3, 17*8
378         savei   4, 18*8
379         savei   5, 19*8
380         savei   6, 20*8
381         savei   7, 21*8
382         savei   8, 22*8
383         savei   22, 23*8
384         savei   23, 24*8
385         savei   24, 25*8
386         savei   25, 26*8
387         savei   29, 27*8
388         savef   0, 28*8
389         savef   1, 29*8
390         savef   10, 30*8
391         savef   11, 31*8
392         savef   12, 32*8
393         savef   13, 33*8
394         savef   14, 34*8
395         savef   15, 35*8
396         savef   22, 36*8
397         savef   23, 37*8
398         savef   24, 38*8
399         savef   25, 39*8
400         savef   26, 40*8
401         savef   27, 41*8
402         savef   28, 42*8
403         savef   29, 43*8
404         savef   30, 44*8
406         /* Set up our GP.  */
407         br      $29, .+4
408         ldgp    $29, 0($29)
410         /* Set up the arguments for _dl_profile_fixup:
411            $16 = link_map out of plt0
412            $17 = offset of reloc entry = ($28 - $27 - 20) /12 * 24
413            $18 = return address
414            $19 = La_alpha_regs address
415            $20 = framesize address
416         */
417         subq    $28, $27, $17
418         ldq     $16, 8($27)
419         subq    $17, 20, $17
420         mov     $26, $18
421         addq    $17, $17, $17
422         lda     $19, 0($30)
423         lda     $20, 45*8($30)
424         stq     $16, 48*8($30)
425         stq     $17, 49*8($30)
427         bsr     $26, _dl_profile_fixup  !samegp
429         /* Discover if we're wrapping this call.  */
430         ldq     $18, 45*8($30)
431         bge     $18, 1f
433         /* Move the destination address into position.  */
434         mov     $0, $27
435         /* Restore program registers.  */
436         ldq     $26, 0*8($30)
437         ldq     $16, 2*8($30)
438         ldq     $17, 3*8($30)
439         ldq     $18, 4*8($30)
440         ldq     $19, 5*8($30)
441         ldq     $20, 6*8($30)
442         ldq     $21, 7*8($30)
443         ldt     $f16, 8*8($30)
444         ldt     $f17, 9*8($30)
445         ldt     $f18, 10*8($30)
446         ldt     $f19, 11*8($30)
447         ldt     $f20, 12*8($30)
448         ldt     $f21, 13*8($30)
449         ldq     $0, 14*8($30)
450         ldq     $1, 15*8($30)
451         ldq     $2, 16*8($30)
452         ldq     $3, 17*8($30)
453         ldq     $4, 18*8($30)
454         ldq     $5, 19*8($30)
455         ldq     $6, 20*8($30)
456         ldq     $7, 21*8($30)
457         ldq     $8, 22*8($30)
458         ldq     $22, 23*8($30)
459         ldq     $23, 24*8($30)
460         ldq     $24, 25*8($30)
461         ldq     $25, 26*8($30)
462         ldq     $29, 27*8($30)
463         ldt     $f0, 28*8($30)
464         ldt     $f1, 29*8($30)
465         ldt     $f10, 30*8($30)
466         ldt     $f11, 31*8($30)
467         ldt     $f12, 32*8($30)
468         ldt     $f13, 33*8($30)
469         ldt     $f14, 34*8($30)
470         ldt     $f15, 35*8($30)
471         ldt     $f22, 36*8($30)
472         ldt     $f23, 37*8($30)
473         ldt     $f24, 38*8($30)
474         ldt     $f25, 39*8($30)
475         ldt     $f26, 40*8($30)
476         ldt     $f27, 41*8($30)
477         ldt     $f28, 42*8($30)
478         ldt     $f29, 43*8($30)
479         ldt     $f30, 44*8($30)
481         /* Clean up and turn control to the destination.  */
482         lda     $30, FRAMESIZE($30)
483         jmp     $31, ($27)
486         /* Create a frame pointer and allocate a new argument frame.  */
487         savei   15, 45*8
488         mov     $30, $15
489         cfi_def_cfa_register (15)
490         addq    $18, 15, $18
491         bic     $18, 15, $18
492         subq    $30, $18, $30
494         /* Save the call destination around memcpy.  */
495         stq     $0, 46*8($30)
497         /* Copy the stack arguments into place.  */
498         lda     $16, 0($30)
499         lda     $17, FRAMESIZE($15)
500         jsr     $26, memcpy
501         ldgp    $29, 0($26)
503         /* Reload the argument registers.  */
504         ldq     $27, 46*8($30)
505         ldq     $16, 2*8($15)
506         ldq     $17, 3*8($15)
507         ldq     $18, 4*8($15)
508         ldq     $19, 5*8($15)
509         ldq     $20, 6*8($15)
510         ldq     $21, 7*8($15)
511         ldt     $f16, 8*8($15)
512         ldt     $f17, 9*8($15)
513         ldt     $f18, 10*8($15)
514         ldt     $f19, 11*8($15)
515         ldt     $f20, 12*8($15)
516         ldt     $f21, 13*8($15)
518         jsr     $26, ($27), 0
519         ldgp    $29, 0($26)
521         /* Set up for call to _dl_call_pltexit.  */
522         ldq     $16, 48*8($15)
523         ldq     $17, 49*8($15)
524         stq     $0, 46*8($15)
525         lda     $18, 0($15)
526         stq     $1, 47*8($15)
527         lda     $19, 46*8($15)
528         stt     $f0, 48*8($15)
529         stt     $f1, 49*8($15)
530         bsr     $26, _dl_call_pltexit   !samegp
532         mov     $15, $30
533         cfi_def_cfa_register (30)
534         ldq     $26, 0($30)
535         ldq     $15, 45*8($30)
536         lda     $30, FRAMESIZE($30)
537         ret
539         cfi_endproc
540         .size   _dl_runtime_profile_old, .-_dl_runtime_profile_old