LITTLE_ENDIAN -> BFD_ENDIAN_LITTLE
[deliverable/binutils-gdb.git] / gdb / config / arm / tm-linux.h
CommitLineData
ed9a39eb 1/* Target definitions for GNU/Linux on ARM, for GDB.
ef57c069 2 Copyright 1999, 2000 Free Software Foundation, Inc.
ed9a39eb
JM
3
4 This file is part of GDB.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
20
21#ifndef TM_ARMLINUX_H
22#define TM_ARMLINUX_H
23
ae45a35b
KW
24#ifdef GDBSERVER
25#define ARM_GNULINUX_TARGET
26#endif
27
ed9a39eb
JM
28/* Include the common ARM target definitions. */
29#include "arm/tm-arm.h"
30
31#include "tm-linux.h"
32
a42dd537
KB
33/* Use target-specific function to define link map offsets. */
34extern struct link_map_offsets *arm_linux_svr4_fetch_link_map_offsets (void);
35#define SVR4_FETCH_LINK_MAP_OFFSETS() arm_linux_svr4_fetch_link_map_offsets ()
36
134e61c4 37/* Target byte order on ARM Linux is little endian and not selectable. */
ed9a39eb 38#undef TARGET_BYTE_ORDER_SELECTABLE_P
134e61c4 39#define TARGET_BYTE_ORDER_SELECTABLE_P 0
ed9a39eb
JM
40
41/* Under ARM Linux the traditional way of performing a breakpoint is to
42 execute a particular software interrupt, rather than use a particular
43 undefined instruction to provoke a trap. Upon exection of the software
44 interrupt the kernel stops the inferior with a SIGTRAP, and wakes the
45 debugger. Since ARM Linux is little endian, and doesn't support Thumb
46 at the moment we redefined ARM_LE_BREAKPOINT to use the correct software
47 interrupt. */
48#undef ARM_LE_BREAKPOINT
49#define ARM_LE_BREAKPOINT {0x01,0x00,0x9f,0xef}
50
51/* This sequence of words used in the CALL_DUMMY are the following
52 instructions:
53
54 mov lr, pc
55 mov pc, r4
56 swi bkpt_swi
57
58 Note this is 12 bytes. */
59
60#undef CALL_DUMMY
61#define CALL_DUMMY {0xe1a0e00f, 0xe1a0f004, 0xef9f001}
62
63/* Extract from an array REGBUF containing the (raw) register state
64 a function return value of type TYPE, and copy that, in virtual format,
65 into VALBUF. */
66extern void arm_linux_extract_return_value (struct type *, char[], char *);
67#undef EXTRACT_RETURN_VALUE
68#define EXTRACT_RETURN_VALUE(TYPE,REGBUF,VALBUF) \
69 arm_linux_extract_return_value ((TYPE), (REGBUF), (VALBUF))
70
134e61c4
SB
71/* Things needed for making the inferior call functions.
72
73 FIXME: This and arm_push_arguments should be merged. However this
74 function breaks on a little endian host, big endian target
75 using the COFF file format. ELF is ok.
76
77 ScottB. */
78
79#undef PUSH_ARGUMENTS
80#define PUSH_ARGUMENTS(nargs, args, sp, struct_return, struct_addr) \
81 sp = arm_linux_push_arguments ((nargs), (args), (sp), (struct_return), \
82 (struct_addr))
83extern CORE_ADDR arm_linux_push_arguments (int, struct value **, CORE_ADDR,
84 int, CORE_ADDR);
85
ed9a39eb 86/* The first page is not writeable in ARM Linux. */
b8fb9dd9 87#undef LOWEST_PC
ed9a39eb
JM
88#define LOWEST_PC 0x8000
89
90/* Define NO_SINGLE_STEP if ptrace(PT_STEP,...) fails to function correctly
91 on ARM Linux. This is the case on 2.0.x kernels, 2.1.x kernels and some
92 2.2.x kernels. This will include the implementation of single_step()
93 in armlinux-tdep.c. See armlinux-ss.c for more details. */
94/* #define NO_SINGLE_STEP 1 */
95
96/* Offset to saved PC in sigcontext structure, from <asm/sigcontext.h> */
97#define SIGCONTEXT_PC_OFFSET (sizeof(unsigned long) * 18)
98
99/* Figure out where the longjmp will land. The code expects that longjmp
100 has just been entered and the code had not altered the registers, so
101 the arguments are are still in r0-r1. r0 points at the jmp_buf structure
102 from which the target pc (JB_PC) is extracted. This pc value is copied
103 into ADDR. This routine returns true on success */
104extern int arm_get_longjmp_target (CORE_ADDR *);
105#define GET_LONGJMP_TARGET(addr) arm_get_longjmp_target (addr)
106
107/* On ARM Linux, each call to a library routine goes through a small piece
108 of trampoline code in the ".plt" section. The wait_for_inferior()
109 routine uses this macro to detect when we have stepped into one of
110 these fragments. We do not use lookup_solib_trampoline_symbol_by_pc,
111 because we cannot always find the shared library trampoline symbols. */
112extern int in_plt_section (CORE_ADDR, char *);
113#define IN_SOLIB_CALL_TRAMPOLINE(pc, name) in_plt_section((pc), (name))
114
115/* On ARM Linux, a call to a library routine does not have to go through
116 any trampoline code. */
117#define IN_SOLIB_RETURN_TRAMPOLINE(pc, name) 0
118
119/* If PC is in a shared library trampoline code, return the PC
120 where the function itself actually starts. If not, return 0. */
121extern CORE_ADDR find_solib_trampoline_target (CORE_ADDR pc);
122#define SKIP_TRAMPOLINE_CODE(pc) find_solib_trampoline_target (pc)
123
124/* When we call a function in a shared library, and the PLT sends us
125 into the dynamic linker to find the function's real address, we
126 need to skip over the dynamic linker call. This function decides
127 when to skip, and where to skip to. See the comments for
128 SKIP_SOLIB_RESOLVER at the top of infrun.c. */
a52e6aac
SB
129extern CORE_ADDR arm_linux_skip_solib_resolver (CORE_ADDR pc);
130#define SKIP_SOLIB_RESOLVER arm_linux_skip_solib_resolver
ed9a39eb
JM
131
132/* When we call a function in a shared library, and the PLT sends us
133 into the dynamic linker to find the function's real address, we
134 need to skip over the dynamic linker call. This function decides
135 when to skip, and where to skip to. See the comments for
136 SKIP_SOLIB_RESOLVER at the top of infrun.c. */
137#if 0
138#undef IN_SOLIB_DYNSYM_RESOLVE_CODE
139extern CORE_ADDR arm_in_solib_dynsym_resolve_code (CORE_ADDR pc, char *name);
140#define IN_SOLIB_DYNSYM_RESOLVE_CODE arm_in_solib_dynsym_resolve_code
141/* ScottB: Current definition is
142extern CORE_ADDR in_svr4_dynsym_resolve_code (CORE_ADDR pc, char *name);
143#define IN_SOLIB_DYNSYM_RESOLVE_CODE in_svr4_dynsym_resolve_code */
144#endif
145
2a451106
KB
146/* When the ARM Linux kernel invokes a signal handler, the return
147 address points at a special instruction which'll trap back into
148 the kernel. These definitions are used to identify this bit of
149 code as a signal trampoline in order to support backtracing
150 through calls to signal handlers. */
151
152int arm_linux_in_sigtramp (CORE_ADDR pc, char *name);
153#define IN_SIGTRAMP(pc, name) arm_linux_in_sigtramp (pc, name)
154
155/* Each OS has different mechanisms for accessing the various
156 registers stored in the sigcontext structure. These definitions
157 provide a mechanism by which the generic code in arm-tdep.c can
158 find the addresses at which various registers are saved at in the
159 sigcontext structure. If SIGCONTEXT_REGISTER_ADDRESS is not
160 defined, arm-tdep.c will define it to be 0. (See ia64-tdep.c and
161 ia64-linux-tdep.c to see what a similar mechanism looks like when
162 multi-arched.) */
163
164extern CORE_ADDR arm_linux_sigcontext_register_address (CORE_ADDR, CORE_ADDR,
165 int);
166#define SIGCONTEXT_REGISTER_ADDRESS arm_linux_sigcontext_register_address
167
ed9a39eb 168#endif /* TM_ARMLINUX_H */
This page took 0.155358 seconds and 4 git commands to generate.