Warning: That file was not part of the compilation database. It may have many parsing errors.
1 | /* PLT trampolines. s390 version. |
---|---|
2 | Copyright (C) 2016-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 | /* This code is used in dl-runtime.c to call the `fixup' function |
20 | and then redirect to the address it returns. */ |
21 | |
22 | /* The PLT stubs will call _dl_runtime_resolve/_dl_runtime_profile |
23 | * with the following linkage: |
24 | * r2 - r6 : parameter registers |
25 | * f0, f2 : floating point parameter registers |
26 | * v24, v26, v28, v30, v25, v27, v29, v31 : vector parameter registers |
27 | * 24(r15), 28(r15) : PLT arguments PLT1, PLT2 |
28 | * 96(r15) : additional stack parameters |
29 | * The slightly tightened normal clobber rules for function calls apply: |
30 | * r0 : call saved (for __fentry__) |
31 | * r1 - r5 : call clobbered |
32 | * r6 - r13 : call saved |
33 | * r14 : return address (call clobbered) |
34 | * r15 : stack pointer (call saved) |
35 | * f4, f6 : call saved |
36 | * f0 - f3, f5, f7 - f15 : call clobbered |
37 | * v0 - v3, v5, v7 - v15 : bytes 0-7 overlap with fprs: call clobbered |
38 | bytes 8-15: call clobbered |
39 | * v4, v6 : bytes 0-7 overlap with f4, f6: call saved |
40 | bytes 8-15: call clobbered |
41 | * v16 - v31 : call clobbered |
42 | */ |
43 | |
44 | #define CFA_OFF 96 |
45 | #define FRAME_OFF CFA_OFF + FRAME_SIZE |
46 | #define V24_OFF -224 |
47 | #define V25_OFF -208 |
48 | #define V26_OFF -192 |
49 | #define V27_OFF -176 |
50 | #define V28_OFF -160 |
51 | #define V29_OFF -144 |
52 | #define V30_OFF -128 |
53 | #define V31_OFF -112 |
54 | #define R0_OFF -76 |
55 | #define PLT1_OFF -72 |
56 | #define PLT2_OFF -68 |
57 | #define R2_OFF -64 |
58 | #define R3_OFF -60 |
59 | #define R4_OFF -56 |
60 | #define R5_OFF -52 |
61 | #define R14_OFF -48 |
62 | #define R15_OFF -44 |
63 | #define F0_OFF -40 |
64 | #define F2_OFF -32 |
65 | .globl _dl_runtime_resolve |
66 | .type _dl_runtime_resolve, @function |
67 | cfi_startproc |
68 | .align 16 |
69 | _dl_runtime_resolve: |
70 | st %r0,CFA_OFF+R0_OFF(%r15) |
71 | cfi_offset (r0, R0_OFF) |
72 | stm %r2,%r5,CFA_OFF+R2_OFF(%r15) # save registers |
73 | cfi_offset (r2, R2_OFF) |
74 | cfi_offset (r3, R3_OFF) |
75 | cfi_offset (r4, R4_OFF) |
76 | cfi_offset (r5, R5_OFF) |
77 | stm %r14,%r15,CFA_OFF+R14_OFF(%r15) |
78 | cfi_offset (r14, R14_OFF) |
79 | cfi_offset (r15, R15_OFF) |
80 | std %f0,CFA_OFF+F0_OFF(%r15) |
81 | cfi_offset (f0, F0_OFF) |
82 | std %f2,CFA_OFF+F2_OFF(%r15) |
83 | cfi_offset (f2, F2_OFF) |
84 | lr %r0,%r15 |
85 | lm %r2,%r3,CFA_OFF+PLT1_OFF(%r15) # load args saved by PLT |
86 | #ifdef RESTORE_VRS |
87 | # define FRAME_SIZE (CFA_OFF + 128) |
88 | ahi %r15,-FRAME_SIZE # create stack frame |
89 | cfi_adjust_cfa_offset (FRAME_SIZE) |
90 | .machine push |
91 | .machine "z13" |
92 | .machinemode "zarch_nohighgprs" |
93 | vstm %v24,%v31,FRAME_OFF+V24_OFF(%r15) # save call-clobbered vr args |
94 | cfi_offset (v24, V24_OFF) |
95 | cfi_offset (v25, V25_OFF) |
96 | cfi_offset (v26, V26_OFF) |
97 | cfi_offset (v27, V27_OFF) |
98 | cfi_offset (v28, V28_OFF) |
99 | cfi_offset (v29, V29_OFF) |
100 | cfi_offset (v30, V30_OFF) |
101 | cfi_offset (v31, V31_OFF) |
102 | .machine pop |
103 | #else |
104 | # define FRAME_SIZE CFA_OFF |
105 | ahi %r15,-FRAME_SIZE # create stack frame |
106 | cfi_adjust_cfa_offset (FRAME_SIZE) |
107 | #endif |
108 | st %r0,0(%r15) # write backchain |
109 | basr %r1,0 |
110 | 0: l %r14,1f-0b(%r1) |
111 | bas %r14,0(%r14,%r1) # call _dl_fixup |
112 | lr %r1,%r2 # function addr returned in r2 |
113 | #ifdef RESTORE_VRS |
114 | .machine push |
115 | .machine "z13" |
116 | .machinemode "zarch_nohighgprs" |
117 | vlm %v24,%v31,FRAME_OFF+V24_OFF(%r15) # restore vector registers |
118 | .machine pop |
119 | #endif |
120 | lm %r14,%r15,FRAME_OFF+R14_OFF(%r15) # restore frame and registers |
121 | #undef FRAME_SIZE |
122 | cfi_def_cfa_offset (CFA_OFF) |
123 | ld %f0,CFA_OFF+F0_OFF(%r15) |
124 | ld %f2,CFA_OFF+F2_OFF(%r15) |
125 | lm %r2,%r5,CFA_OFF+R2_OFF(%r15) |
126 | l %r0,CFA_OFF+R0_OFF(%r15) |
127 | br %r1 |
128 | 1: .long _dl_fixup - 0b |
129 | cfi_endproc |
130 | .size _dl_runtime_resolve, .-_dl_runtime_resolve |
131 | #undef V24_OFF |
132 | #undef V25_OFF |
133 | #undef V26_OFF |
134 | #undef V27_OFF |
135 | #undef V28_OFF |
136 | #undef V29_OFF |
137 | #undef V30_OFF |
138 | #undef V31_OFF |
139 | #undef R0_OFF |
140 | #undef PLT1_OFF |
141 | #undef PLT2_OFF |
142 | #undef R2_OFF |
143 | #undef R3_OFF |
144 | #undef R4_OFF |
145 | #undef R5_OFF |
146 | #undef R14_OFF |
147 | #undef R15_OFF |
148 | #undef F0_OFF |
149 | #undef F2_OFF |
150 | |
151 | #if !defined PROF && defined SHARED |
152 | # define SIZEOF_STRUCT_LA_S390_32_REGS 168 |
153 | # define REGS_OFF -264 |
154 | # define R2_OFF -264 |
155 | # define R3_OFF -260 |
156 | # define R4_OFF -256 |
157 | # define R5_OFF -252 |
158 | # define R6_OFF -248 |
159 | # define F0_OFF -240 |
160 | # define F2_OFF -232 |
161 | # define V24_OFF -224 |
162 | # define V25_OFF -208 |
163 | # define V26_OFF -192 |
164 | # define V27_OFF -176 |
165 | # define V28_OFF -160 |
166 | # define V29_OFF -144 |
167 | # define V30_OFF -128 |
168 | # define V31_OFF -112 |
169 | # define R0_OFF -88 |
170 | # define R12_OFF -84 |
171 | # define R14_OFF -80 |
172 | # define FRAMESIZE_OFF -76 |
173 | # define PLT1_OFF -72 |
174 | # define PLT2_OFF -68 |
175 | # define PREGS_OFF -64 |
176 | # define RETVAL_OFF -56 |
177 | # define RET_R2_OFF -56 |
178 | # define RET_R3_OFF -52 |
179 | # define RET_F0_OFF -48 |
180 | # define RET_V24_OFF -40 |
181 | .globl _dl_runtime_profile |
182 | .type _dl_runtime_profile, @function |
183 | cfi_startproc |
184 | .align 16 |
185 | _dl_runtime_profile: |
186 | st %r0,CFA_OFF+R0_OFF(%r15) |
187 | cfi_offset (r0, R0_OFF) |
188 | st %r12,CFA_OFF+R12_OFF(%r15) # r12 is used as backup of r15 |
189 | cfi_offset (r12, R12_OFF) |
190 | st %r14,CFA_OFF+R14_OFF(%r15) |
191 | cfi_offset (r14, R14_OFF) |
192 | lr %r12,%r15 # backup stack pointer |
193 | cfi_def_cfa_register (12) |
194 | # define FRAME_SIZE (CFA_OFF + SIZEOF_STRUCT_LA_S390_32_REGS) |
195 | ahi %r15,-FRAME_SIZE # create stack frame: |
196 | st %r12,0(%r15) # save backchain |
197 | |
198 | stm %r2,%r6,FRAME_OFF+R2_OFF(%r15) # save registers |
199 | cfi_offset (r2, R2_OFF) # + r6 needed as arg for |
200 | cfi_offset (r3, R3_OFF) # _dl_profile_fixup |
201 | cfi_offset (r4, R4_OFF) |
202 | cfi_offset (r5, R5_OFF) |
203 | cfi_offset (r6, R6_OFF) |
204 | std %f0,FRAME_OFF+F0_OFF(%r15) |
205 | cfi_offset (f0, F0_OFF) |
206 | std %f2,FRAME_OFF+F2_OFF(%r15) |
207 | cfi_offset (f2, F2_OFF) |
208 | # ifdef RESTORE_VRS |
209 | .machine push |
210 | .machine "z13" |
211 | .machinemode "zarch_nohighgprs" |
212 | vstm %v24,%v31,FRAME_OFF+V24_OFF(%r15) # store call-clobbered |
213 | cfi_offset (v24, V24_OFF) # vr arguments |
214 | cfi_offset (v25, V25_OFF) |
215 | cfi_offset (v26, V26_OFF) |
216 | cfi_offset (v27, V27_OFF) |
217 | cfi_offset (v28, V28_OFF) |
218 | cfi_offset (v29, V29_OFF) |
219 | cfi_offset (v30, V30_OFF) |
220 | cfi_offset (v31, V31_OFF) |
221 | .machine pop |
222 | # endif |
223 | |
224 | lm %r2,%r3,CFA_OFF+PLT1_OFF(%r12) # load arguments saved by PLT |
225 | lr %r4,%r14 # return address as third parm |
226 | basr %r1,0 |
227 | 0: l %r14,6f-0b(%r1) |
228 | la %r5,FRAME_OFF+REGS_OFF(%r15) # struct La_s390_32_regs * |
229 | la %r6,CFA_OFF+FRAMESIZE_OFF(%r12) # long int * framesize |
230 | bas %r14,0(%r14,%r1) # call resolver |
231 | lr %r1,%r2 # function addr returned in r2 |
232 | ld %f0,FRAME_OFF+F0_OFF(%r15) # restore call-clobbered |
233 | ld %f2,FRAME_OFF+F2_OFF(%r15) # arg fprs |
234 | # ifdef RESTORE_VRS |
235 | .machine push |
236 | .machine "z13" |
237 | .machinemode "zarch_nohighgprs"# restore call-clobbered |
238 | vlm %v24,%v31,FRAME_OFF+V24_OFF(%r15)# arg vrs |
239 | .machine pop |
240 | # endif |
241 | icm %r0,15,CFA_OFF+FRAMESIZE_OFF(%r12) # load & test framesize |
242 | jnm 2f |
243 | # framesize < 0 means no |
244 | lm %r2,%r6,FRAME_OFF+R2_OFF(%r15) # pltexit call, so we can do a |
245 | # tail call without |
246 | # copying the arg overflow area |
247 | lr %r15,%r12 # remove stack frame |
248 | cfi_def_cfa_register (15) |
249 | l %r14,CFA_OFF+R14_OFF(%r15) # restore registers |
250 | l %r12,CFA_OFF+R12_OFF(%r15) |
251 | l %r0,CFA_OFF+R0_OFF(%r15) |
252 | br %r1 # tail call |
253 | |
254 | cfi_def_cfa_register (12) |
255 | 2: la %r4,FRAME_OFF+REGS_OFF(%r15) # struct La_s390_32_regs * |
256 | st %r4,CFA_OFF+PREGS_OFF(%r12) |
257 | jz 4f # framesize == 0 ? |
258 | ahi %r0,7 # align framesize to 8 |
259 | lhi %r2,-8 |
260 | nr %r0,%r2 |
261 | slr %r15,%r0 # make room for framesize bytes |
262 | st %r12,0(%r15) # save backchain |
263 | la %r2,FRAME_OFF+REGS_OFF(%r15) |
264 | la %r3,CFA_OFF(%r12) |
265 | srl %r0,3 |
266 | 3: mvc 0(8,%r2),0(%r3) # copy additional parameters |
267 | la %r2,8(%r2) |
268 | la %r3,8(%r3) |
269 | brct %r0,3b |
270 | 4: lm %r2,%r6,0(%r4) # load register parameters |
271 | basr %r14,%r1 # call resolved function |
272 | stm %r2,%r3,CFA_OFF+RET_R2_OFF(%r12) # store return vals r2, r3, f0 |
273 | std %f0,CFA_OFF+RET_F0_OFF(%r12) # to struct La_s390_32_retval |
274 | # ifdef RESTORE_VRS |
275 | .machine push |
276 | .machine "z13" |
277 | vst %v24,CFA_OFF+RET_V24_OFF(%r12) # store return value v24 |
278 | .machine pop |
279 | # endif |
280 | lm %r2,%r4,CFA_OFF+PLT1_OFF(%r12) # r2, r3: args saved by PLT |
281 | # r4: struct La_s390_32_regs * |
282 | basr %r1,0 |
283 | 5: l %r14,7f-5b(%r1) |
284 | la %r5,CFA_OFF+RETVAL_OFF(%r12) # struct La_s390_32_retval * |
285 | bas %r14,0(%r14,%r1) # call _dl_audit_pltexit |
286 | |
287 | lr %r15,%r12 # remove stack frame |
288 | # undef FRAME_SIZE |
289 | cfi_def_cfa_register (15) |
290 | l %r14,CFA_OFF+R14_OFF(%r15) # restore registers |
291 | l %r12,CFA_OFF+R12_OFF(%r15) |
292 | l %r0,CFA_OFF+R0_OFF(%r15) |
293 | lm %r2,%r3,CFA_OFF+RET_R2_OFF(%r15) # restore return values |
294 | ld %f0,CFA_OFF+RET_F0_OFF(%r15) |
295 | # ifdef RESTORE_VRS |
296 | .machine push |
297 | .machine "z13" |
298 | vl %v24,CFA_OFF+RET_V24_OFF(%r15) # restore return value v24 |
299 | .machine pop |
300 | # endif |
301 | br %r14 |
302 | |
303 | 6: .long _dl_profile_fixup - 0b |
304 | 7: .long _dl_audit_pltexit - 5b |
305 | cfi_endproc |
306 | .size _dl_runtime_profile, .-_dl_runtime_profile |
307 | # undef SIZEOF_STRUCT_LA_S390_32_REGS |
308 | # undef REGS_OFF |
309 | # undef R2_OFF |
310 | # undef R3_OFF |
311 | # undef R4_OFF |
312 | # undef R5_OFF |
313 | # undef R6_OFF |
314 | # undef F0_OFF |
315 | # undef F2_OFF |
316 | # undef V24_OFF |
317 | # undef V25_OFF |
318 | # undef V26_OFF |
319 | # undef V27_OFF |
320 | # undef V28_OFF |
321 | # undef V29_OFF |
322 | # undef V30_OFF |
323 | # undef V31_OFF |
324 | # undef R0_OFF |
325 | # undef R12_OFF |
326 | # undef R14_OFF |
327 | # undef FRAMESIZE_OFF |
328 | # undef PLT1_OFF |
329 | # undef PLT2_OFF |
330 | # undef PREGS_OFF |
331 | # undef RETVAL_OFF |
332 | # undef RET_R2_OFF |
333 | # undef RET_R3_OFF |
334 | # undef RET_F0_OFF |
335 | # undef RET_V24_OFF |
336 | #endif |
337 |
Warning: That file was not part of the compilation database. It may have many parsing errors.