]>
Commit | Line | Data |
---|---|---|
9dcafc55 | 1 | /* PLT trampolines. i386 version. |
2b778ceb | 2 | Copyright (C) 2004-2021 Free Software Foundation, Inc. |
9dcafc55 UD |
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 | |
59ba27a6 | 16 | License along with the GNU C Library; if not, see |
5a82c748 | 17 | <https://www.gnu.org/licenses/>. */ |
9dcafc55 UD |
18 | |
19 | #include <sysdep.h> | |
ddd85a65 | 20 | #include <link-defines.h> |
9dcafc55 | 21 | |
14c5cbab IZ |
22 | #ifdef HAVE_MPX_SUPPORT |
23 | # define PRESERVE_BND_REGS_PREFIX bnd | |
24 | #else | |
25 | # define PRESERVE_BND_REGS_PREFIX .byte 0xf2 | |
26 | #endif | |
27 | ||
9dcafc55 UD |
28 | .text |
29 | .globl _dl_runtime_resolve | |
30 | .type _dl_runtime_resolve, @function | |
31 | cfi_startproc | |
32 | .align 16 | |
33 | _dl_runtime_resolve: | |
34 | cfi_adjust_cfa_offset (8) | |
f753fa7d | 35 | _CET_ENDBR |
9dcafc55 UD |
36 | pushl %eax # Preserve registers otherwise clobbered. |
37 | cfi_adjust_cfa_offset (4) | |
38 | pushl %ecx | |
39 | cfi_adjust_cfa_offset (4) | |
40 | pushl %edx | |
41 | cfi_adjust_cfa_offset (4) | |
42 | movl 16(%esp), %edx # Copy args pushed by PLT in register. Note | |
43 | movl 12(%esp), %eax # that `fixup' takes its parameters in regs. | |
44 | call _dl_fixup # Call resolver. | |
45 | popl %edx # Get register content back. | |
46 | cfi_adjust_cfa_offset (-4) | |
62e1b1f5 UD |
47 | movl (%esp), %ecx |
48 | movl %eax, (%esp) # Store the function address. | |
49 | movl 4(%esp), %eax | |
50 | ret $12 # Jump to function address. | |
9dcafc55 UD |
51 | cfi_endproc |
52 | .size _dl_runtime_resolve, .-_dl_runtime_resolve | |
53 | ||
f753fa7d L |
54 | # The SHSTK compatible version. |
55 | .text | |
56 | .globl _dl_runtime_resolve_shstk | |
57 | .type _dl_runtime_resolve_shstk, @function | |
58 | cfi_startproc | |
59 | .align 16 | |
60 | _dl_runtime_resolve_shstk: | |
61 | cfi_adjust_cfa_offset (8) | |
62 | _CET_ENDBR | |
63 | pushl %eax # Preserve registers otherwise clobbered. | |
64 | cfi_adjust_cfa_offset (4) | |
65 | pushl %edx | |
66 | cfi_adjust_cfa_offset (4) | |
67 | movl 12(%esp), %edx # Copy args pushed by PLT in register. Note | |
68 | movl 8(%esp), %eax # that `fixup' takes its parameters in regs. | |
69 | call _dl_fixup # Call resolver. | |
70 | movl (%esp), %edx # Get register content back. | |
71 | movl %eax, %ecx # Store the function address. | |
72 | movl 4(%esp), %eax # Get register content back. | |
73 | addl $16, %esp # Adjust stack: PLT1 + PLT2 + %eax + %edx | |
74 | cfi_adjust_cfa_offset (-16) | |
75 | jmp *%ecx # Jump to function address. | |
76 | cfi_endproc | |
77 | .size _dl_runtime_resolve_shstk, .-_dl_runtime_resolve_shstk | |
9dcafc55 | 78 | |
9f0d7b6d | 79 | #ifndef PROF |
f753fa7d L |
80 | # The SHSTK compatible version. |
81 | .globl _dl_runtime_profile_shstk | |
82 | .type _dl_runtime_profile_shstk, @function | |
83 | cfi_startproc | |
84 | .align 16 | |
85 | _dl_runtime_profile_shstk: | |
86 | cfi_adjust_cfa_offset (8) | |
87 | _CET_ENDBR | |
88 | pushl %esp | |
89 | cfi_adjust_cfa_offset (4) | |
90 | addl $8, (%esp) # Account for the pushed PLT data | |
91 | pushl %ebp | |
92 | cfi_adjust_cfa_offset (4) | |
93 | pushl %eax # Preserve registers otherwise clobbered. | |
94 | cfi_adjust_cfa_offset (4) | |
95 | pushl %ecx | |
96 | cfi_adjust_cfa_offset (4) | |
97 | pushl %edx | |
98 | cfi_adjust_cfa_offset (4) | |
99 | movl %esp, %ecx | |
100 | subl $8, %esp | |
101 | cfi_adjust_cfa_offset (8) | |
102 | movl $-1, 4(%esp) | |
103 | leal 4(%esp), %edx | |
104 | movl %edx, (%esp) | |
105 | pushl %ecx # Address of the register structure | |
106 | cfi_adjust_cfa_offset (4) | |
107 | movl 40(%esp), %ecx # Load return address | |
108 | movl 36(%esp), %edx # Copy args pushed by PLT in register. Note | |
109 | movl 32(%esp), %eax # that `fixup' takes its parameters in regs. | |
110 | call _dl_profile_fixup # Call resolver. | |
111 | cfi_adjust_cfa_offset (-8) | |
112 | movl (%esp), %edx | |
113 | testl %edx, %edx | |
114 | jns 1f | |
115 | movl 4(%esp), %edx # Get register content back. | |
116 | movl %eax, %ecx # Store the function address. | |
117 | movl 12(%esp), %eax # Get register content back. | |
118 | # Adjust stack: PLT1 + PLT2 + %esp + %ebp + %eax + %ecx + %edx | |
119 | # + free. | |
120 | addl $32, %esp | |
121 | cfi_adjust_cfa_offset (-32) | |
122 | jmp *%ecx # Jump to function address. | |
123 | cfi_endproc | |
124 | .size _dl_runtime_profile_shstk, .-_dl_runtime_profile_shstk | |
125 | ||
9dcafc55 UD |
126 | .globl _dl_runtime_profile |
127 | .type _dl_runtime_profile, @function | |
128 | cfi_startproc | |
129 | .align 16 | |
130 | _dl_runtime_profile: | |
131 | cfi_adjust_cfa_offset (8) | |
f753fa7d | 132 | _CET_ENDBR |
9dcafc55 UD |
133 | pushl %esp |
134 | cfi_adjust_cfa_offset (4) | |
135 | addl $8, (%esp) # Account for the pushed PLT data | |
136 | pushl %ebp | |
137 | cfi_adjust_cfa_offset (4) | |
138 | pushl %eax # Preserve registers otherwise clobbered. | |
139 | cfi_adjust_cfa_offset (4) | |
140 | pushl %ecx | |
141 | cfi_adjust_cfa_offset (4) | |
142 | pushl %edx | |
143 | cfi_adjust_cfa_offset (4) | |
144 | movl %esp, %ecx | |
145 | subl $8, %esp | |
146 | cfi_adjust_cfa_offset (8) | |
147 | movl $-1, 4(%esp) | |
148 | leal 4(%esp), %edx | |
149 | movl %edx, (%esp) | |
150 | pushl %ecx # Address of the register structure | |
151 | cfi_adjust_cfa_offset (4) | |
152 | movl 40(%esp), %ecx # Load return address | |
153 | movl 36(%esp), %edx # Copy args pushed by PLT in register. Note | |
154 | movl 32(%esp), %eax # that `fixup' takes its parameters in regs. | |
155 | call _dl_profile_fixup # Call resolver. | |
156 | cfi_adjust_cfa_offset (-8) | |
157 | movl (%esp), %edx | |
158 | testl %edx, %edx | |
159 | jns 1f | |
160 | popl %edx | |
161 | cfi_adjust_cfa_offset (-4) | |
162 | popl %edx # Get register content back. | |
163 | cfi_adjust_cfa_offset (-4) | |
62e1b1f5 UD |
164 | movl (%esp), %ecx |
165 | movl %eax, (%esp) # Store the function address. | |
166 | movl 4(%esp), %eax | |
167 | ret $20 # Jump to function address. | |
9dcafc55 UD |
168 | |
169 | /* | |
170 | +32 return address | |
171 | +28 PLT1 | |
172 | +24 PLT2 | |
173 | +20 %esp | |
174 | +16 %ebp | |
175 | +12 %eax | |
176 | +8 %ecx | |
177 | +4 %edx | |
178 | %esp free | |
179 | */ | |
fbeb5f4d | 180 | cfi_adjust_cfa_offset (8) |
9dcafc55 | 181 | 1: movl %ebx, (%esp) |
14c8bf3b | 182 | cfi_rel_offset (ebx, 0) |
9dcafc55 UD |
183 | movl %edx, %ebx # This is the frame buffer size |
184 | pushl %edi | |
185 | cfi_adjust_cfa_offset (4) | |
14c8bf3b | 186 | cfi_rel_offset (edi, 0) |
9dcafc55 UD |
187 | pushl %esi |
188 | cfi_adjust_cfa_offset (4) | |
14c8bf3b | 189 | cfi_rel_offset (esi, 0) |
9dcafc55 UD |
190 | leal 44(%esp), %esi |
191 | movl %ebx, %ecx | |
73e3ff07 UD |
192 | orl $4, %ebx # Increase frame size if necessary to align |
193 | # stack for the function call | |
a6fa5328 | 194 | andl $~3, %ebx |
9dcafc55 UD |
195 | movl %esp, %edi |
196 | subl %ebx, %edi | |
9dcafc55 | 197 | movl %esp, %ebx |
14c8bf3b | 198 | cfi_def_cfa_register (ebx) |
9dcafc55 UD |
199 | movl %edi, %esp |
200 | shrl $2, %ecx | |
201 | rep | |
202 | movsl | |
a6fa5328 | 203 | movl (%ebx), %esi |
14c8bf3b | 204 | cfi_restore (esi) |
a6fa5328 | 205 | movl 4(%ebx), %edi |
14c8bf3b | 206 | cfi_restore (edi) |
9dcafc55 UD |
207 | /* |
208 | %ebx+40 return address | |
209 | %ebx+36 PLT1 | |
210 | %ebx+32 PLT2 | |
211 | %ebx+28 %esp | |
212 | %ebx+24 %ebp | |
213 | %ebx+20 %eax | |
214 | %ebx+16 %ecx | |
215 | %ebx+12 %edx | |
216 | %ebx+8 %ebx | |
217 | %ebx+4 free | |
218 | %ebx free | |
219 | %esp copied stack frame | |
220 | */ | |
221 | movl %eax, (%ebx) | |
222 | movl 12(%ebx), %edx | |
223 | movl 16(%ebx), %ecx | |
224 | movl 20(%ebx), %eax | |
225 | call *(%ebx) | |
226 | movl %ebx, %esp | |
14c8bf3b | 227 | cfi_def_cfa_register (esp) |
9dcafc55 | 228 | movl 8(%esp), %ebx |
14c8bf3b | 229 | cfi_restore (ebx) |
9dcafc55 UD |
230 | /* |
231 | +40 return address | |
232 | +36 PLT1 | |
233 | +32 PLT2 | |
234 | +28 %esp | |
235 | +24 %ebp | |
236 | +20 %eax | |
237 | +16 %ecx | |
238 | +12 %edx | |
239 | +8 free | |
240 | +4 free | |
241 | %esp free | |
242 | */ | |
ddd85a65 L |
243 | #if LONG_DOUBLE_SIZE != 12 |
244 | # error "long double size must be 12 bytes" | |
245 | #endif | |
246 | # Allocate space for La_i86_retval and subtract 12 free bytes. | |
247 | subl $(LRV_SIZE - 12), %esp | |
248 | cfi_adjust_cfa_offset (LRV_SIZE - 12) | |
249 | movl %eax, LRV_EAX_OFFSET(%esp) | |
250 | movl %edx, LRV_EDX_OFFSET(%esp) | |
251 | fstpt LRV_ST0_OFFSET(%esp) | |
252 | fstpt LRV_ST1_OFFSET(%esp) | |
14c5cbab IZ |
253 | #ifdef HAVE_MPX_SUPPORT |
254 | bndmov %bnd0, LRV_BND0_OFFSET(%esp) | |
255 | bndmov %bnd1, LRV_BND1_OFFSET(%esp) | |
256 | #else | |
257 | .byte 0x66,0x0f,0x1b,0x44,0x24,LRV_BND0_OFFSET | |
258 | .byte 0x66,0x0f,0x1b,0x4c,0x24,LRV_BND1_OFFSET | |
259 | #endif | |
9dcafc55 UD |
260 | pushl %esp |
261 | cfi_adjust_cfa_offset (4) | |
ddd85a65 L |
262 | # Address of La_i86_regs area. |
263 | leal (LRV_SIZE + 4)(%esp), %ecx | |
264 | # PLT2 | |
265 | movl (LRV_SIZE + 4 + LR_SIZE)(%esp), %eax | |
266 | # PLT1 | |
267 | movl (LRV_SIZE + 4 + LR_SIZE + 4)(%esp), %edx | |
9dcafc55 | 268 | call _dl_call_pltexit |
ddd85a65 L |
269 | movl LRV_EAX_OFFSET(%esp), %eax |
270 | movl LRV_EDX_OFFSET(%esp), %edx | |
271 | fldt LRV_ST1_OFFSET(%esp) | |
272 | fldt LRV_ST0_OFFSET(%esp) | |
14c5cbab IZ |
273 | #ifdef HAVE_MPX_SUPPORT |
274 | bndmov LRV_BND0_OFFSET(%esp), %bnd0 | |
275 | bndmov LRV_BND1_OFFSET(%esp), %bnd1 | |
276 | #else | |
277 | .byte 0x66,0x0f,0x1a,0x44,0x24,LRV_BND0_OFFSET | |
278 | .byte 0x66,0x0f,0x1a,0x4c,0x24,LRV_BND1_OFFSET | |
279 | #endif | |
ddd85a65 L |
280 | # Restore stack before return. |
281 | addl $(LRV_SIZE + 4 + LR_SIZE + 4), %esp | |
282 | cfi_adjust_cfa_offset (-(LRV_SIZE + 4 + LR_SIZE + 4)) | |
14c5cbab | 283 | PRESERVE_BND_REGS_PREFIX |
9dcafc55 UD |
284 | ret |
285 | cfi_endproc | |
286 | .size _dl_runtime_profile, .-_dl_runtime_profile | |
9f0d7b6d | 287 | #endif |