Update copyright notices with scripts/update-copyrights
[glibc.git] / ports / sysdeps / m68k / dl-trampoline.S
blob1c1bbf301b9667c1966ea7b4a23cce36d8179f27
1 /* PLT trampolines.  m68k 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 #if !defined (__mcoldfire__)
22 # define FMOVE          fmove.x
23 # define FPSPACE        12
24 #elif defined (__mcffpu__)
25 # define FMOVE          fmove.d
26 # define FPSPACE        8
27 #else
28 # define FPSPACE        0
29 #endif
31         .text
32         .globl _dl_runtime_resolve
33         .type _dl_runtime_resolve, @function
34 _dl_runtime_resolve:
35         cfi_startproc
36         cfi_adjust_cfa_offset (8)
37         | Save %a0 (struct return address) and %a1.
38         move.l %a0, -(%sp)
39         cfi_adjust_cfa_offset (4)
40         move.l %a1, -(%sp)
41         cfi_adjust_cfa_offset (4)
42         | Call the real address resolver.
43         jbsr _dl_fixup
44         | Restore register %a0 and %a1.
45         move.l (%sp)+, %a1
46         cfi_adjust_cfa_offset (-4)
47         move.l (%sp)+, %a0
48         cfi_adjust_cfa_offset (-4)
49         | Pop parameters
50         addq.l #8, %sp
51         cfi_adjust_cfa_offset (-8)
52         | Call real function.
53 #ifdef __mcoldfire__
54         move.l %d0,-(%sp)
55         cfi_adjust_cfa_offset (4)
56         rts
57 #else
58         jmp (%d0)
59 #endif
60         cfi_endproc
61         .size _dl_runtime_resolve, . - _dl_runtime_resolve
63         .text
64         .globl _dl_runtime_profile
65         .type _dl_runtime_profile, @function
66 _dl_runtime_profile:
67         cfi_startproc
68         cfi_adjust_cfa_offset (8)
69         pea 8(%sp)
70         cfi_adjust_cfa_offset (4)
71         move.l %a1, -(%sp)
72         cfi_adjust_cfa_offset (4)
73         move.l %a0, -(%sp)
74         cfi_adjust_cfa_offset (4)
75         pea -1.w
76         cfi_adjust_cfa_offset (4)
77         | Push parameters for _dl_profile_fixup
78         pea (%sp)
79         cfi_adjust_cfa_offset (4)
80         pea 8(%sp)
81         cfi_adjust_cfa_offset (4)
82         move.l 32(%sp), -(%sp)
83         cfi_adjust_cfa_offset (4)
84         move.l 32(%sp), -(%sp)
85         cfi_adjust_cfa_offset (4)
86         move.l 32(%sp), -(%sp)
87         cfi_adjust_cfa_offset (4)
88         subq.l #8, %sp
89         cfi_adjust_cfa_offset (8)
90         | Call the real address resolver.
91         jbsr _dl_profile_fixup
92         | Pop parameters
93         lea 28(%sp), %sp
94         cfi_adjust_cfa_offset (-28)
95         move.l (%sp), %d1
96         jpl 1f
97         addq.l #4, %sp
98         cfi_adjust_cfa_offset (-4)
99         | Restore register %a0 and %a1.
100         move.l (%sp)+, %a0
101         cfi_adjust_cfa_offset (-4)
102         move.l (%sp)+, %a1
103         cfi_adjust_cfa_offset (-4)
104         lea 12(%sp), %sp
105         cfi_adjust_cfa_offset (-12)
106         | Call real function.
107 #ifdef __mcoldfire__
108         move.l %d0,-(%sp)
109         cfi_adjust_cfa_offset (4)
110         rts
111 #else
112         jmp (%d0)
113 #endif
115         /*
116             +24     return address
117             +20     PLT1
118             +16     PLT2
119             +12     %sp
120             +8      %a1
121             +4      %a0
122            %sp      free
123         */
124 #ifdef __mcoldfire__
125         cfi_adjust_cfa_offset (20)
126 #else
127         cfi_adjust_cfa_offset (24)
128 #endif
129 1:      move.l %a2, (%sp)
130         cfi_rel_offset (%a2, 0)
131         move.l %sp, %a2
132         move.l %sp, %a0
133         lea 28(%sp), %a1
134         | Round framesize up to longword alignment
135         addq.l #3, %d1
136         and.l #-3, %d1
137         sub.l %d1, %a0
138         move.l %a0, %sp
139         cfi_def_cfa_register (%a2)
140 #ifdef __mcoldfire__
141         tst.l %d1
142         beq 2f
143 1:      move.l (%a1)+, (%a0)+
144         subq.l #4,%d1
145         bne 1b
147 #else
148         lsr.l #2,%d1
149         jra 2f
150 1:      move.l (%a1)+, (%a0)+
151 2:      dbra %d1,1b
152 #endif
153         /*
154            %a2+24  return address
155            %a2+20  PLT1
156            %a2+16  PLT2
157            %a2+12  %sp
158            %a2+8   %a1
159            %a2+4   %a0
160            %a2     %a2
161            %sp     copied stack frame
162         */
164         move.l 4(%a2), %a0
165         move.l 8(%a2), %a1
166 #ifdef __mcoldfire__
167         pea 2f(%pc)
168         move.l %d0,-(%sp)
169         rts
171 #else
172         jsr (%d0)
173 #endif
174         move.l %a2, %sp
175         cfi_def_cfa_register (%sp)
176         move.l (%sp)+, %a2
177         cfi_adjust_cfa_offset (4)
178         cfi_restore (%a2)
179         /*
180             +20     return address
181             +16     PLT1
182             +12     PLT2
183             +8      %sp
184             +4      %a1
185            %sp      %a0
186         */
187 #ifdef FMOVE
188         FMOVE %fp0, -(%sp)
189         cfi_adjust_cfa_offset (FPSPACE)
190 #endif
191         move.l %a0, -(%sp)
192         cfi_adjust_cfa_offset (4)
193         move.l %d1, -(%sp)
194         cfi_adjust_cfa_offset (4)
195         move.l %d0, -(%sp)
196         cfi_adjust_cfa_offset (4)
197         pea (%sp)
198         cfi_adjust_cfa_offset (4)
199         pea (16+FPSPACE)(%sp)
200         cfi_adjust_cfa_offset (4)
201         move.l (32+FPSPACE)(%sp), -(%sp)
202         cfi_adjust_cfa_offset (4)
203         move.l (32+FPSPACE)(%sp), -(%sp)
204         cfi_adjust_cfa_offset (4)
205         jbsr _dl_call_pltexit
206         lea 16(%sp), %sp
207         cfi_adjust_cfa_offset (-16)
208         move.l (%sp)+, %d0
209         cfi_adjust_cfa_offset (-4)
210         move.l (%sp)+, %d1
211         cfi_adjust_cfa_offset (-4)
212         move.l (%sp)+, %a0
213         cfi_adjust_cfa_offset (-4)
214 #ifdef FMOVE
215         FMOVE (%sp)+, %fp0
216         cfi_adjust_cfa_offset (-FPSPACE)
217 #endif
218         lea 20(%sp), %sp
219         cfi_adjust_cfa_offset (-20)
220         rts
221         cfi_endproc
222         .size _dl_runtime_profile, . - _dl_runtime_profile