2.5-18.1
[glibc.git] / sysdeps / i386 / dl-trampoline.S
blobfd87eb711d8600f252a4f5dd142d3364a0f9793d
1 /* PLT trampolines.  i386 version.
2    Copyright (C) 2004, 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 16
27 _dl_runtime_resolve:
28         cfi_adjust_cfa_offset (8)
29         pushl %eax              # Preserve registers otherwise clobbered.
30         cfi_adjust_cfa_offset (4)
31         pushl %ecx
32         cfi_adjust_cfa_offset (4)
33         pushl %edx
34         cfi_adjust_cfa_offset (4)
35         movl 16(%esp), %edx     # Copy args pushed by PLT in register.  Note
36         movl 12(%esp), %eax     # that `fixup' takes its parameters in regs.
37         call _dl_fixup          # Call resolver.
38         popl %edx               # Get register content back.
39         cfi_adjust_cfa_offset (-4)
40         popl %ecx
41         cfi_adjust_cfa_offset (-4)
42         xchgl %eax, (%esp)      # Get %eax contents end store function address.
43         ret $8                  # Jump to function address.
44         cfi_endproc
45         .size _dl_runtime_resolve, .-_dl_runtime_resolve
48 #ifndef PROF
49         .globl _dl_runtime_profile
50         .type _dl_runtime_profile, @function
51         cfi_startproc
52         .align 16
53 _dl_runtime_profile:
54         cfi_adjust_cfa_offset (8)
55         pushl %esp
56         cfi_adjust_cfa_offset (4)
57         addl $8, (%esp)         # Account for the pushed PLT data
58         pushl %ebp
59         cfi_adjust_cfa_offset (4)
60         pushl %eax              # Preserve registers otherwise clobbered.
61         cfi_adjust_cfa_offset (4)
62         pushl %ecx
63         cfi_adjust_cfa_offset (4)
64         pushl %edx
65         cfi_adjust_cfa_offset (4)
66         movl %esp, %ecx
67         subl $8, %esp
68         cfi_adjust_cfa_offset (8)
69         movl $-1, 4(%esp)
70         leal 4(%esp), %edx
71         movl %edx, (%esp)
72         pushl %ecx              # Address of the register structure
73         cfi_adjust_cfa_offset (4)
74         movl 40(%esp), %ecx     # Load return address
75         movl 36(%esp), %edx     # Copy args pushed by PLT in register.  Note
76         movl 32(%esp), %eax     # that `fixup' takes its parameters in regs.
77         call _dl_profile_fixup  # Call resolver.
78         cfi_adjust_cfa_offset (-8)
79         movl (%esp), %edx
80         testl %edx, %edx
81         jns 1f
82         popl %edx
83         cfi_adjust_cfa_offset (-4)
84         popl %edx               # Get register content back.
85         cfi_adjust_cfa_offset (-4)
86         popl %ecx
87         cfi_adjust_cfa_offset (-4)
88         xchgl %eax, (%esp)      # Get %eax contents end store function address.
89         ret $16                 # Jump to function address.
91         /*
92             +32     return address
93             +28     PLT1
94             +24     PLT2
95             +20     %esp
96             +16     %ebp
97             +12     %eax
98             +8      %ecx
99             +4      %edx
100            %esp     free
101         */
102         cfi_adjust_cfa_offset (12)
103 1:      movl %ebx, (%esp)
104         cfi_rel_offset (3, 0)
105         movl %edx, %ebx         # This is the frame buffer size
106         pushl %edi
107         cfi_adjust_cfa_offset (4)
108         cfi_rel_offset (7, 0)
109         pushl %esi
110         cfi_adjust_cfa_offset (4)
111         cfi_rel_offset (6, 0)
112         leal 44(%esp), %esi
113         movl %ebx, %ecx
114         movl %esp, %edi
115         subl %ebx, %edi
116         andl $0xfffffff0, %edi  # Align stack
117         movl %esp, %ebx
118         cfi_def_cfa_register (3)
119         movl %edi, %esp
120         shrl $2, %ecx
121         rep
122         movsl
123         movl (%edi), %esi
124         cfi_restore (6)
125         movl 4(%edi), %edi
126         cfi_restore (7)
127         /*
128            %ebx+40  return address
129            %ebx+36  PLT1
130            %ebx+32  PLT2
131            %ebx+28  %esp
132            %ebx+24  %ebp
133            %ebx+20  %eax
134            %ebx+16  %ecx
135            %ebx+12  %edx
136            %ebx+8   %ebx
137            %ebx+4   free
138            %ebx     free
139            %esp     copied stack frame
140         */
141         movl %eax, (%ebx)
142         movl 12(%ebx), %edx
143         movl 16(%ebx), %ecx
144         movl 20(%ebx), %eax
145         call *(%ebx)
146         movl %ebx, %esp
147         cfi_def_cfa_register (4)
148         movl 8(%esp), %ebx
149         cfi_restore (3)
150         /*
151             +40     return address
152             +36     PLT1
153             +32     PLT2
154             +28     %esp
155             +24     %ebp
156             +20     %eax
157             +16     %ecx
158             +12     %edx
159             +8      free
160             +4      free
161            %esp     free
162         */
163         subl $20, %esp
164         cfi_adjust_cfa_offset (20)
165         movl %eax, (%esp)
166         movl %edx, 4(%esp)
167         fstpt 8(%esp)
168         fstpt 20(%esp)
169         pushl %esp
170         cfi_adjust_cfa_offset (4)
171         leal 36(%esp), %ecx
172         movl 56(%esp), %eax
173         movl 60(%esp), %edx
174         call _dl_call_pltexit
175         movl (%esp), %eax
176         movl 4(%esp), %edx
177         fldt 20(%esp)
178         fldt 8(%esp)
179         addl $60, %esp
180         cfi_adjust_cfa_offset (-60)
181         ret
182         cfi_endproc
183         .size _dl_runtime_profile, .-_dl_runtime_profile
184 #endif