1 /* PLT trampolines. ARM version.
2 Copyright (C) 2005-2015 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 /* ??? Needs more rearrangement for the LDM to handle thumb mode. */
22 #include <libc-symbols.h>
25 .globl _dl_runtime_resolve
26 .type _dl_runtime_resolve, #function
31 cfi_adjust_cfa_offset (4)
32 cfi_rel_offset (lr, 0)
35 @ stack[0] contains the return address from this call
36 @ ip contains &GOT[n+3] (pointer to function)
37 @ lr points to &GOT[2]
39 @ Save arguments. We save r4 to realign the stack.
41 cfi_adjust_cfa_offset (20)
42 cfi_rel_offset (r0, 0)
43 cfi_rel_offset (r1, 4)
44 cfi_rel_offset (r2, 8)
45 cfi_rel_offset (r3, 12)
47 @ get pointer to linker struct
50 @ prepare to call _dl_fixup()
51 @ change &GOT[n+3] into 8*n NOTE: reloc are 8 bytes each
62 @ get arguments and return address back. We restore r4
63 @ only to realign the stack.
65 cfi_adjust_cfa_offset (-24)
67 @ jump to the newly found address
71 .size _dl_runtime_resolve, .-_dl_runtime_resolve
74 .globl _dl_runtime_profile
75 .type _dl_runtime_profile, #function
80 cfi_adjust_cfa_offset (4)
81 cfi_rel_offset (lr, 0)
84 @ stack[0] contains the return address from this call
85 @ ip contains &GOT[n+3] (pointer to function)
86 @ lr points to &GOT[2]
90 @ 208 - framesize returned from pltenter
92 @ 8 - Saved two arguments to _dl_profile_fixup
93 @ 4 - Saved result of _dl_profile_fixup
94 @ 0 - outgoing argument to _dl_profile_fixup
95 @ For now, we only save the general purpose registers.
98 cfi_adjust_cfa_offset (196)
100 cfi_rel_offset (r0, 0)
101 cfi_rel_offset (r1, 4)
102 cfi_rel_offset (r2, 8)
103 cfi_rel_offset (r3, 12)
106 cfi_adjust_cfa_offset (16)
114 @ get pointer to linker struct
117 @ prepare to call _dl_profile_fixup()
118 @ change &GOT[n+3] into 8*n NOTE: reloc are 8 bytes each
123 @ Save these two arguments for pltexit.
127 @ Set up extra args for _dl_profile_fixup.
128 @ r2 and r3 are already loaded.
132 @ call profiling fixup routine
135 @ The address to call is now in r0.
137 @ Check whether we're wrapping this function.
146 @ get arguments and return address back
148 cfi_adjust_cfa_offset (-16)
149 ldmia sp, {r0-r3,sp,lr}
150 cfi_adjust_cfa_offset (-200)
152 @ jump to the newly found address
157 @ The new frame size is in ip.
161 @ 264 - saved result of _dl_profile_fixup
163 @ 64 - Saved two arguments to _dl_profile_fixup
165 @ For now, we only save the general purpose registers.
167 @ Build the new frame.
169 cfi_rel_offset (r7, 212)
171 cfi_def_cfa_register (r7)
172 cfi_adjust_cfa_offset (56)
176 @ Save the _dl_profile_fixup result around the call to memcpy.
179 @ Copy the stack arguments.
202 cfi_def_cfa_register (sp)
206 cfi_adjust_cfa_offset (-272)
210 .size _dl_runtime_profile, .-_dl_runtime_profile