1 /* PLT trampolines. ARM version.
2 Copyright (C) 2005, 2010 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
21 #include <libc-symbols.h>
23 #if defined(__USE_BX__)
26 #define BX(x) mov pc, x
30 .globl _dl_runtime_resolve
31 .type _dl_runtime_resolve, #function
32 .cfi_sections .debug_frame
36 cfi_adjust_cfa_offset (4)
37 cfi_rel_offset (lr, 0)
40 @ stack[0] contains the return address from this call
41 @ ip contains &GOT[n+3] (pointer to function)
42 @ lr points to &GOT[2]
44 @ Save arguments. We save r4 to realign the stack.
46 cfi_adjust_cfa_offset (20)
47 cfi_rel_offset (r0, 0)
48 cfi_rel_offset (r1, 4)
49 cfi_rel_offset (r2, 8)
50 cfi_rel_offset (r3, 12)
52 @ get pointer to linker struct
55 @ prepare to call _dl_fixup()
56 @ change &GOT[n+3] into 8*n NOTE: reloc are 8 bytes each
67 @ get arguments and return address back. We restore r4
68 @ only to realign the stack.
70 cfi_adjust_cfa_offset (-24)
72 @ jump to the newly found address
76 .size _dl_runtime_resolve, .-_dl_runtime_resolve
79 .globl _dl_runtime_profile
80 .type _dl_runtime_profile, #function
81 .cfi_sections .debug_frame
85 cfi_adjust_cfa_offset (4)
86 cfi_rel_offset (lr, 0)
89 @ stack[0] contains the return address from this call
90 @ ip contains &GOT[n+3] (pointer to function)
91 @ lr points to &GOT[2]
95 @ 208 - framesize returned from pltenter
97 @ 8 - Saved two arguments to _dl_profile_fixup
98 @ 4 - Saved result of _dl_profile_fixup
99 @ 0 - outgoing argument to _dl_profile_fixup
100 @ For now, we only save the general purpose registers.
103 cfi_adjust_cfa_offset (196)
105 cfi_rel_offset (r0, 0)
106 cfi_rel_offset (r1, 4)
107 cfi_rel_offset (r2, 8)
108 cfi_rel_offset (r3, 12)
111 cfi_adjust_cfa_offset (16)
119 @ get pointer to linker struct
122 @ prepare to call _dl_profile_fixup()
123 @ change &GOT[n+3] into 8*n NOTE: reloc are 8 bytes each
128 @ Save these two arguments for pltexit.
132 @ Set up extra args for _dl_profile_fixup.
133 @ r2 and r3 are already loaded.
137 @ call profiling fixup routine
140 @ The address to call is now in r0.
142 @ Check whether we're wrapping this function.
151 @ get arguments and return address back
153 cfi_adjust_cfa_offset (-16)
154 ldmia sp, {r0-r3,sp,lr}
155 cfi_adjust_cfa_offset (-200)
157 @ jump to the newly found address
162 @ The new frame size is in ip.
166 @ 264 - saved result of _dl_profile_fixup
168 @ 64 - Saved two arguments to _dl_profile_fixup
170 @ For now, we only save the general purpose registers.
172 @ Build the new frame.
174 cfi_rel_offset (r7, 212)
176 cfi_def_cfa_register (r7)
177 cfi_adjust_cfa_offset (56)
181 @ Save the _dl_profile_fixup result around the call to memcpy.
184 @ Copy the stack arguments.
208 cfi_def_cfa_register (sp)
212 cfi_adjust_cfa_offset (-272)
216 .size _dl_runtime_profile, .-_dl_runtime_profile