arm-linux-tdep.c revision 1.1.1.3 1 1.1 christos /* GNU/Linux on ARM target support.
2 1.1 christos
3 1.1.1.2 christos Copyright (C) 1999-2015 Free Software Foundation, Inc.
4 1.1 christos
5 1.1 christos This file is part of GDB.
6 1.1 christos
7 1.1 christos This program is free software; you can redistribute it and/or modify
8 1.1 christos it under the terms of the GNU General Public License as published by
9 1.1 christos the Free Software Foundation; either version 3 of the License, or
10 1.1 christos (at your option) any later version.
11 1.1 christos
12 1.1 christos This program is distributed in the hope that it will be useful,
13 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 1.1 christos GNU General Public License for more details.
16 1.1 christos
17 1.1 christos You should have received a copy of the GNU General Public License
18 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 1.1 christos
20 1.1 christos #include "defs.h"
21 1.1 christos #include "target.h"
22 1.1 christos #include "value.h"
23 1.1 christos #include "gdbtypes.h"
24 1.1 christos #include "floatformat.h"
25 1.1 christos #include "gdbcore.h"
26 1.1 christos #include "frame.h"
27 1.1 christos #include "regcache.h"
28 1.1 christos #include "doublest.h"
29 1.1 christos #include "solib-svr4.h"
30 1.1 christos #include "osabi.h"
31 1.1 christos #include "regset.h"
32 1.1 christos #include "trad-frame.h"
33 1.1 christos #include "tramp-frame.h"
34 1.1 christos #include "breakpoint.h"
35 1.1 christos #include "auxv.h"
36 1.1 christos #include "xml-syscall.h"
37 1.1 christos
38 1.1 christos #include "arm-tdep.h"
39 1.1 christos #include "arm-linux-tdep.h"
40 1.1 christos #include "linux-tdep.h"
41 1.1 christos #include "glibc-tdep.h"
42 1.1 christos #include "arch-utils.h"
43 1.1 christos #include "inferior.h"
44 1.1.1.2 christos #include "infrun.h"
45 1.1 christos #include "gdbthread.h"
46 1.1 christos #include "symfile.h"
47 1.1 christos
48 1.1.1.2 christos #include "record-full.h"
49 1.1.1.2 christos #include "linux-record.h"
50 1.1.1.2 christos
51 1.1 christos #include "cli/cli-utils.h"
52 1.1 christos #include "stap-probe.h"
53 1.1 christos #include "parser-defs.h"
54 1.1 christos #include "user-regs.h"
55 1.1 christos #include <ctype.h>
56 1.1 christos #include "elf/common.h"
57 1.1 christos extern int arm_apcs_32;
58 1.1 christos
59 1.1 christos /* Under ARM GNU/Linux the traditional way of performing a breakpoint
60 1.1 christos is to execute a particular software interrupt, rather than use a
61 1.1 christos particular undefined instruction to provoke a trap. Upon exection
62 1.1 christos of the software interrupt the kernel stops the inferior with a
63 1.1 christos SIGTRAP, and wakes the debugger. */
64 1.1 christos
65 1.1 christos static const gdb_byte arm_linux_arm_le_breakpoint[] = { 0x01, 0x00, 0x9f, 0xef };
66 1.1 christos
67 1.1 christos static const gdb_byte arm_linux_arm_be_breakpoint[] = { 0xef, 0x9f, 0x00, 0x01 };
68 1.1 christos
69 1.1 christos /* However, the EABI syscall interface (new in Nov. 2005) does not look at
70 1.1 christos the operand of the swi if old-ABI compatibility is disabled. Therefore,
71 1.1 christos use an undefined instruction instead. This is supported as of kernel
72 1.1 christos version 2.5.70 (May 2003), so should be a safe assumption for EABI
73 1.1 christos binaries. */
74 1.1 christos
75 1.1 christos static const gdb_byte eabi_linux_arm_le_breakpoint[] = { 0xf0, 0x01, 0xf0, 0xe7 };
76 1.1 christos
77 1.1 christos static const gdb_byte eabi_linux_arm_be_breakpoint[] = { 0xe7, 0xf0, 0x01, 0xf0 };
78 1.1 christos
79 1.1 christos /* All the kernels which support Thumb support using a specific undefined
80 1.1 christos instruction for the Thumb breakpoint. */
81 1.1 christos
82 1.1 christos static const gdb_byte arm_linux_thumb_be_breakpoint[] = {0xde, 0x01};
83 1.1 christos
84 1.1 christos static const gdb_byte arm_linux_thumb_le_breakpoint[] = {0x01, 0xde};
85 1.1 christos
86 1.1 christos /* Because the 16-bit Thumb breakpoint is affected by Thumb-2 IT blocks,
87 1.1 christos we must use a length-appropriate breakpoint for 32-bit Thumb
88 1.1 christos instructions. See also thumb_get_next_pc. */
89 1.1 christos
90 1.1 christos static const gdb_byte arm_linux_thumb2_be_breakpoint[] = { 0xf7, 0xf0, 0xa0, 0x00 };
91 1.1 christos
92 1.1 christos static const gdb_byte arm_linux_thumb2_le_breakpoint[] = { 0xf0, 0xf7, 0x00, 0xa0 };
93 1.1 christos
94 1.1 christos /* Description of the longjmp buffer. The buffer is treated as an array of
95 1.1 christos elements of size ARM_LINUX_JB_ELEMENT_SIZE.
96 1.1 christos
97 1.1 christos The location of saved registers in this buffer (in particular the PC
98 1.1 christos to use after longjmp is called) varies depending on the ABI (in
99 1.1 christos particular the FP model) and also (possibly) the C Library.
100 1.1 christos
101 1.1 christos For glibc, eglibc, and uclibc the following holds: If the FP model is
102 1.1 christos SoftVFP or VFP (which implies EABI) then the PC is at offset 9 in the
103 1.1 christos buffer. This is also true for the SoftFPA model. However, for the FPA
104 1.1 christos model the PC is at offset 21 in the buffer. */
105 1.1 christos #define ARM_LINUX_JB_ELEMENT_SIZE INT_REGISTER_SIZE
106 1.1 christos #define ARM_LINUX_JB_PC_FPA 21
107 1.1 christos #define ARM_LINUX_JB_PC_EABI 9
108 1.1 christos
109 1.1 christos /*
110 1.1 christos Dynamic Linking on ARM GNU/Linux
111 1.1 christos --------------------------------
112 1.1 christos
113 1.1 christos Note: PLT = procedure linkage table
114 1.1 christos GOT = global offset table
115 1.1 christos
116 1.1 christos As much as possible, ELF dynamic linking defers the resolution of
117 1.1 christos jump/call addresses until the last minute. The technique used is
118 1.1 christos inspired by the i386 ELF design, and is based on the following
119 1.1 christos constraints.
120 1.1 christos
121 1.1 christos 1) The calling technique should not force a change in the assembly
122 1.1 christos code produced for apps; it MAY cause changes in the way assembly
123 1.1 christos code is produced for position independent code (i.e. shared
124 1.1 christos libraries).
125 1.1 christos
126 1.1 christos 2) The technique must be such that all executable areas must not be
127 1.1 christos modified; and any modified areas must not be executed.
128 1.1 christos
129 1.1 christos To do this, there are three steps involved in a typical jump:
130 1.1 christos
131 1.1 christos 1) in the code
132 1.1 christos 2) through the PLT
133 1.1 christos 3) using a pointer from the GOT
134 1.1 christos
135 1.1 christos When the executable or library is first loaded, each GOT entry is
136 1.1 christos initialized to point to the code which implements dynamic name
137 1.1 christos resolution and code finding. This is normally a function in the
138 1.1 christos program interpreter (on ARM GNU/Linux this is usually
139 1.1 christos ld-linux.so.2, but it does not have to be). On the first
140 1.1 christos invocation, the function is located and the GOT entry is replaced
141 1.1 christos with the real function address. Subsequent calls go through steps
142 1.1 christos 1, 2 and 3 and end up calling the real code.
143 1.1 christos
144 1.1 christos 1) In the code:
145 1.1 christos
146 1.1 christos b function_call
147 1.1 christos bl function_call
148 1.1 christos
149 1.1 christos This is typical ARM code using the 26 bit relative branch or branch
150 1.1 christos and link instructions. The target of the instruction
151 1.1 christos (function_call is usually the address of the function to be called.
152 1.1 christos In position independent code, the target of the instruction is
153 1.1 christos actually an entry in the PLT when calling functions in a shared
154 1.1 christos library. Note that this call is identical to a normal function
155 1.1 christos call, only the target differs.
156 1.1 christos
157 1.1 christos 2) In the PLT:
158 1.1 christos
159 1.1 christos The PLT is a synthetic area, created by the linker. It exists in
160 1.1 christos both executables and libraries. It is an array of stubs, one per
161 1.1 christos imported function call. It looks like this:
162 1.1 christos
163 1.1 christos PLT[0]:
164 1.1 christos str lr, [sp, #-4]! @push the return address (lr)
165 1.1 christos ldr lr, [pc, #16] @load from 6 words ahead
166 1.1 christos add lr, pc, lr @form an address for GOT[0]
167 1.1 christos ldr pc, [lr, #8]! @jump to the contents of that addr
168 1.1 christos
169 1.1 christos The return address (lr) is pushed on the stack and used for
170 1.1 christos calculations. The load on the second line loads the lr with
171 1.1 christos &GOT[3] - . - 20. The addition on the third leaves:
172 1.1 christos
173 1.1 christos lr = (&GOT[3] - . - 20) + (. + 8)
174 1.1 christos lr = (&GOT[3] - 12)
175 1.1 christos lr = &GOT[0]
176 1.1 christos
177 1.1 christos On the fourth line, the pc and lr are both updated, so that:
178 1.1 christos
179 1.1 christos pc = GOT[2]
180 1.1 christos lr = &GOT[0] + 8
181 1.1 christos = &GOT[2]
182 1.1 christos
183 1.1 christos NOTE: PLT[0] borrows an offset .word from PLT[1]. This is a little
184 1.1 christos "tight", but allows us to keep all the PLT entries the same size.
185 1.1 christos
186 1.1 christos PLT[n+1]:
187 1.1 christos ldr ip, [pc, #4] @load offset from gotoff
188 1.1 christos add ip, pc, ip @add the offset to the pc
189 1.1 christos ldr pc, [ip] @jump to that address
190 1.1 christos gotoff: .word GOT[n+3] - .
191 1.1 christos
192 1.1 christos The load on the first line, gets an offset from the fourth word of
193 1.1 christos the PLT entry. The add on the second line makes ip = &GOT[n+3],
194 1.1 christos which contains either a pointer to PLT[0] (the fixup trampoline) or
195 1.1 christos a pointer to the actual code.
196 1.1 christos
197 1.1 christos 3) In the GOT:
198 1.1 christos
199 1.1 christos The GOT contains helper pointers for both code (PLT) fixups and
200 1.1 christos data fixups. The first 3 entries of the GOT are special. The next
201 1.1 christos M entries (where M is the number of entries in the PLT) belong to
202 1.1 christos the PLT fixups. The next D (all remaining) entries belong to
203 1.1 christos various data fixups. The actual size of the GOT is 3 + M + D.
204 1.1 christos
205 1.1 christos The GOT is also a synthetic area, created by the linker. It exists
206 1.1 christos in both executables and libraries. When the GOT is first
207 1.1 christos initialized , all the GOT entries relating to PLT fixups are
208 1.1 christos pointing to code back at PLT[0].
209 1.1 christos
210 1.1 christos The special entries in the GOT are:
211 1.1 christos
212 1.1 christos GOT[0] = linked list pointer used by the dynamic loader
213 1.1 christos GOT[1] = pointer to the reloc table for this module
214 1.1 christos GOT[2] = pointer to the fixup/resolver code
215 1.1 christos
216 1.1 christos The first invocation of function call comes through and uses the
217 1.1 christos fixup/resolver code. On the entry to the fixup/resolver code:
218 1.1 christos
219 1.1 christos ip = &GOT[n+3]
220 1.1 christos lr = &GOT[2]
221 1.1 christos stack[0] = return address (lr) of the function call
222 1.1 christos [r0, r1, r2, r3] are still the arguments to the function call
223 1.1 christos
224 1.1 christos This is enough information for the fixup/resolver code to work
225 1.1 christos with. Before the fixup/resolver code returns, it actually calls
226 1.1 christos the requested function and repairs &GOT[n+3]. */
227 1.1 christos
228 1.1 christos /* The constants below were determined by examining the following files
229 1.1 christos in the linux kernel sources:
230 1.1 christos
231 1.1 christos arch/arm/kernel/signal.c
232 1.1 christos - see SWI_SYS_SIGRETURN and SWI_SYS_RT_SIGRETURN
233 1.1 christos include/asm-arm/unistd.h
234 1.1 christos - see __NR_sigreturn, __NR_rt_sigreturn, and __NR_SYSCALL_BASE */
235 1.1 christos
236 1.1 christos #define ARM_LINUX_SIGRETURN_INSTR 0xef900077
237 1.1 christos #define ARM_LINUX_RT_SIGRETURN_INSTR 0xef9000ad
238 1.1 christos
239 1.1 christos /* For ARM EABI, the syscall number is not in the SWI instruction
240 1.1 christos (instead it is loaded into r7). We recognize the pattern that
241 1.1 christos glibc uses... alternatively, we could arrange to do this by
242 1.1 christos function name, but they are not always exported. */
243 1.1 christos #define ARM_SET_R7_SIGRETURN 0xe3a07077
244 1.1 christos #define ARM_SET_R7_RT_SIGRETURN 0xe3a070ad
245 1.1 christos #define ARM_EABI_SYSCALL 0xef000000
246 1.1 christos
247 1.1.1.2 christos /* Equivalent patterns for Thumb2. */
248 1.1.1.2 christos #define THUMB2_SET_R7_SIGRETURN1 0xf04f
249 1.1.1.2 christos #define THUMB2_SET_R7_SIGRETURN2 0x0777
250 1.1.1.2 christos #define THUMB2_SET_R7_RT_SIGRETURN1 0xf04f
251 1.1.1.2 christos #define THUMB2_SET_R7_RT_SIGRETURN2 0x07ad
252 1.1.1.2 christos #define THUMB2_EABI_SYSCALL 0xdf00
253 1.1.1.2 christos
254 1.1 christos /* OABI syscall restart trampoline, used for EABI executables too
255 1.1 christos whenever OABI support has been enabled in the kernel. */
256 1.1 christos #define ARM_OABI_SYSCALL_RESTART_SYSCALL 0xef900000
257 1.1 christos #define ARM_LDR_PC_SP_12 0xe49df00c
258 1.1 christos #define ARM_LDR_PC_SP_4 0xe49df004
259 1.1 christos
260 1.1 christos static void
261 1.1 christos arm_linux_sigtramp_cache (struct frame_info *this_frame,
262 1.1 christos struct trad_frame_cache *this_cache,
263 1.1 christos CORE_ADDR func, int regs_offset)
264 1.1 christos {
265 1.1 christos CORE_ADDR sp = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
266 1.1 christos CORE_ADDR base = sp + regs_offset;
267 1.1 christos int i;
268 1.1 christos
269 1.1 christos for (i = 0; i < 16; i++)
270 1.1 christos trad_frame_set_reg_addr (this_cache, i, base + i * 4);
271 1.1 christos
272 1.1 christos trad_frame_set_reg_addr (this_cache, ARM_PS_REGNUM, base + 16 * 4);
273 1.1 christos
274 1.1 christos /* The VFP or iWMMXt registers may be saved on the stack, but there's
275 1.1 christos no reliable way to restore them (yet). */
276 1.1 christos
277 1.1 christos /* Save a frame ID. */
278 1.1 christos trad_frame_set_id (this_cache, frame_id_build (sp, func));
279 1.1 christos }
280 1.1 christos
281 1.1 christos /* There are a couple of different possible stack layouts that
282 1.1 christos we need to support.
283 1.1 christos
284 1.1 christos Before version 2.6.18, the kernel used completely independent
285 1.1 christos layouts for non-RT and RT signals. For non-RT signals the stack
286 1.1 christos began directly with a struct sigcontext. For RT signals the stack
287 1.1 christos began with two redundant pointers (to the siginfo and ucontext),
288 1.1 christos and then the siginfo and ucontext.
289 1.1 christos
290 1.1 christos As of version 2.6.18, the non-RT signal frame layout starts with
291 1.1 christos a ucontext and the RT signal frame starts with a siginfo and then
292 1.1 christos a ucontext. Also, the ucontext now has a designated save area
293 1.1 christos for coprocessor registers.
294 1.1 christos
295 1.1 christos For RT signals, it's easy to tell the difference: we look for
296 1.1 christos pinfo, the pointer to the siginfo. If it has the expected
297 1.1 christos value, we have an old layout. If it doesn't, we have the new
298 1.1 christos layout.
299 1.1 christos
300 1.1 christos For non-RT signals, it's a bit harder. We need something in one
301 1.1 christos layout or the other with a recognizable offset and value. We can't
302 1.1 christos use the return trampoline, because ARM usually uses SA_RESTORER,
303 1.1 christos in which case the stack return trampoline is not filled in.
304 1.1 christos We can't use the saved stack pointer, because sigaltstack might
305 1.1 christos be in use. So for now we guess the new layout... */
306 1.1 christos
307 1.1 christos /* There are three words (trap_no, error_code, oldmask) in
308 1.1 christos struct sigcontext before r0. */
309 1.1 christos #define ARM_SIGCONTEXT_R0 0xc
310 1.1 christos
311 1.1 christos /* There are five words (uc_flags, uc_link, and three for uc_stack)
312 1.1 christos in the ucontext_t before the sigcontext. */
313 1.1 christos #define ARM_UCONTEXT_SIGCONTEXT 0x14
314 1.1 christos
315 1.1 christos /* There are three elements in an rt_sigframe before the ucontext:
316 1.1 christos pinfo, puc, and info. The first two are pointers and the third
317 1.1 christos is a struct siginfo, with size 128 bytes. We could follow puc
318 1.1 christos to the ucontext, but it's simpler to skip the whole thing. */
319 1.1 christos #define ARM_OLD_RT_SIGFRAME_SIGINFO 0x8
320 1.1 christos #define ARM_OLD_RT_SIGFRAME_UCONTEXT 0x88
321 1.1 christos
322 1.1 christos #define ARM_NEW_RT_SIGFRAME_UCONTEXT 0x80
323 1.1 christos
324 1.1 christos #define ARM_NEW_SIGFRAME_MAGIC 0x5ac3c35a
325 1.1 christos
326 1.1 christos static void
327 1.1 christos arm_linux_sigreturn_init (const struct tramp_frame *self,
328 1.1 christos struct frame_info *this_frame,
329 1.1 christos struct trad_frame_cache *this_cache,
330 1.1 christos CORE_ADDR func)
331 1.1 christos {
332 1.1 christos struct gdbarch *gdbarch = get_frame_arch (this_frame);
333 1.1 christos enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
334 1.1 christos CORE_ADDR sp = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
335 1.1 christos ULONGEST uc_flags = read_memory_unsigned_integer (sp, 4, byte_order);
336 1.1 christos
337 1.1 christos if (uc_flags == ARM_NEW_SIGFRAME_MAGIC)
338 1.1 christos arm_linux_sigtramp_cache (this_frame, this_cache, func,
339 1.1 christos ARM_UCONTEXT_SIGCONTEXT
340 1.1 christos + ARM_SIGCONTEXT_R0);
341 1.1 christos else
342 1.1 christos arm_linux_sigtramp_cache (this_frame, this_cache, func,
343 1.1 christos ARM_SIGCONTEXT_R0);
344 1.1 christos }
345 1.1 christos
346 1.1 christos static void
347 1.1 christos arm_linux_rt_sigreturn_init (const struct tramp_frame *self,
348 1.1 christos struct frame_info *this_frame,
349 1.1 christos struct trad_frame_cache *this_cache,
350 1.1 christos CORE_ADDR func)
351 1.1 christos {
352 1.1 christos struct gdbarch *gdbarch = get_frame_arch (this_frame);
353 1.1 christos enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
354 1.1 christos CORE_ADDR sp = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
355 1.1 christos ULONGEST pinfo = read_memory_unsigned_integer (sp, 4, byte_order);
356 1.1 christos
357 1.1 christos if (pinfo == sp + ARM_OLD_RT_SIGFRAME_SIGINFO)
358 1.1 christos arm_linux_sigtramp_cache (this_frame, this_cache, func,
359 1.1 christos ARM_OLD_RT_SIGFRAME_UCONTEXT
360 1.1 christos + ARM_UCONTEXT_SIGCONTEXT
361 1.1 christos + ARM_SIGCONTEXT_R0);
362 1.1 christos else
363 1.1 christos arm_linux_sigtramp_cache (this_frame, this_cache, func,
364 1.1 christos ARM_NEW_RT_SIGFRAME_UCONTEXT
365 1.1 christos + ARM_UCONTEXT_SIGCONTEXT
366 1.1 christos + ARM_SIGCONTEXT_R0);
367 1.1 christos }
368 1.1 christos
369 1.1 christos static void
370 1.1 christos arm_linux_restart_syscall_init (const struct tramp_frame *self,
371 1.1 christos struct frame_info *this_frame,
372 1.1 christos struct trad_frame_cache *this_cache,
373 1.1 christos CORE_ADDR func)
374 1.1 christos {
375 1.1 christos struct gdbarch *gdbarch = get_frame_arch (this_frame);
376 1.1 christos CORE_ADDR sp = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
377 1.1 christos CORE_ADDR pc = get_frame_memory_unsigned (this_frame, sp, 4);
378 1.1 christos CORE_ADDR cpsr = get_frame_register_unsigned (this_frame, ARM_PS_REGNUM);
379 1.1 christos ULONGEST t_bit = arm_psr_thumb_bit (gdbarch);
380 1.1 christos int sp_offset;
381 1.1 christos
382 1.1 christos /* There are two variants of this trampoline; with older kernels, the
383 1.1 christos stub is placed on the stack, while newer kernels use the stub from
384 1.1 christos the vector page. They are identical except that the older version
385 1.1 christos increments SP by 12 (to skip stored PC and the stub itself), while
386 1.1 christos the newer version increments SP only by 4 (just the stored PC). */
387 1.1 christos if (self->insn[1].bytes == ARM_LDR_PC_SP_4)
388 1.1 christos sp_offset = 4;
389 1.1 christos else
390 1.1 christos sp_offset = 12;
391 1.1 christos
392 1.1 christos /* Update Thumb bit in CPSR. */
393 1.1 christos if (pc & 1)
394 1.1 christos cpsr |= t_bit;
395 1.1 christos else
396 1.1 christos cpsr &= ~t_bit;
397 1.1 christos
398 1.1 christos /* Remove Thumb bit from PC. */
399 1.1 christos pc = gdbarch_addr_bits_remove (gdbarch, pc);
400 1.1 christos
401 1.1 christos /* Save previous register values. */
402 1.1 christos trad_frame_set_reg_value (this_cache, ARM_SP_REGNUM, sp + sp_offset);
403 1.1 christos trad_frame_set_reg_value (this_cache, ARM_PC_REGNUM, pc);
404 1.1 christos trad_frame_set_reg_value (this_cache, ARM_PS_REGNUM, cpsr);
405 1.1 christos
406 1.1 christos /* Save a frame ID. */
407 1.1 christos trad_frame_set_id (this_cache, frame_id_build (sp, func));
408 1.1 christos }
409 1.1 christos
410 1.1 christos static struct tramp_frame arm_linux_sigreturn_tramp_frame = {
411 1.1 christos SIGTRAMP_FRAME,
412 1.1 christos 4,
413 1.1 christos {
414 1.1 christos { ARM_LINUX_SIGRETURN_INSTR, -1 },
415 1.1 christos { TRAMP_SENTINEL_INSN }
416 1.1 christos },
417 1.1 christos arm_linux_sigreturn_init
418 1.1 christos };
419 1.1 christos
420 1.1 christos static struct tramp_frame arm_linux_rt_sigreturn_tramp_frame = {
421 1.1 christos SIGTRAMP_FRAME,
422 1.1 christos 4,
423 1.1 christos {
424 1.1 christos { ARM_LINUX_RT_SIGRETURN_INSTR, -1 },
425 1.1 christos { TRAMP_SENTINEL_INSN }
426 1.1 christos },
427 1.1 christos arm_linux_rt_sigreturn_init
428 1.1 christos };
429 1.1 christos
430 1.1 christos static struct tramp_frame arm_eabi_linux_sigreturn_tramp_frame = {
431 1.1 christos SIGTRAMP_FRAME,
432 1.1 christos 4,
433 1.1 christos {
434 1.1 christos { ARM_SET_R7_SIGRETURN, -1 },
435 1.1 christos { ARM_EABI_SYSCALL, -1 },
436 1.1 christos { TRAMP_SENTINEL_INSN }
437 1.1 christos },
438 1.1 christos arm_linux_sigreturn_init
439 1.1 christos };
440 1.1 christos
441 1.1 christos static struct tramp_frame arm_eabi_linux_rt_sigreturn_tramp_frame = {
442 1.1 christos SIGTRAMP_FRAME,
443 1.1 christos 4,
444 1.1 christos {
445 1.1 christos { ARM_SET_R7_RT_SIGRETURN, -1 },
446 1.1 christos { ARM_EABI_SYSCALL, -1 },
447 1.1 christos { TRAMP_SENTINEL_INSN }
448 1.1 christos },
449 1.1 christos arm_linux_rt_sigreturn_init
450 1.1 christos };
451 1.1 christos
452 1.1.1.2 christos static struct tramp_frame thumb2_eabi_linux_sigreturn_tramp_frame = {
453 1.1.1.2 christos SIGTRAMP_FRAME,
454 1.1.1.2 christos 2,
455 1.1.1.2 christos {
456 1.1.1.2 christos { THUMB2_SET_R7_SIGRETURN1, -1 },
457 1.1.1.2 christos { THUMB2_SET_R7_SIGRETURN2, -1 },
458 1.1.1.2 christos { THUMB2_EABI_SYSCALL, -1 },
459 1.1.1.2 christos { TRAMP_SENTINEL_INSN }
460 1.1.1.2 christos },
461 1.1.1.2 christos arm_linux_sigreturn_init
462 1.1.1.2 christos };
463 1.1.1.2 christos
464 1.1.1.2 christos static struct tramp_frame thumb2_eabi_linux_rt_sigreturn_tramp_frame = {
465 1.1.1.2 christos SIGTRAMP_FRAME,
466 1.1.1.2 christos 2,
467 1.1.1.2 christos {
468 1.1.1.2 christos { THUMB2_SET_R7_RT_SIGRETURN1, -1 },
469 1.1.1.2 christos { THUMB2_SET_R7_RT_SIGRETURN2, -1 },
470 1.1.1.2 christos { THUMB2_EABI_SYSCALL, -1 },
471 1.1.1.2 christos { TRAMP_SENTINEL_INSN }
472 1.1.1.2 christos },
473 1.1.1.2 christos arm_linux_rt_sigreturn_init
474 1.1.1.2 christos };
475 1.1.1.2 christos
476 1.1 christos static struct tramp_frame arm_linux_restart_syscall_tramp_frame = {
477 1.1 christos NORMAL_FRAME,
478 1.1 christos 4,
479 1.1 christos {
480 1.1 christos { ARM_OABI_SYSCALL_RESTART_SYSCALL, -1 },
481 1.1 christos { ARM_LDR_PC_SP_12, -1 },
482 1.1 christos { TRAMP_SENTINEL_INSN }
483 1.1 christos },
484 1.1 christos arm_linux_restart_syscall_init
485 1.1 christos };
486 1.1 christos
487 1.1 christos static struct tramp_frame arm_kernel_linux_restart_syscall_tramp_frame = {
488 1.1 christos NORMAL_FRAME,
489 1.1 christos 4,
490 1.1 christos {
491 1.1 christos { ARM_OABI_SYSCALL_RESTART_SYSCALL, -1 },
492 1.1 christos { ARM_LDR_PC_SP_4, -1 },
493 1.1 christos { TRAMP_SENTINEL_INSN }
494 1.1 christos },
495 1.1 christos arm_linux_restart_syscall_init
496 1.1 christos };
497 1.1 christos
498 1.1 christos /* Core file and register set support. */
499 1.1 christos
500 1.1 christos #define ARM_LINUX_SIZEOF_GREGSET (18 * INT_REGISTER_SIZE)
501 1.1 christos
502 1.1 christos void
503 1.1 christos arm_linux_supply_gregset (const struct regset *regset,
504 1.1 christos struct regcache *regcache,
505 1.1 christos int regnum, const void *gregs_buf, size_t len)
506 1.1 christos {
507 1.1 christos struct gdbarch *gdbarch = get_regcache_arch (regcache);
508 1.1 christos enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
509 1.1 christos const gdb_byte *gregs = gregs_buf;
510 1.1 christos int regno;
511 1.1 christos CORE_ADDR reg_pc;
512 1.1 christos gdb_byte pc_buf[INT_REGISTER_SIZE];
513 1.1 christos
514 1.1 christos for (regno = ARM_A1_REGNUM; regno < ARM_PC_REGNUM; regno++)
515 1.1 christos if (regnum == -1 || regnum == regno)
516 1.1 christos regcache_raw_supply (regcache, regno,
517 1.1 christos gregs + INT_REGISTER_SIZE * regno);
518 1.1 christos
519 1.1 christos if (regnum == ARM_PS_REGNUM || regnum == -1)
520 1.1 christos {
521 1.1 christos if (arm_apcs_32)
522 1.1 christos regcache_raw_supply (regcache, ARM_PS_REGNUM,
523 1.1 christos gregs + INT_REGISTER_SIZE * ARM_CPSR_GREGNUM);
524 1.1 christos else
525 1.1 christos regcache_raw_supply (regcache, ARM_PS_REGNUM,
526 1.1 christos gregs + INT_REGISTER_SIZE * ARM_PC_REGNUM);
527 1.1 christos }
528 1.1 christos
529 1.1 christos if (regnum == ARM_PC_REGNUM || regnum == -1)
530 1.1 christos {
531 1.1 christos reg_pc = extract_unsigned_integer (gregs
532 1.1 christos + INT_REGISTER_SIZE * ARM_PC_REGNUM,
533 1.1 christos INT_REGISTER_SIZE, byte_order);
534 1.1 christos reg_pc = gdbarch_addr_bits_remove (gdbarch, reg_pc);
535 1.1 christos store_unsigned_integer (pc_buf, INT_REGISTER_SIZE, byte_order, reg_pc);
536 1.1 christos regcache_raw_supply (regcache, ARM_PC_REGNUM, pc_buf);
537 1.1 christos }
538 1.1 christos }
539 1.1 christos
540 1.1 christos void
541 1.1 christos arm_linux_collect_gregset (const struct regset *regset,
542 1.1 christos const struct regcache *regcache,
543 1.1 christos int regnum, void *gregs_buf, size_t len)
544 1.1 christos {
545 1.1 christos gdb_byte *gregs = gregs_buf;
546 1.1 christos int regno;
547 1.1 christos
548 1.1 christos for (regno = ARM_A1_REGNUM; regno < ARM_PC_REGNUM; regno++)
549 1.1 christos if (regnum == -1 || regnum == regno)
550 1.1 christos regcache_raw_collect (regcache, regno,
551 1.1 christos gregs + INT_REGISTER_SIZE * regno);
552 1.1 christos
553 1.1 christos if (regnum == ARM_PS_REGNUM || regnum == -1)
554 1.1 christos {
555 1.1 christos if (arm_apcs_32)
556 1.1 christos regcache_raw_collect (regcache, ARM_PS_REGNUM,
557 1.1 christos gregs + INT_REGISTER_SIZE * ARM_CPSR_GREGNUM);
558 1.1 christos else
559 1.1 christos regcache_raw_collect (regcache, ARM_PS_REGNUM,
560 1.1 christos gregs + INT_REGISTER_SIZE * ARM_PC_REGNUM);
561 1.1 christos }
562 1.1 christos
563 1.1 christos if (regnum == ARM_PC_REGNUM || regnum == -1)
564 1.1 christos regcache_raw_collect (regcache, ARM_PC_REGNUM,
565 1.1 christos gregs + INT_REGISTER_SIZE * ARM_PC_REGNUM);
566 1.1 christos }
567 1.1 christos
568 1.1 christos /* Support for register format used by the NWFPE FPA emulator. */
569 1.1 christos
570 1.1 christos #define typeNone 0x00
571 1.1 christos #define typeSingle 0x01
572 1.1 christos #define typeDouble 0x02
573 1.1 christos #define typeExtended 0x03
574 1.1 christos
575 1.1 christos void
576 1.1 christos supply_nwfpe_register (struct regcache *regcache, int regno,
577 1.1 christos const gdb_byte *regs)
578 1.1 christos {
579 1.1 christos const gdb_byte *reg_data;
580 1.1 christos gdb_byte reg_tag;
581 1.1 christos gdb_byte buf[FP_REGISTER_SIZE];
582 1.1 christos
583 1.1 christos reg_data = regs + (regno - ARM_F0_REGNUM) * FP_REGISTER_SIZE;
584 1.1 christos reg_tag = regs[(regno - ARM_F0_REGNUM) + NWFPE_TAGS_OFFSET];
585 1.1 christos memset (buf, 0, FP_REGISTER_SIZE);
586 1.1 christos
587 1.1 christos switch (reg_tag)
588 1.1 christos {
589 1.1 christos case typeSingle:
590 1.1 christos memcpy (buf, reg_data, 4);
591 1.1 christos break;
592 1.1 christos case typeDouble:
593 1.1 christos memcpy (buf, reg_data + 4, 4);
594 1.1 christos memcpy (buf + 4, reg_data, 4);
595 1.1 christos break;
596 1.1 christos case typeExtended:
597 1.1 christos /* We want sign and exponent, then least significant bits,
598 1.1 christos then most significant. NWFPE does sign, most, least. */
599 1.1 christos memcpy (buf, reg_data, 4);
600 1.1 christos memcpy (buf + 4, reg_data + 8, 4);
601 1.1 christos memcpy (buf + 8, reg_data + 4, 4);
602 1.1 christos break;
603 1.1 christos default:
604 1.1 christos break;
605 1.1 christos }
606 1.1 christos
607 1.1 christos regcache_raw_supply (regcache, regno, buf);
608 1.1 christos }
609 1.1 christos
610 1.1 christos void
611 1.1 christos collect_nwfpe_register (const struct regcache *regcache, int regno,
612 1.1 christos gdb_byte *regs)
613 1.1 christos {
614 1.1 christos gdb_byte *reg_data;
615 1.1 christos gdb_byte reg_tag;
616 1.1 christos gdb_byte buf[FP_REGISTER_SIZE];
617 1.1 christos
618 1.1 christos regcache_raw_collect (regcache, regno, buf);
619 1.1 christos
620 1.1 christos /* NOTE drow/2006-06-07: This code uses the tag already in the
621 1.1 christos register buffer. I've preserved that when moving the code
622 1.1 christos from the native file to the target file. But this doesn't
623 1.1 christos always make sense. */
624 1.1 christos
625 1.1 christos reg_data = regs + (regno - ARM_F0_REGNUM) * FP_REGISTER_SIZE;
626 1.1 christos reg_tag = regs[(regno - ARM_F0_REGNUM) + NWFPE_TAGS_OFFSET];
627 1.1 christos
628 1.1 christos switch (reg_tag)
629 1.1 christos {
630 1.1 christos case typeSingle:
631 1.1 christos memcpy (reg_data, buf, 4);
632 1.1 christos break;
633 1.1 christos case typeDouble:
634 1.1 christos memcpy (reg_data, buf + 4, 4);
635 1.1 christos memcpy (reg_data + 4, buf, 4);
636 1.1 christos break;
637 1.1 christos case typeExtended:
638 1.1 christos memcpy (reg_data, buf, 4);
639 1.1 christos memcpy (reg_data + 4, buf + 8, 4);
640 1.1 christos memcpy (reg_data + 8, buf + 4, 4);
641 1.1 christos break;
642 1.1 christos default:
643 1.1 christos break;
644 1.1 christos }
645 1.1 christos }
646 1.1 christos
647 1.1 christos void
648 1.1 christos arm_linux_supply_nwfpe (const struct regset *regset,
649 1.1 christos struct regcache *regcache,
650 1.1 christos int regnum, const void *regs_buf, size_t len)
651 1.1 christos {
652 1.1 christos const gdb_byte *regs = regs_buf;
653 1.1 christos int regno;
654 1.1 christos
655 1.1 christos if (regnum == ARM_FPS_REGNUM || regnum == -1)
656 1.1 christos regcache_raw_supply (regcache, ARM_FPS_REGNUM,
657 1.1 christos regs + NWFPE_FPSR_OFFSET);
658 1.1 christos
659 1.1 christos for (regno = ARM_F0_REGNUM; regno <= ARM_F7_REGNUM; regno++)
660 1.1 christos if (regnum == -1 || regnum == regno)
661 1.1 christos supply_nwfpe_register (regcache, regno, regs);
662 1.1 christos }
663 1.1 christos
664 1.1 christos void
665 1.1 christos arm_linux_collect_nwfpe (const struct regset *regset,
666 1.1 christos const struct regcache *regcache,
667 1.1 christos int regnum, void *regs_buf, size_t len)
668 1.1 christos {
669 1.1 christos gdb_byte *regs = regs_buf;
670 1.1 christos int regno;
671 1.1 christos
672 1.1 christos for (regno = ARM_F0_REGNUM; regno <= ARM_F7_REGNUM; regno++)
673 1.1 christos if (regnum == -1 || regnum == regno)
674 1.1 christos collect_nwfpe_register (regcache, regno, regs);
675 1.1 christos
676 1.1 christos if (regnum == ARM_FPS_REGNUM || regnum == -1)
677 1.1 christos regcache_raw_collect (regcache, ARM_FPS_REGNUM,
678 1.1 christos regs + INT_REGISTER_SIZE * ARM_FPS_REGNUM);
679 1.1 christos }
680 1.1 christos
681 1.1 christos /* Support VFP register format. */
682 1.1 christos
683 1.1 christos #define ARM_LINUX_SIZEOF_VFP (32 * 8 + 4)
684 1.1 christos
685 1.1 christos static void
686 1.1 christos arm_linux_supply_vfp (const struct regset *regset,
687 1.1 christos struct regcache *regcache,
688 1.1 christos int regnum, const void *regs_buf, size_t len)
689 1.1 christos {
690 1.1 christos const gdb_byte *regs = regs_buf;
691 1.1 christos int regno;
692 1.1 christos
693 1.1 christos if (regnum == ARM_FPSCR_REGNUM || regnum == -1)
694 1.1 christos regcache_raw_supply (regcache, ARM_FPSCR_REGNUM, regs + 32 * 8);
695 1.1 christos
696 1.1 christos for (regno = ARM_D0_REGNUM; regno <= ARM_D31_REGNUM; regno++)
697 1.1 christos if (regnum == -1 || regnum == regno)
698 1.1 christos regcache_raw_supply (regcache, regno,
699 1.1 christos regs + (regno - ARM_D0_REGNUM) * 8);
700 1.1 christos }
701 1.1 christos
702 1.1 christos static void
703 1.1 christos arm_linux_collect_vfp (const struct regset *regset,
704 1.1 christos const struct regcache *regcache,
705 1.1 christos int regnum, void *regs_buf, size_t len)
706 1.1 christos {
707 1.1 christos gdb_byte *regs = regs_buf;
708 1.1 christos int regno;
709 1.1 christos
710 1.1 christos if (regnum == ARM_FPSCR_REGNUM || regnum == -1)
711 1.1 christos regcache_raw_collect (regcache, ARM_FPSCR_REGNUM, regs + 32 * 8);
712 1.1 christos
713 1.1 christos for (regno = ARM_D0_REGNUM; regno <= ARM_D31_REGNUM; regno++)
714 1.1 christos if (regnum == -1 || regnum == regno)
715 1.1 christos regcache_raw_collect (regcache, regno,
716 1.1 christos regs + (regno - ARM_D0_REGNUM) * 8);
717 1.1 christos }
718 1.1 christos
719 1.1.1.2 christos static const struct regset arm_linux_gregset =
720 1.1.1.2 christos {
721 1.1.1.2 christos NULL, arm_linux_supply_gregset, arm_linux_collect_gregset
722 1.1.1.2 christos };
723 1.1 christos
724 1.1.1.2 christos static const struct regset arm_linux_fpregset =
725 1.1.1.2 christos {
726 1.1.1.2 christos NULL, arm_linux_supply_nwfpe, arm_linux_collect_nwfpe
727 1.1.1.2 christos };
728 1.1 christos
729 1.1.1.2 christos static const struct regset arm_linux_vfpregset =
730 1.1.1.2 christos {
731 1.1.1.2 christos NULL, arm_linux_supply_vfp, arm_linux_collect_vfp
732 1.1.1.2 christos };
733 1.1 christos
734 1.1.1.2 christos /* Iterate over core file register note sections. */
735 1.1 christos
736 1.1.1.2 christos static void
737 1.1.1.2 christos arm_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
738 1.1.1.2 christos iterate_over_regset_sections_cb *cb,
739 1.1.1.2 christos void *cb_data,
740 1.1.1.2 christos const struct regcache *regcache)
741 1.1 christos {
742 1.1.1.2 christos struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
743 1.1 christos
744 1.1.1.2 christos cb (".reg", ARM_LINUX_SIZEOF_GREGSET, &arm_linux_gregset, NULL, cb_data);
745 1.1.1.2 christos
746 1.1.1.3 christos if (tdep->vfp_register_count > 0)
747 1.1.1.2 christos cb (".reg-arm-vfp", ARM_LINUX_SIZEOF_VFP, &arm_linux_vfpregset,
748 1.1.1.2 christos "VFP floating-point", cb_data);
749 1.1.1.2 christos else if (tdep->have_fpa_registers)
750 1.1.1.2 christos cb (".reg2", ARM_LINUX_SIZEOF_NWFPE, &arm_linux_fpregset,
751 1.1.1.2 christos "FPA floating-point", cb_data);
752 1.1.1.2 christos }
753 1.1 christos
754 1.1 christos /* Determine target description from core file. */
755 1.1 christos
756 1.1 christos static const struct target_desc *
757 1.1 christos arm_linux_core_read_description (struct gdbarch *gdbarch,
758 1.1 christos struct target_ops *target,
759 1.1 christos bfd *abfd)
760 1.1 christos {
761 1.1 christos CORE_ADDR arm_hwcap = 0;
762 1.1 christos
763 1.1 christos if (target_auxv_search (target, AT_HWCAP, &arm_hwcap) != 1)
764 1.1 christos return NULL;
765 1.1 christos
766 1.1 christos if (arm_hwcap & HWCAP_VFP)
767 1.1 christos {
768 1.1 christos /* NEON implies VFPv3-D32 or no-VFP unit. Say that we only support
769 1.1 christos Neon with VFPv3-D32. */
770 1.1 christos if (arm_hwcap & HWCAP_NEON)
771 1.1 christos return tdesc_arm_with_neon;
772 1.1 christos else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPv3D16)) == HWCAP_VFPv3)
773 1.1 christos return tdesc_arm_with_vfpv3;
774 1.1 christos else
775 1.1 christos return tdesc_arm_with_vfpv2;
776 1.1 christos }
777 1.1 christos
778 1.1 christos return NULL;
779 1.1 christos }
780 1.1 christos
781 1.1 christos
782 1.1 christos /* Copy the value of next pc of sigreturn and rt_sigrturn into PC,
783 1.1 christos return 1. In addition, set IS_THUMB depending on whether we
784 1.1 christos will return to ARM or Thumb code. Return 0 if it is not a
785 1.1 christos rt_sigreturn/sigreturn syscall. */
786 1.1 christos static int
787 1.1 christos arm_linux_sigreturn_return_addr (struct frame_info *frame,
788 1.1 christos unsigned long svc_number,
789 1.1 christos CORE_ADDR *pc, int *is_thumb)
790 1.1 christos {
791 1.1 christos /* Is this a sigreturn or rt_sigreturn syscall? */
792 1.1 christos if (svc_number == 119 || svc_number == 173)
793 1.1 christos {
794 1.1 christos if (get_frame_type (frame) == SIGTRAMP_FRAME)
795 1.1 christos {
796 1.1 christos ULONGEST t_bit = arm_psr_thumb_bit (frame_unwind_arch (frame));
797 1.1 christos CORE_ADDR cpsr
798 1.1 christos = frame_unwind_register_unsigned (frame, ARM_PS_REGNUM);
799 1.1 christos
800 1.1 christos *is_thumb = (cpsr & t_bit) != 0;
801 1.1 christos *pc = frame_unwind_caller_pc (frame);
802 1.1 christos return 1;
803 1.1 christos }
804 1.1 christos }
805 1.1 christos return 0;
806 1.1 christos }
807 1.1 christos
808 1.1 christos /* At a ptrace syscall-stop, return the syscall number. This either
809 1.1 christos comes from the SWI instruction (OABI) or from r7 (EABI).
810 1.1 christos
811 1.1 christos When the function fails, it should return -1. */
812 1.1 christos
813 1.1 christos static LONGEST
814 1.1 christos arm_linux_get_syscall_number (struct gdbarch *gdbarch,
815 1.1 christos ptid_t ptid)
816 1.1 christos {
817 1.1 christos struct regcache *regs = get_thread_regcache (ptid);
818 1.1 christos struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
819 1.1 christos
820 1.1 christos ULONGEST pc;
821 1.1 christos ULONGEST cpsr;
822 1.1 christos ULONGEST t_bit = arm_psr_thumb_bit (gdbarch);
823 1.1 christos int is_thumb;
824 1.1 christos ULONGEST svc_number = -1;
825 1.1 christos
826 1.1 christos regcache_cooked_read_unsigned (regs, ARM_PC_REGNUM, &pc);
827 1.1 christos regcache_cooked_read_unsigned (regs, ARM_PS_REGNUM, &cpsr);
828 1.1 christos is_thumb = (cpsr & t_bit) != 0;
829 1.1 christos
830 1.1 christos if (is_thumb)
831 1.1 christos {
832 1.1 christos regcache_cooked_read_unsigned (regs, 7, &svc_number);
833 1.1 christos }
834 1.1 christos else
835 1.1 christos {
836 1.1 christos enum bfd_endian byte_order_for_code =
837 1.1 christos gdbarch_byte_order_for_code (gdbarch);
838 1.1 christos
839 1.1 christos /* PC gets incremented before the syscall-stop, so read the
840 1.1 christos previous instruction. */
841 1.1 christos unsigned long this_instr =
842 1.1 christos read_memory_unsigned_integer (pc - 4, 4, byte_order_for_code);
843 1.1 christos
844 1.1 christos unsigned long svc_operand = (0x00ffffff & this_instr);
845 1.1 christos
846 1.1 christos if (svc_operand)
847 1.1 christos {
848 1.1 christos /* OABI */
849 1.1 christos svc_number = svc_operand - 0x900000;
850 1.1 christos }
851 1.1 christos else
852 1.1 christos {
853 1.1 christos /* EABI */
854 1.1 christos regcache_cooked_read_unsigned (regs, 7, &svc_number);
855 1.1 christos }
856 1.1 christos }
857 1.1 christos
858 1.1 christos return svc_number;
859 1.1 christos }
860 1.1 christos
861 1.1 christos /* When FRAME is at a syscall instruction, return the PC of the next
862 1.1 christos instruction to be executed. */
863 1.1 christos
864 1.1 christos static CORE_ADDR
865 1.1 christos arm_linux_syscall_next_pc (struct frame_info *frame)
866 1.1 christos {
867 1.1 christos CORE_ADDR pc = get_frame_pc (frame);
868 1.1 christos CORE_ADDR return_addr = 0;
869 1.1 christos int is_thumb = arm_frame_is_thumb (frame);
870 1.1 christos ULONGEST svc_number = 0;
871 1.1 christos
872 1.1 christos if (is_thumb)
873 1.1 christos {
874 1.1 christos svc_number = get_frame_register_unsigned (frame, 7);
875 1.1 christos return_addr = pc + 2;
876 1.1 christos }
877 1.1 christos else
878 1.1 christos {
879 1.1 christos struct gdbarch *gdbarch = get_frame_arch (frame);
880 1.1 christos enum bfd_endian byte_order_for_code =
881 1.1 christos gdbarch_byte_order_for_code (gdbarch);
882 1.1 christos unsigned long this_instr =
883 1.1 christos read_memory_unsigned_integer (pc, 4, byte_order_for_code);
884 1.1 christos
885 1.1 christos unsigned long svc_operand = (0x00ffffff & this_instr);
886 1.1 christos if (svc_operand) /* OABI. */
887 1.1 christos {
888 1.1 christos svc_number = svc_operand - 0x900000;
889 1.1 christos }
890 1.1 christos else /* EABI. */
891 1.1 christos {
892 1.1 christos svc_number = get_frame_register_unsigned (frame, 7);
893 1.1 christos }
894 1.1 christos
895 1.1 christos return_addr = pc + 4;
896 1.1 christos }
897 1.1 christos
898 1.1 christos arm_linux_sigreturn_return_addr (frame, svc_number, &return_addr, &is_thumb);
899 1.1 christos
900 1.1 christos /* Addresses for calling Thumb functions have the bit 0 set. */
901 1.1 christos if (is_thumb)
902 1.1 christos return_addr |= 1;
903 1.1 christos
904 1.1 christos return return_addr;
905 1.1 christos }
906 1.1 christos
907 1.1 christos
908 1.1 christos /* Insert a single step breakpoint at the next executed instruction. */
909 1.1 christos
910 1.1 christos static int
911 1.1 christos arm_linux_software_single_step (struct frame_info *frame)
912 1.1 christos {
913 1.1 christos struct gdbarch *gdbarch = get_frame_arch (frame);
914 1.1 christos struct address_space *aspace = get_frame_address_space (frame);
915 1.1 christos CORE_ADDR next_pc;
916 1.1 christos
917 1.1 christos if (arm_deal_with_atomic_sequence (frame))
918 1.1 christos return 1;
919 1.1 christos
920 1.1 christos next_pc = arm_get_next_pc (frame, get_frame_pc (frame));
921 1.1 christos
922 1.1 christos /* The Linux kernel offers some user-mode helpers in a high page. We can
923 1.1 christos not read this page (as of 2.6.23), and even if we could then we couldn't
924 1.1 christos set breakpoints in it, and even if we could then the atomic operations
925 1.1 christos would fail when interrupted. They are all called as functions and return
926 1.1 christos to the address in LR, so step to there instead. */
927 1.1 christos if (next_pc > 0xffff0000)
928 1.1 christos next_pc = get_frame_register_unsigned (frame, ARM_LR_REGNUM);
929 1.1 christos
930 1.1 christos arm_insert_single_step_breakpoint (gdbarch, aspace, next_pc);
931 1.1 christos
932 1.1 christos return 1;
933 1.1 christos }
934 1.1 christos
935 1.1 christos /* Support for displaced stepping of Linux SVC instructions. */
936 1.1 christos
937 1.1 christos static void
938 1.1 christos arm_linux_cleanup_svc (struct gdbarch *gdbarch,
939 1.1 christos struct regcache *regs,
940 1.1 christos struct displaced_step_closure *dsc)
941 1.1 christos {
942 1.1 christos ULONGEST apparent_pc;
943 1.1 christos int within_scratch;
944 1.1 christos
945 1.1 christos regcache_cooked_read_unsigned (regs, ARM_PC_REGNUM, &apparent_pc);
946 1.1 christos
947 1.1 christos within_scratch = (apparent_pc >= dsc->scratch_base
948 1.1 christos && apparent_pc < (dsc->scratch_base
949 1.1 christos + DISPLACED_MODIFIED_INSNS * 4 + 4));
950 1.1 christos
951 1.1 christos if (debug_displaced)
952 1.1 christos {
953 1.1 christos fprintf_unfiltered (gdb_stdlog, "displaced: PC is apparently %.8lx after "
954 1.1 christos "SVC step ", (unsigned long) apparent_pc);
955 1.1 christos if (within_scratch)
956 1.1 christos fprintf_unfiltered (gdb_stdlog, "(within scratch space)\n");
957 1.1 christos else
958 1.1 christos fprintf_unfiltered (gdb_stdlog, "(outside scratch space)\n");
959 1.1 christos }
960 1.1 christos
961 1.1 christos if (within_scratch)
962 1.1.1.3 christos displaced_write_reg (regs, dsc, ARM_PC_REGNUM,
963 1.1.1.3 christos dsc->insn_addr + dsc->insn_size, BRANCH_WRITE_PC);
964 1.1 christos }
965 1.1 christos
966 1.1 christos static int
967 1.1 christos arm_linux_copy_svc (struct gdbarch *gdbarch, struct regcache *regs,
968 1.1 christos struct displaced_step_closure *dsc)
969 1.1 christos {
970 1.1 christos CORE_ADDR return_to = 0;
971 1.1 christos
972 1.1 christos struct frame_info *frame;
973 1.1 christos unsigned int svc_number = displaced_read_reg (regs, dsc, 7);
974 1.1 christos int is_sigreturn = 0;
975 1.1 christos int is_thumb;
976 1.1 christos
977 1.1 christos frame = get_current_frame ();
978 1.1 christos
979 1.1 christos is_sigreturn = arm_linux_sigreturn_return_addr(frame, svc_number,
980 1.1 christos &return_to, &is_thumb);
981 1.1 christos if (is_sigreturn)
982 1.1 christos {
983 1.1.1.3 christos struct symtab_and_line sal;
984 1.1 christos
985 1.1.1.3 christos if (debug_displaced)
986 1.1.1.3 christos fprintf_unfiltered (gdb_stdlog, "displaced: found "
987 1.1.1.3 christos "sigreturn/rt_sigreturn SVC call. PC in "
988 1.1.1.3 christos "frame = %lx\n",
989 1.1.1.3 christos (unsigned long) get_frame_pc (frame));
990 1.1.1.3 christos
991 1.1.1.3 christos if (debug_displaced)
992 1.1.1.3 christos fprintf_unfiltered (gdb_stdlog, "displaced: unwind pc = %lx. "
993 1.1.1.3 christos "Setting momentary breakpoint.\n",
994 1.1.1.3 christos (unsigned long) return_to);
995 1.1.1.3 christos
996 1.1.1.3 christos gdb_assert (inferior_thread ()->control.step_resume_breakpoint
997 1.1.1.3 christos == NULL);
998 1.1.1.3 christos
999 1.1.1.3 christos sal = find_pc_line (return_to, 0);
1000 1.1.1.3 christos sal.pc = return_to;
1001 1.1.1.3 christos sal.section = find_pc_overlay (return_to);
1002 1.1.1.3 christos sal.explicit_pc = 1;
1003 1.1.1.3 christos
1004 1.1.1.3 christos frame = get_prev_frame (frame);
1005 1.1.1.3 christos
1006 1.1.1.3 christos if (frame)
1007 1.1.1.3 christos {
1008 1.1.1.3 christos inferior_thread ()->control.step_resume_breakpoint
1009 1.1.1.3 christos = set_momentary_breakpoint (gdbarch, sal, get_frame_id (frame),
1010 1.1.1.3 christos bp_step_resume);
1011 1.1.1.3 christos
1012 1.1.1.3 christos /* set_momentary_breakpoint invalidates FRAME. */
1013 1.1.1.3 christos frame = NULL;
1014 1.1.1.3 christos
1015 1.1.1.3 christos /* We need to make sure we actually insert the momentary
1016 1.1.1.3 christos breakpoint set above. */
1017 1.1.1.3 christos insert_breakpoints ();
1018 1.1 christos }
1019 1.1 christos else if (debug_displaced)
1020 1.1.1.3 christos fprintf_unfiltered (gdb_stderr, "displaced: couldn't find previous "
1021 1.1.1.3 christos "frame to set momentary breakpoint for "
1022 1.1.1.3 christos "sigreturn/rt_sigreturn\n");
1023 1.1.1.3 christos }
1024 1.1.1.3 christos else if (debug_displaced)
1025 1.1.1.3 christos fprintf_unfiltered (gdb_stdlog, "displaced: found SVC call\n");
1026 1.1 christos
1027 1.1 christos /* Preparation: If we detect sigreturn, set momentary breakpoint at resume
1028 1.1 christos location, else nothing.
1029 1.1 christos Insn: unmodified svc.
1030 1.1.1.3 christos Cleanup: if pc lands in scratch space, pc <- insn_addr + insn_size
1031 1.1 christos else leave pc alone. */
1032 1.1 christos
1033 1.1 christos
1034 1.1 christos dsc->cleanup = &arm_linux_cleanup_svc;
1035 1.1 christos /* Pretend we wrote to the PC, so cleanup doesn't set PC to the next
1036 1.1 christos instruction. */
1037 1.1 christos dsc->wrote_to_pc = 1;
1038 1.1 christos
1039 1.1 christos return 0;
1040 1.1 christos }
1041 1.1 christos
1042 1.1 christos
1043 1.1 christos /* The following two functions implement single-stepping over calls to Linux
1044 1.1 christos kernel helper routines, which perform e.g. atomic operations on architecture
1045 1.1 christos variants which don't support them natively.
1046 1.1 christos
1047 1.1 christos When this function is called, the PC will be pointing at the kernel helper
1048 1.1 christos (at an address inaccessible to GDB), and r14 will point to the return
1049 1.1 christos address. Displaced stepping always executes code in the copy area:
1050 1.1 christos so, make the copy-area instruction branch back to the kernel helper (the
1051 1.1 christos "from" address), and make r14 point to the breakpoint in the copy area. In
1052 1.1 christos that way, we regain control once the kernel helper returns, and can clean
1053 1.1 christos up appropriately (as if we had just returned from the kernel helper as it
1054 1.1 christos would have been called from the non-displaced location). */
1055 1.1 christos
1056 1.1 christos static void
1057 1.1 christos cleanup_kernel_helper_return (struct gdbarch *gdbarch,
1058 1.1 christos struct regcache *regs,
1059 1.1 christos struct displaced_step_closure *dsc)
1060 1.1 christos {
1061 1.1 christos displaced_write_reg (regs, dsc, ARM_LR_REGNUM, dsc->tmp[0], CANNOT_WRITE_PC);
1062 1.1 christos displaced_write_reg (regs, dsc, ARM_PC_REGNUM, dsc->tmp[0], BRANCH_WRITE_PC);
1063 1.1 christos }
1064 1.1 christos
1065 1.1 christos static void
1066 1.1 christos arm_catch_kernel_helper_return (struct gdbarch *gdbarch, CORE_ADDR from,
1067 1.1 christos CORE_ADDR to, struct regcache *regs,
1068 1.1 christos struct displaced_step_closure *dsc)
1069 1.1 christos {
1070 1.1 christos enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1071 1.1 christos
1072 1.1 christos dsc->numinsns = 1;
1073 1.1 christos dsc->insn_addr = from;
1074 1.1 christos dsc->cleanup = &cleanup_kernel_helper_return;
1075 1.1 christos /* Say we wrote to the PC, else cleanup will set PC to the next
1076 1.1 christos instruction in the helper, which isn't helpful. */
1077 1.1 christos dsc->wrote_to_pc = 1;
1078 1.1 christos
1079 1.1 christos /* Preparation: tmp[0] <- r14
1080 1.1 christos r14 <- <scratch space>+4
1081 1.1 christos *(<scratch space>+8) <- from
1082 1.1 christos Insn: ldr pc, [r14, #4]
1083 1.1 christos Cleanup: r14 <- tmp[0], pc <- tmp[0]. */
1084 1.1 christos
1085 1.1 christos dsc->tmp[0] = displaced_read_reg (regs, dsc, ARM_LR_REGNUM);
1086 1.1 christos displaced_write_reg (regs, dsc, ARM_LR_REGNUM, (ULONGEST) to + 4,
1087 1.1 christos CANNOT_WRITE_PC);
1088 1.1 christos write_memory_unsigned_integer (to + 8, 4, byte_order, from);
1089 1.1 christos
1090 1.1 christos dsc->modinsn[0] = 0xe59ef004; /* ldr pc, [lr, #4]. */
1091 1.1 christos }
1092 1.1 christos
1093 1.1 christos /* Linux-specific displaced step instruction copying function. Detects when
1094 1.1 christos the program has stepped into a Linux kernel helper routine (which must be
1095 1.1 christos handled as a special case), falling back to arm_displaced_step_copy_insn()
1096 1.1 christos if it hasn't. */
1097 1.1 christos
1098 1.1 christos static struct displaced_step_closure *
1099 1.1 christos arm_linux_displaced_step_copy_insn (struct gdbarch *gdbarch,
1100 1.1 christos CORE_ADDR from, CORE_ADDR to,
1101 1.1 christos struct regcache *regs)
1102 1.1 christos {
1103 1.1 christos struct displaced_step_closure *dsc
1104 1.1 christos = xmalloc (sizeof (struct displaced_step_closure));
1105 1.1 christos
1106 1.1 christos /* Detect when we enter an (inaccessible by GDB) Linux kernel helper, and
1107 1.1 christos stop at the return location. */
1108 1.1 christos if (from > 0xffff0000)
1109 1.1 christos {
1110 1.1 christos if (debug_displaced)
1111 1.1 christos fprintf_unfiltered (gdb_stdlog, "displaced: detected kernel helper "
1112 1.1 christos "at %.8lx\n", (unsigned long) from);
1113 1.1 christos
1114 1.1 christos arm_catch_kernel_helper_return (gdbarch, from, to, regs, dsc);
1115 1.1 christos }
1116 1.1 christos else
1117 1.1 christos {
1118 1.1 christos /* Override the default handling of SVC instructions. */
1119 1.1 christos dsc->u.svc.copy_svc_os = arm_linux_copy_svc;
1120 1.1 christos
1121 1.1 christos arm_process_displaced_insn (gdbarch, from, to, regs, dsc);
1122 1.1 christos }
1123 1.1 christos
1124 1.1 christos arm_displaced_init_closure (gdbarch, from, to, dsc);
1125 1.1 christos
1126 1.1 christos return dsc;
1127 1.1 christos }
1128 1.1 christos
1129 1.1 christos /* Implementation of `gdbarch_stap_is_single_operand', as defined in
1130 1.1 christos gdbarch.h. */
1131 1.1 christos
1132 1.1 christos static int
1133 1.1 christos arm_stap_is_single_operand (struct gdbarch *gdbarch, const char *s)
1134 1.1 christos {
1135 1.1 christos return (*s == '#' || *s == '$' || isdigit (*s) /* Literal number. */
1136 1.1 christos || *s == '[' /* Register indirection or
1137 1.1 christos displacement. */
1138 1.1 christos || isalpha (*s)); /* Register value. */
1139 1.1 christos }
1140 1.1 christos
1141 1.1 christos /* This routine is used to parse a special token in ARM's assembly.
1142 1.1 christos
1143 1.1 christos The special tokens parsed by it are:
1144 1.1 christos
1145 1.1 christos - Register displacement (e.g, [fp, #-8])
1146 1.1 christos
1147 1.1 christos It returns one if the special token has been parsed successfully,
1148 1.1 christos or zero if the current token is not considered special. */
1149 1.1 christos
1150 1.1 christos static int
1151 1.1 christos arm_stap_parse_special_token (struct gdbarch *gdbarch,
1152 1.1 christos struct stap_parse_info *p)
1153 1.1 christos {
1154 1.1 christos if (*p->arg == '[')
1155 1.1 christos {
1156 1.1 christos /* Temporary holder for lookahead. */
1157 1.1 christos const char *tmp = p->arg;
1158 1.1 christos char *endp;
1159 1.1 christos /* Used to save the register name. */
1160 1.1 christos const char *start;
1161 1.1 christos char *regname;
1162 1.1 christos int len, offset;
1163 1.1 christos int got_minus = 0;
1164 1.1 christos long displacement;
1165 1.1 christos struct stoken str;
1166 1.1 christos
1167 1.1 christos ++tmp;
1168 1.1 christos start = tmp;
1169 1.1 christos
1170 1.1 christos /* Register name. */
1171 1.1 christos while (isalnum (*tmp))
1172 1.1 christos ++tmp;
1173 1.1 christos
1174 1.1 christos if (*tmp != ',')
1175 1.1 christos return 0;
1176 1.1 christos
1177 1.1 christos len = tmp - start;
1178 1.1 christos regname = alloca (len + 2);
1179 1.1 christos
1180 1.1 christos offset = 0;
1181 1.1 christos if (isdigit (*start))
1182 1.1 christos {
1183 1.1 christos /* If we are dealing with a register whose name begins with a
1184 1.1 christos digit, it means we should prefix the name with the letter
1185 1.1 christos `r', because GDB expects this name pattern. Otherwise (e.g.,
1186 1.1 christos we are dealing with the register `fp'), we don't need to
1187 1.1 christos add such a prefix. */
1188 1.1 christos regname[0] = 'r';
1189 1.1 christos offset = 1;
1190 1.1 christos }
1191 1.1 christos
1192 1.1 christos strncpy (regname + offset, start, len);
1193 1.1 christos len += offset;
1194 1.1 christos regname[len] = '\0';
1195 1.1 christos
1196 1.1 christos if (user_reg_map_name_to_regnum (gdbarch, regname, len) == -1)
1197 1.1 christos error (_("Invalid register name `%s' on expression `%s'."),
1198 1.1 christos regname, p->saved_arg);
1199 1.1 christos
1200 1.1 christos ++tmp;
1201 1.1 christos tmp = skip_spaces_const (tmp);
1202 1.1 christos if (*tmp == '#' || *tmp == '$')
1203 1.1 christos ++tmp;
1204 1.1 christos
1205 1.1 christos if (*tmp == '-')
1206 1.1 christos {
1207 1.1 christos ++tmp;
1208 1.1 christos got_minus = 1;
1209 1.1 christos }
1210 1.1 christos
1211 1.1 christos displacement = strtol (tmp, &endp, 10);
1212 1.1 christos tmp = endp;
1213 1.1 christos
1214 1.1 christos /* Skipping last `]'. */
1215 1.1 christos if (*tmp++ != ']')
1216 1.1 christos return 0;
1217 1.1 christos
1218 1.1 christos /* The displacement. */
1219 1.1.1.2 christos write_exp_elt_opcode (&p->pstate, OP_LONG);
1220 1.1.1.2 christos write_exp_elt_type (&p->pstate, builtin_type (gdbarch)->builtin_long);
1221 1.1.1.2 christos write_exp_elt_longcst (&p->pstate, displacement);
1222 1.1.1.2 christos write_exp_elt_opcode (&p->pstate, OP_LONG);
1223 1.1 christos if (got_minus)
1224 1.1.1.2 christos write_exp_elt_opcode (&p->pstate, UNOP_NEG);
1225 1.1 christos
1226 1.1 christos /* The register name. */
1227 1.1.1.2 christos write_exp_elt_opcode (&p->pstate, OP_REGISTER);
1228 1.1 christos str.ptr = regname;
1229 1.1 christos str.length = len;
1230 1.1.1.2 christos write_exp_string (&p->pstate, str);
1231 1.1.1.2 christos write_exp_elt_opcode (&p->pstate, OP_REGISTER);
1232 1.1 christos
1233 1.1.1.2 christos write_exp_elt_opcode (&p->pstate, BINOP_ADD);
1234 1.1 christos
1235 1.1 christos /* Casting to the expected type. */
1236 1.1.1.2 christos write_exp_elt_opcode (&p->pstate, UNOP_CAST);
1237 1.1.1.2 christos write_exp_elt_type (&p->pstate, lookup_pointer_type (p->arg_type));
1238 1.1.1.2 christos write_exp_elt_opcode (&p->pstate, UNOP_CAST);
1239 1.1 christos
1240 1.1.1.2 christos write_exp_elt_opcode (&p->pstate, UNOP_IND);
1241 1.1 christos
1242 1.1 christos p->arg = tmp;
1243 1.1 christos }
1244 1.1 christos else
1245 1.1 christos return 0;
1246 1.1 christos
1247 1.1 christos return 1;
1248 1.1 christos }
1249 1.1 christos
1250 1.1.1.2 christos /* ARM process record-replay constructs: syscall, signal etc. */
1251 1.1.1.2 christos
1252 1.1.1.2 christos struct linux_record_tdep arm_linux_record_tdep;
1253 1.1.1.2 christos
1254 1.1.1.2 christos /* arm_canonicalize_syscall maps from the native arm Linux set
1255 1.1.1.2 christos of syscall ids into a canonical set of syscall ids used by
1256 1.1.1.2 christos process record. */
1257 1.1.1.2 christos
1258 1.1.1.2 christos static enum gdb_syscall
1259 1.1.1.2 christos arm_canonicalize_syscall (int syscall)
1260 1.1.1.2 christos {
1261 1.1.1.2 christos enum { sys_process_vm_writev = 377 };
1262 1.1.1.2 christos
1263 1.1.1.2 christos if (syscall <= gdb_sys_sched_getaffinity)
1264 1.1.1.2 christos return syscall;
1265 1.1.1.2 christos else if (syscall >= 243 && syscall <= 247)
1266 1.1.1.2 christos return syscall + 2;
1267 1.1.1.2 christos else if (syscall >= 248 && syscall <= 253)
1268 1.1.1.2 christos return syscall + 4;
1269 1.1.1.2 christos
1270 1.1.1.2 christos return -1;
1271 1.1.1.2 christos }
1272 1.1.1.2 christos
1273 1.1.1.2 christos /* Record all registers but PC register for process-record. */
1274 1.1.1.2 christos
1275 1.1.1.2 christos static int
1276 1.1.1.2 christos arm_all_but_pc_registers_record (struct regcache *regcache)
1277 1.1.1.2 christos {
1278 1.1.1.2 christos int i;
1279 1.1.1.2 christos
1280 1.1.1.2 christos for (i = 0; i < ARM_PC_REGNUM; i++)
1281 1.1.1.2 christos {
1282 1.1.1.2 christos if (record_full_arch_list_add_reg (regcache, ARM_A1_REGNUM + i))
1283 1.1.1.2 christos return -1;
1284 1.1.1.2 christos }
1285 1.1.1.2 christos
1286 1.1.1.2 christos if (record_full_arch_list_add_reg (regcache, ARM_PS_REGNUM))
1287 1.1.1.2 christos return -1;
1288 1.1.1.2 christos
1289 1.1.1.2 christos return 0;
1290 1.1.1.2 christos }
1291 1.1.1.2 christos
1292 1.1.1.2 christos /* Handler for arm system call instruction recording. */
1293 1.1.1.2 christos
1294 1.1.1.2 christos static int
1295 1.1.1.2 christos arm_linux_syscall_record (struct regcache *regcache, unsigned long svc_number)
1296 1.1.1.2 christos {
1297 1.1.1.2 christos int ret = 0;
1298 1.1.1.2 christos enum gdb_syscall syscall_gdb;
1299 1.1.1.2 christos
1300 1.1.1.2 christos syscall_gdb = arm_canonicalize_syscall (svc_number);
1301 1.1.1.2 christos
1302 1.1.1.2 christos if (syscall_gdb < 0)
1303 1.1.1.2 christos {
1304 1.1.1.2 christos printf_unfiltered (_("Process record and replay target doesn't "
1305 1.1.1.2 christos "support syscall number %s\n"),
1306 1.1.1.2 christos plongest (svc_number));
1307 1.1.1.2 christos return -1;
1308 1.1.1.2 christos }
1309 1.1.1.2 christos
1310 1.1.1.2 christos if (syscall_gdb == gdb_sys_sigreturn
1311 1.1.1.2 christos || syscall_gdb == gdb_sys_rt_sigreturn)
1312 1.1.1.2 christos {
1313 1.1.1.2 christos if (arm_all_but_pc_registers_record (regcache))
1314 1.1.1.2 christos return -1;
1315 1.1.1.2 christos return 0;
1316 1.1.1.2 christos }
1317 1.1.1.2 christos
1318 1.1.1.2 christos ret = record_linux_system_call (syscall_gdb, regcache,
1319 1.1.1.2 christos &arm_linux_record_tdep);
1320 1.1.1.2 christos if (ret != 0)
1321 1.1.1.2 christos return ret;
1322 1.1.1.2 christos
1323 1.1.1.2 christos /* Record the return value of the system call. */
1324 1.1.1.2 christos if (record_full_arch_list_add_reg (regcache, ARM_A1_REGNUM))
1325 1.1.1.2 christos return -1;
1326 1.1.1.2 christos /* Record LR. */
1327 1.1.1.2 christos if (record_full_arch_list_add_reg (regcache, ARM_LR_REGNUM))
1328 1.1.1.2 christos return -1;
1329 1.1.1.2 christos /* Record CPSR. */
1330 1.1.1.2 christos if (record_full_arch_list_add_reg (regcache, ARM_PS_REGNUM))
1331 1.1.1.2 christos return -1;
1332 1.1.1.2 christos
1333 1.1.1.2 christos return 0;
1334 1.1.1.2 christos }
1335 1.1.1.2 christos
1336 1.1.1.2 christos /* Implement the skip_trampoline_code gdbarch method. */
1337 1.1.1.2 christos
1338 1.1.1.2 christos static CORE_ADDR
1339 1.1.1.2 christos arm_linux_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
1340 1.1.1.2 christos {
1341 1.1.1.2 christos CORE_ADDR target_pc = arm_skip_stub (frame, pc);
1342 1.1.1.2 christos
1343 1.1.1.2 christos if (target_pc != 0)
1344 1.1.1.2 christos return target_pc;
1345 1.1.1.2 christos
1346 1.1.1.2 christos return find_solib_trampoline_target (frame, pc);
1347 1.1.1.2 christos }
1348 1.1.1.2 christos
1349 1.1 christos static void
1350 1.1 christos arm_linux_init_abi (struct gdbarch_info info,
1351 1.1 christos struct gdbarch *gdbarch)
1352 1.1 christos {
1353 1.1 christos static const char *const stap_integer_prefixes[] = { "#", "$", "", NULL };
1354 1.1 christos static const char *const stap_register_prefixes[] = { "r", NULL };
1355 1.1 christos static const char *const stap_register_indirection_prefixes[] = { "[",
1356 1.1 christos NULL };
1357 1.1 christos static const char *const stap_register_indirection_suffixes[] = { "]",
1358 1.1 christos NULL };
1359 1.1 christos struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1360 1.1 christos
1361 1.1 christos linux_init_abi (info, gdbarch);
1362 1.1 christos
1363 1.1 christos tdep->lowest_pc = 0x8000;
1364 1.1.1.2 christos if (info.byte_order_for_code == BFD_ENDIAN_BIG)
1365 1.1 christos {
1366 1.1 christos if (tdep->arm_abi == ARM_ABI_AAPCS)
1367 1.1 christos tdep->arm_breakpoint = eabi_linux_arm_be_breakpoint;
1368 1.1 christos else
1369 1.1 christos tdep->arm_breakpoint = arm_linux_arm_be_breakpoint;
1370 1.1 christos tdep->thumb_breakpoint = arm_linux_thumb_be_breakpoint;
1371 1.1 christos tdep->thumb2_breakpoint = arm_linux_thumb2_be_breakpoint;
1372 1.1 christos }
1373 1.1 christos else
1374 1.1 christos {
1375 1.1 christos if (tdep->arm_abi == ARM_ABI_AAPCS)
1376 1.1 christos tdep->arm_breakpoint = eabi_linux_arm_le_breakpoint;
1377 1.1 christos else
1378 1.1 christos tdep->arm_breakpoint = arm_linux_arm_le_breakpoint;
1379 1.1 christos tdep->thumb_breakpoint = arm_linux_thumb_le_breakpoint;
1380 1.1 christos tdep->thumb2_breakpoint = arm_linux_thumb2_le_breakpoint;
1381 1.1 christos }
1382 1.1 christos tdep->arm_breakpoint_size = sizeof (arm_linux_arm_le_breakpoint);
1383 1.1 christos tdep->thumb_breakpoint_size = sizeof (arm_linux_thumb_le_breakpoint);
1384 1.1 christos tdep->thumb2_breakpoint_size = sizeof (arm_linux_thumb2_le_breakpoint);
1385 1.1 christos
1386 1.1 christos if (tdep->fp_model == ARM_FLOAT_AUTO)
1387 1.1 christos tdep->fp_model = ARM_FLOAT_FPA;
1388 1.1 christos
1389 1.1 christos switch (tdep->fp_model)
1390 1.1 christos {
1391 1.1 christos case ARM_FLOAT_FPA:
1392 1.1 christos tdep->jb_pc = ARM_LINUX_JB_PC_FPA;
1393 1.1 christos break;
1394 1.1 christos case ARM_FLOAT_SOFT_FPA:
1395 1.1 christos case ARM_FLOAT_SOFT_VFP:
1396 1.1 christos case ARM_FLOAT_VFP:
1397 1.1 christos tdep->jb_pc = ARM_LINUX_JB_PC_EABI;
1398 1.1 christos break;
1399 1.1 christos default:
1400 1.1 christos internal_error
1401 1.1 christos (__FILE__, __LINE__,
1402 1.1 christos _("arm_linux_init_abi: Floating point model not supported"));
1403 1.1 christos break;
1404 1.1 christos }
1405 1.1 christos tdep->jb_elt_size = ARM_LINUX_JB_ELEMENT_SIZE;
1406 1.1 christos
1407 1.1 christos set_solib_svr4_fetch_link_map_offsets
1408 1.1 christos (gdbarch, svr4_ilp32_fetch_link_map_offsets);
1409 1.1 christos
1410 1.1 christos /* Single stepping. */
1411 1.1 christos set_gdbarch_software_single_step (gdbarch, arm_linux_software_single_step);
1412 1.1 christos
1413 1.1 christos /* Shared library handling. */
1414 1.1.1.2 christos set_gdbarch_skip_trampoline_code (gdbarch, arm_linux_skip_trampoline_code);
1415 1.1 christos set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver);
1416 1.1 christos
1417 1.1 christos /* Enable TLS support. */
1418 1.1 christos set_gdbarch_fetch_tls_load_module_address (gdbarch,
1419 1.1 christos svr4_fetch_objfile_link_map);
1420 1.1 christos
1421 1.1 christos tramp_frame_prepend_unwinder (gdbarch,
1422 1.1 christos &arm_linux_sigreturn_tramp_frame);
1423 1.1 christos tramp_frame_prepend_unwinder (gdbarch,
1424 1.1 christos &arm_linux_rt_sigreturn_tramp_frame);
1425 1.1 christos tramp_frame_prepend_unwinder (gdbarch,
1426 1.1 christos &arm_eabi_linux_sigreturn_tramp_frame);
1427 1.1 christos tramp_frame_prepend_unwinder (gdbarch,
1428 1.1 christos &arm_eabi_linux_rt_sigreturn_tramp_frame);
1429 1.1 christos tramp_frame_prepend_unwinder (gdbarch,
1430 1.1.1.2 christos &thumb2_eabi_linux_sigreturn_tramp_frame);
1431 1.1.1.2 christos tramp_frame_prepend_unwinder (gdbarch,
1432 1.1.1.2 christos &thumb2_eabi_linux_rt_sigreturn_tramp_frame);
1433 1.1.1.2 christos tramp_frame_prepend_unwinder (gdbarch,
1434 1.1 christos &arm_linux_restart_syscall_tramp_frame);
1435 1.1 christos tramp_frame_prepend_unwinder (gdbarch,
1436 1.1 christos &arm_kernel_linux_restart_syscall_tramp_frame);
1437 1.1 christos
1438 1.1 christos /* Core file support. */
1439 1.1.1.2 christos set_gdbarch_iterate_over_regset_sections
1440 1.1.1.2 christos (gdbarch, arm_linux_iterate_over_regset_sections);
1441 1.1 christos set_gdbarch_core_read_description (gdbarch, arm_linux_core_read_description);
1442 1.1 christos
1443 1.1 christos /* Displaced stepping. */
1444 1.1 christos set_gdbarch_displaced_step_copy_insn (gdbarch,
1445 1.1 christos arm_linux_displaced_step_copy_insn);
1446 1.1 christos set_gdbarch_displaced_step_fixup (gdbarch, arm_displaced_step_fixup);
1447 1.1 christos set_gdbarch_displaced_step_free_closure (gdbarch,
1448 1.1 christos simple_displaced_step_free_closure);
1449 1.1.1.3 christos set_gdbarch_displaced_step_location (gdbarch, linux_displaced_step_location);
1450 1.1 christos
1451 1.1 christos /* Reversible debugging, process record. */
1452 1.1 christos set_gdbarch_process_record (gdbarch, arm_process_record);
1453 1.1 christos
1454 1.1 christos /* SystemTap functions. */
1455 1.1 christos set_gdbarch_stap_integer_prefixes (gdbarch, stap_integer_prefixes);
1456 1.1 christos set_gdbarch_stap_register_prefixes (gdbarch, stap_register_prefixes);
1457 1.1 christos set_gdbarch_stap_register_indirection_prefixes (gdbarch,
1458 1.1 christos stap_register_indirection_prefixes);
1459 1.1 christos set_gdbarch_stap_register_indirection_suffixes (gdbarch,
1460 1.1 christos stap_register_indirection_suffixes);
1461 1.1 christos set_gdbarch_stap_gdb_register_prefix (gdbarch, "r");
1462 1.1 christos set_gdbarch_stap_is_single_operand (gdbarch, arm_stap_is_single_operand);
1463 1.1 christos set_gdbarch_stap_parse_special_token (gdbarch,
1464 1.1 christos arm_stap_parse_special_token);
1465 1.1 christos
1466 1.1 christos tdep->syscall_next_pc = arm_linux_syscall_next_pc;
1467 1.1 christos
1468 1.1 christos /* `catch syscall' */
1469 1.1.1.2 christos set_xml_syscall_file_name (gdbarch, "syscalls/arm-linux.xml");
1470 1.1 christos set_gdbarch_get_syscall_number (gdbarch, arm_linux_get_syscall_number);
1471 1.1 christos
1472 1.1 christos /* Syscall record. */
1473 1.1.1.2 christos tdep->arm_syscall_record = arm_linux_syscall_record;
1474 1.1.1.2 christos
1475 1.1.1.2 christos /* Initialize the arm_linux_record_tdep. */
1476 1.1.1.2 christos /* These values are the size of the type that will be used in a system
1477 1.1.1.2 christos call. They are obtained from Linux Kernel source. */
1478 1.1.1.2 christos arm_linux_record_tdep.size_pointer
1479 1.1.1.2 christos = gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT;
1480 1.1.1.2 christos arm_linux_record_tdep.size__old_kernel_stat = 32;
1481 1.1.1.2 christos arm_linux_record_tdep.size_tms = 16;
1482 1.1.1.2 christos arm_linux_record_tdep.size_loff_t = 8;
1483 1.1.1.2 christos arm_linux_record_tdep.size_flock = 16;
1484 1.1.1.2 christos arm_linux_record_tdep.size_oldold_utsname = 45;
1485 1.1.1.2 christos arm_linux_record_tdep.size_ustat = 20;
1486 1.1.1.2 christos arm_linux_record_tdep.size_old_sigaction = 140;
1487 1.1.1.2 christos arm_linux_record_tdep.size_old_sigset_t = 128;
1488 1.1.1.2 christos arm_linux_record_tdep.size_rlimit = 8;
1489 1.1.1.2 christos arm_linux_record_tdep.size_rusage = 72;
1490 1.1.1.2 christos arm_linux_record_tdep.size_timeval = 8;
1491 1.1.1.2 christos arm_linux_record_tdep.size_timezone = 8;
1492 1.1.1.2 christos arm_linux_record_tdep.size_old_gid_t = 2;
1493 1.1.1.2 christos arm_linux_record_tdep.size_old_uid_t = 2;
1494 1.1.1.2 christos arm_linux_record_tdep.size_fd_set = 128;
1495 1.1.1.2 christos arm_linux_record_tdep.size_dirent = 268;
1496 1.1.1.2 christos arm_linux_record_tdep.size_dirent64 = 276;
1497 1.1.1.2 christos arm_linux_record_tdep.size_statfs = 64;
1498 1.1.1.2 christos arm_linux_record_tdep.size_statfs64 = 84;
1499 1.1.1.2 christos arm_linux_record_tdep.size_sockaddr = 16;
1500 1.1.1.2 christos arm_linux_record_tdep.size_int
1501 1.1.1.2 christos = gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT;
1502 1.1.1.2 christos arm_linux_record_tdep.size_long
1503 1.1.1.2 christos = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT;
1504 1.1.1.2 christos arm_linux_record_tdep.size_ulong
1505 1.1.1.2 christos = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT;
1506 1.1.1.2 christos arm_linux_record_tdep.size_msghdr = 28;
1507 1.1.1.2 christos arm_linux_record_tdep.size_itimerval = 16;
1508 1.1.1.2 christos arm_linux_record_tdep.size_stat = 88;
1509 1.1.1.2 christos arm_linux_record_tdep.size_old_utsname = 325;
1510 1.1.1.2 christos arm_linux_record_tdep.size_sysinfo = 64;
1511 1.1.1.2 christos arm_linux_record_tdep.size_msqid_ds = 88;
1512 1.1.1.2 christos arm_linux_record_tdep.size_shmid_ds = 84;
1513 1.1.1.2 christos arm_linux_record_tdep.size_new_utsname = 390;
1514 1.1.1.2 christos arm_linux_record_tdep.size_timex = 128;
1515 1.1.1.2 christos arm_linux_record_tdep.size_mem_dqinfo = 24;
1516 1.1.1.2 christos arm_linux_record_tdep.size_if_dqblk = 68;
1517 1.1.1.2 christos arm_linux_record_tdep.size_fs_quota_stat = 68;
1518 1.1.1.2 christos arm_linux_record_tdep.size_timespec = 8;
1519 1.1.1.2 christos arm_linux_record_tdep.size_pollfd = 8;
1520 1.1.1.2 christos arm_linux_record_tdep.size_NFS_FHSIZE = 32;
1521 1.1.1.2 christos arm_linux_record_tdep.size_knfsd_fh = 132;
1522 1.1.1.2 christos arm_linux_record_tdep.size_TASK_COMM_LEN = 16;
1523 1.1.1.2 christos arm_linux_record_tdep.size_sigaction = 140;
1524 1.1.1.2 christos arm_linux_record_tdep.size_sigset_t = 8;
1525 1.1.1.2 christos arm_linux_record_tdep.size_siginfo_t = 128;
1526 1.1.1.2 christos arm_linux_record_tdep.size_cap_user_data_t = 12;
1527 1.1.1.2 christos arm_linux_record_tdep.size_stack_t = 12;
1528 1.1.1.2 christos arm_linux_record_tdep.size_off_t = arm_linux_record_tdep.size_long;
1529 1.1.1.2 christos arm_linux_record_tdep.size_stat64 = 96;
1530 1.1.1.2 christos arm_linux_record_tdep.size_gid_t = 2;
1531 1.1.1.2 christos arm_linux_record_tdep.size_uid_t = 2;
1532 1.1.1.2 christos arm_linux_record_tdep.size_PAGE_SIZE = 4096;
1533 1.1.1.2 christos arm_linux_record_tdep.size_flock64 = 24;
1534 1.1.1.2 christos arm_linux_record_tdep.size_user_desc = 16;
1535 1.1.1.2 christos arm_linux_record_tdep.size_io_event = 32;
1536 1.1.1.2 christos arm_linux_record_tdep.size_iocb = 64;
1537 1.1.1.2 christos arm_linux_record_tdep.size_epoll_event = 12;
1538 1.1.1.2 christos arm_linux_record_tdep.size_itimerspec
1539 1.1.1.2 christos = arm_linux_record_tdep.size_timespec * 2;
1540 1.1.1.2 christos arm_linux_record_tdep.size_mq_attr = 32;
1541 1.1.1.2 christos arm_linux_record_tdep.size_siginfo = 128;
1542 1.1.1.2 christos arm_linux_record_tdep.size_termios = 36;
1543 1.1.1.2 christos arm_linux_record_tdep.size_termios2 = 44;
1544 1.1.1.2 christos arm_linux_record_tdep.size_pid_t = 4;
1545 1.1.1.2 christos arm_linux_record_tdep.size_winsize = 8;
1546 1.1.1.2 christos arm_linux_record_tdep.size_serial_struct = 60;
1547 1.1.1.2 christos arm_linux_record_tdep.size_serial_icounter_struct = 80;
1548 1.1.1.2 christos arm_linux_record_tdep.size_hayes_esp_config = 12;
1549 1.1.1.2 christos arm_linux_record_tdep.size_size_t = 4;
1550 1.1.1.2 christos arm_linux_record_tdep.size_iovec = 8;
1551 1.1.1.2 christos
1552 1.1.1.2 christos /* These values are the second argument of system call "sys_ioctl".
1553 1.1.1.2 christos They are obtained from Linux Kernel source. */
1554 1.1.1.2 christos arm_linux_record_tdep.ioctl_TCGETS = 0x5401;
1555 1.1.1.2 christos arm_linux_record_tdep.ioctl_TCSETS = 0x5402;
1556 1.1.1.2 christos arm_linux_record_tdep.ioctl_TCSETSW = 0x5403;
1557 1.1.1.2 christos arm_linux_record_tdep.ioctl_TCSETSF = 0x5404;
1558 1.1.1.2 christos arm_linux_record_tdep.ioctl_TCGETA = 0x5405;
1559 1.1.1.2 christos arm_linux_record_tdep.ioctl_TCSETA = 0x5406;
1560 1.1.1.2 christos arm_linux_record_tdep.ioctl_TCSETAW = 0x5407;
1561 1.1.1.2 christos arm_linux_record_tdep.ioctl_TCSETAF = 0x5408;
1562 1.1.1.2 christos arm_linux_record_tdep.ioctl_TCSBRK = 0x5409;
1563 1.1.1.2 christos arm_linux_record_tdep.ioctl_TCXONC = 0x540a;
1564 1.1.1.2 christos arm_linux_record_tdep.ioctl_TCFLSH = 0x540b;
1565 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCEXCL = 0x540c;
1566 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCNXCL = 0x540d;
1567 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCSCTTY = 0x540e;
1568 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCGPGRP = 0x540f;
1569 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCSPGRP = 0x5410;
1570 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCOUTQ = 0x5411;
1571 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCSTI = 0x5412;
1572 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCGWINSZ = 0x5413;
1573 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCSWINSZ = 0x5414;
1574 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCMGET = 0x5415;
1575 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCMBIS = 0x5416;
1576 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCMBIC = 0x5417;
1577 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCMSET = 0x5418;
1578 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCGSOFTCAR = 0x5419;
1579 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCSSOFTCAR = 0x541a;
1580 1.1.1.2 christos arm_linux_record_tdep.ioctl_FIONREAD = 0x541b;
1581 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCINQ = arm_linux_record_tdep.ioctl_FIONREAD;
1582 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCLINUX = 0x541c;
1583 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCCONS = 0x541d;
1584 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCGSERIAL = 0x541e;
1585 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCSSERIAL = 0x541f;
1586 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCPKT = 0x5420;
1587 1.1.1.2 christos arm_linux_record_tdep.ioctl_FIONBIO = 0x5421;
1588 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCNOTTY = 0x5422;
1589 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCSETD = 0x5423;
1590 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCGETD = 0x5424;
1591 1.1.1.2 christos arm_linux_record_tdep.ioctl_TCSBRKP = 0x5425;
1592 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCTTYGSTRUCT = 0x5426;
1593 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCSBRK = 0x5427;
1594 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCCBRK = 0x5428;
1595 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCGSID = 0x5429;
1596 1.1.1.2 christos arm_linux_record_tdep.ioctl_TCGETS2 = 0x802c542a;
1597 1.1.1.2 christos arm_linux_record_tdep.ioctl_TCSETS2 = 0x402c542b;
1598 1.1.1.2 christos arm_linux_record_tdep.ioctl_TCSETSW2 = 0x402c542c;
1599 1.1.1.2 christos arm_linux_record_tdep.ioctl_TCSETSF2 = 0x402c542d;
1600 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCGPTN = 0x80045430;
1601 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCSPTLCK = 0x40045431;
1602 1.1.1.2 christos arm_linux_record_tdep.ioctl_FIONCLEX = 0x5450;
1603 1.1.1.2 christos arm_linux_record_tdep.ioctl_FIOCLEX = 0x5451;
1604 1.1.1.2 christos arm_linux_record_tdep.ioctl_FIOASYNC = 0x5452;
1605 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCSERCONFIG = 0x5453;
1606 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCSERGWILD = 0x5454;
1607 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCSERSWILD = 0x5455;
1608 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCGLCKTRMIOS = 0x5456;
1609 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCSLCKTRMIOS = 0x5457;
1610 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCSERGSTRUCT = 0x5458;
1611 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCSERGETLSR = 0x5459;
1612 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCSERGETMULTI = 0x545a;
1613 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCSERSETMULTI = 0x545b;
1614 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCMIWAIT = 0x545c;
1615 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCGICOUNT = 0x545d;
1616 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCGHAYESESP = 0x545e;
1617 1.1.1.2 christos arm_linux_record_tdep.ioctl_TIOCSHAYESESP = 0x545f;
1618 1.1.1.2 christos arm_linux_record_tdep.ioctl_FIOQSIZE = 0x5460;
1619 1.1.1.2 christos
1620 1.1.1.2 christos /* These values are the second argument of system call "sys_fcntl"
1621 1.1.1.2 christos and "sys_fcntl64". They are obtained from Linux Kernel source. */
1622 1.1.1.2 christos arm_linux_record_tdep.fcntl_F_GETLK = 5;
1623 1.1.1.2 christos arm_linux_record_tdep.fcntl_F_GETLK64 = 12;
1624 1.1.1.2 christos arm_linux_record_tdep.fcntl_F_SETLK64 = 13;
1625 1.1.1.2 christos arm_linux_record_tdep.fcntl_F_SETLKW64 = 14;
1626 1.1.1.2 christos
1627 1.1.1.2 christos arm_linux_record_tdep.arg1 = ARM_A1_REGNUM + 1;
1628 1.1.1.2 christos arm_linux_record_tdep.arg2 = ARM_A1_REGNUM + 2;
1629 1.1.1.2 christos arm_linux_record_tdep.arg3 = ARM_A1_REGNUM + 3;
1630 1.1.1.2 christos arm_linux_record_tdep.arg4 = ARM_A1_REGNUM + 3;
1631 1.1 christos }
1632 1.1 christos
1633 1.1 christos /* Provide a prototype to silence -Wmissing-prototypes. */
1634 1.1 christos extern initialize_file_ftype _initialize_arm_linux_tdep;
1635 1.1 christos
1636 1.1 christos void
1637 1.1 christos _initialize_arm_linux_tdep (void)
1638 1.1 christos {
1639 1.1 christos gdbarch_register_osabi (bfd_arch_arm, 0, GDB_OSABI_LINUX,
1640 1.1 christos arm_linux_init_abi);
1641 1.1 christos }
1642