1*11efff7fSkettenis /* Target-dependent code for GNU/Linux i386.
2b725ae77Skettenis
3*11efff7fSkettenis Copyright 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
4b725ae77Skettenis
5b725ae77Skettenis This file is part of GDB.
6b725ae77Skettenis
7b725ae77Skettenis This program is free software; you can redistribute it and/or modify
8b725ae77Skettenis it under the terms of the GNU General Public License as published by
9b725ae77Skettenis the Free Software Foundation; either version 2 of the License, or
10b725ae77Skettenis (at your option) any later version.
11b725ae77Skettenis
12b725ae77Skettenis This program is distributed in the hope that it will be useful,
13b725ae77Skettenis but WITHOUT ANY WARRANTY; without even the implied warranty of
14b725ae77Skettenis MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15b725ae77Skettenis GNU General Public License for more details.
16b725ae77Skettenis
17b725ae77Skettenis You should have received a copy of the GNU General Public License
18b725ae77Skettenis along with this program; if not, write to the Free Software
19b725ae77Skettenis Foundation, Inc., 59 Temple Place - Suite 330,
20b725ae77Skettenis Boston, MA 02111-1307, USA. */
21b725ae77Skettenis
22b725ae77Skettenis #include "defs.h"
23b725ae77Skettenis #include "gdbcore.h"
24b725ae77Skettenis #include "frame.h"
25b725ae77Skettenis #include "value.h"
26b725ae77Skettenis #include "regcache.h"
27b725ae77Skettenis #include "inferior.h"
28b725ae77Skettenis #include "osabi.h"
29b725ae77Skettenis #include "reggroups.h"
30b725ae77Skettenis
31b725ae77Skettenis #include "gdb_string.h"
32b725ae77Skettenis
33b725ae77Skettenis #include "i386-tdep.h"
34b725ae77Skettenis #include "i386-linux-tdep.h"
35b725ae77Skettenis #include "glibc-tdep.h"
36*11efff7fSkettenis #include "solib-svr4.h"
37b725ae77Skettenis
38b725ae77Skettenis /* Return the name of register REG. */
39b725ae77Skettenis
40b725ae77Skettenis static const char *
i386_linux_register_name(int reg)41b725ae77Skettenis i386_linux_register_name (int reg)
42b725ae77Skettenis {
43b725ae77Skettenis /* Deal with the extra "orig_eax" pseudo register. */
44b725ae77Skettenis if (reg == I386_LINUX_ORIG_EAX_REGNUM)
45b725ae77Skettenis return "orig_eax";
46b725ae77Skettenis
47b725ae77Skettenis return i386_register_name (reg);
48b725ae77Skettenis }
49b725ae77Skettenis
50b725ae77Skettenis /* Return non-zero, when the register is in the corresponding register
51b725ae77Skettenis group. Put the LINUX_ORIG_EAX register in the system group. */
52b725ae77Skettenis static int
i386_linux_register_reggroup_p(struct gdbarch * gdbarch,int regnum,struct reggroup * group)53b725ae77Skettenis i386_linux_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
54b725ae77Skettenis struct reggroup *group)
55b725ae77Skettenis {
56b725ae77Skettenis if (regnum == I386_LINUX_ORIG_EAX_REGNUM)
57b725ae77Skettenis return (group == system_reggroup
58b725ae77Skettenis || group == save_reggroup
59b725ae77Skettenis || group == restore_reggroup);
60b725ae77Skettenis return i386_register_reggroup_p (gdbarch, regnum, group);
61b725ae77Skettenis }
62b725ae77Skettenis
63b725ae77Skettenis
64b725ae77Skettenis /* Recognizing signal handler frames. */
65b725ae77Skettenis
66b725ae77Skettenis /* GNU/Linux has two flavors of signals. Normal signal handlers, and
67b725ae77Skettenis "realtime" (RT) signals. The RT signals can provide additional
68b725ae77Skettenis information to the signal handler if the SA_SIGINFO flag is set
69b725ae77Skettenis when establishing a signal handler using `sigaction'. It is not
70b725ae77Skettenis unlikely that future versions of GNU/Linux will support SA_SIGINFO
71b725ae77Skettenis for normal signals too. */
72b725ae77Skettenis
73b725ae77Skettenis /* When the i386 Linux kernel calls a signal handler and the
74b725ae77Skettenis SA_RESTORER flag isn't set, the return address points to a bit of
75b725ae77Skettenis code on the stack. This function returns whether the PC appears to
76b725ae77Skettenis be within this bit of code.
77b725ae77Skettenis
78b725ae77Skettenis The instruction sequence for normal signals is
79b725ae77Skettenis pop %eax
80b725ae77Skettenis mov $0x77, %eax
81b725ae77Skettenis int $0x80
82b725ae77Skettenis or 0x58 0xb8 0x77 0x00 0x00 0x00 0xcd 0x80.
83b725ae77Skettenis
84b725ae77Skettenis Checking for the code sequence should be somewhat reliable, because
85b725ae77Skettenis the effect is to call the system call sigreturn. This is unlikely
86*11efff7fSkettenis to occur anywhere other than in a signal trampoline.
87b725ae77Skettenis
88b725ae77Skettenis It kind of sucks that we have to read memory from the process in
89b725ae77Skettenis order to identify a signal trampoline, but there doesn't seem to be
90*11efff7fSkettenis any other way. Therefore we only do the memory reads if no
91*11efff7fSkettenis function name could be identified, which should be the case since
92*11efff7fSkettenis the code is on the stack.
93b725ae77Skettenis
94b725ae77Skettenis Detection of signal trampolines for handlers that set the
95b725ae77Skettenis SA_RESTORER flag is in general not possible. Unfortunately this is
96b725ae77Skettenis what the GNU C Library has been doing for quite some time now.
97b725ae77Skettenis However, as of version 2.1.2, the GNU C Library uses signal
98b725ae77Skettenis trampolines (named __restore and __restore_rt) that are identical
99b725ae77Skettenis to the ones used by the kernel. Therefore, these trampolines are
100b725ae77Skettenis supported too. */
101b725ae77Skettenis
102b725ae77Skettenis #define LINUX_SIGTRAMP_INSN0 0x58 /* pop %eax */
103b725ae77Skettenis #define LINUX_SIGTRAMP_OFFSET0 0
104b725ae77Skettenis #define LINUX_SIGTRAMP_INSN1 0xb8 /* mov $NNNN, %eax */
105b725ae77Skettenis #define LINUX_SIGTRAMP_OFFSET1 1
106b725ae77Skettenis #define LINUX_SIGTRAMP_INSN2 0xcd /* int */
107b725ae77Skettenis #define LINUX_SIGTRAMP_OFFSET2 6
108b725ae77Skettenis
109b725ae77Skettenis static const unsigned char linux_sigtramp_code[] =
110b725ae77Skettenis {
111b725ae77Skettenis LINUX_SIGTRAMP_INSN0, /* pop %eax */
112b725ae77Skettenis LINUX_SIGTRAMP_INSN1, 0x77, 0x00, 0x00, 0x00, /* mov $0x77, %eax */
113b725ae77Skettenis LINUX_SIGTRAMP_INSN2, 0x80 /* int $0x80 */
114b725ae77Skettenis };
115b725ae77Skettenis
116b725ae77Skettenis #define LINUX_SIGTRAMP_LEN (sizeof linux_sigtramp_code)
117b725ae77Skettenis
118*11efff7fSkettenis /* If NEXT_FRAME unwinds into a sigtramp routine, return the address
119*11efff7fSkettenis of the start of the routine. Otherwise, return 0. */
120b725ae77Skettenis
121b725ae77Skettenis static CORE_ADDR
i386_linux_sigtramp_start(struct frame_info * next_frame)122*11efff7fSkettenis i386_linux_sigtramp_start (struct frame_info *next_frame)
123b725ae77Skettenis {
124*11efff7fSkettenis CORE_ADDR pc = frame_pc_unwind (next_frame);
125b725ae77Skettenis unsigned char buf[LINUX_SIGTRAMP_LEN];
126b725ae77Skettenis
127b725ae77Skettenis /* We only recognize a signal trampoline if PC is at the start of
128b725ae77Skettenis one of the three instructions. We optimize for finding the PC at
129b725ae77Skettenis the start, as will be the case when the trampoline is not the
130b725ae77Skettenis first frame on the stack. We assume that in the case where the
131b725ae77Skettenis PC is not at the start of the instruction sequence, there will be
132b725ae77Skettenis a few trailing readable bytes on the stack. */
133b725ae77Skettenis
134*11efff7fSkettenis if (!safe_frame_unwind_memory (next_frame, pc, buf, LINUX_SIGTRAMP_LEN))
135b725ae77Skettenis return 0;
136b725ae77Skettenis
137b725ae77Skettenis if (buf[0] != LINUX_SIGTRAMP_INSN0)
138b725ae77Skettenis {
139b725ae77Skettenis int adjust;
140b725ae77Skettenis
141b725ae77Skettenis switch (buf[0])
142b725ae77Skettenis {
143b725ae77Skettenis case LINUX_SIGTRAMP_INSN1:
144b725ae77Skettenis adjust = LINUX_SIGTRAMP_OFFSET1;
145b725ae77Skettenis break;
146b725ae77Skettenis case LINUX_SIGTRAMP_INSN2:
147b725ae77Skettenis adjust = LINUX_SIGTRAMP_OFFSET2;
148b725ae77Skettenis break;
149b725ae77Skettenis default:
150b725ae77Skettenis return 0;
151b725ae77Skettenis }
152b725ae77Skettenis
153b725ae77Skettenis pc -= adjust;
154b725ae77Skettenis
155*11efff7fSkettenis if (!safe_frame_unwind_memory (next_frame, pc, buf, LINUX_SIGTRAMP_LEN))
156b725ae77Skettenis return 0;
157b725ae77Skettenis }
158b725ae77Skettenis
159b725ae77Skettenis if (memcmp (buf, linux_sigtramp_code, LINUX_SIGTRAMP_LEN) != 0)
160b725ae77Skettenis return 0;
161b725ae77Skettenis
162b725ae77Skettenis return pc;
163b725ae77Skettenis }
164b725ae77Skettenis
165b725ae77Skettenis /* This function does the same for RT signals. Here the instruction
166b725ae77Skettenis sequence is
167b725ae77Skettenis mov $0xad, %eax
168b725ae77Skettenis int $0x80
169b725ae77Skettenis or 0xb8 0xad 0x00 0x00 0x00 0xcd 0x80.
170b725ae77Skettenis
171b725ae77Skettenis The effect is to call the system call rt_sigreturn. */
172b725ae77Skettenis
173b725ae77Skettenis #define LINUX_RT_SIGTRAMP_INSN0 0xb8 /* mov $NNNN, %eax */
174b725ae77Skettenis #define LINUX_RT_SIGTRAMP_OFFSET0 0
175b725ae77Skettenis #define LINUX_RT_SIGTRAMP_INSN1 0xcd /* int */
176b725ae77Skettenis #define LINUX_RT_SIGTRAMP_OFFSET1 5
177b725ae77Skettenis
178b725ae77Skettenis static const unsigned char linux_rt_sigtramp_code[] =
179b725ae77Skettenis {
180b725ae77Skettenis LINUX_RT_SIGTRAMP_INSN0, 0xad, 0x00, 0x00, 0x00, /* mov $0xad, %eax */
181b725ae77Skettenis LINUX_RT_SIGTRAMP_INSN1, 0x80 /* int $0x80 */
182b725ae77Skettenis };
183b725ae77Skettenis
184b725ae77Skettenis #define LINUX_RT_SIGTRAMP_LEN (sizeof linux_rt_sigtramp_code)
185b725ae77Skettenis
186*11efff7fSkettenis /* If NEXT_FRAME unwinds into an RT sigtramp routine, return the
187*11efff7fSkettenis address of the start of the routine. Otherwise, return 0. */
188b725ae77Skettenis
189b725ae77Skettenis static CORE_ADDR
i386_linux_rt_sigtramp_start(struct frame_info * next_frame)190*11efff7fSkettenis i386_linux_rt_sigtramp_start (struct frame_info *next_frame)
191b725ae77Skettenis {
192*11efff7fSkettenis CORE_ADDR pc = frame_pc_unwind (next_frame);
193b725ae77Skettenis unsigned char buf[LINUX_RT_SIGTRAMP_LEN];
194b725ae77Skettenis
195b725ae77Skettenis /* We only recognize a signal trampoline if PC is at the start of
196b725ae77Skettenis one of the two instructions. We optimize for finding the PC at
197b725ae77Skettenis the start, as will be the case when the trampoline is not the
198b725ae77Skettenis first frame on the stack. We assume that in the case where the
199b725ae77Skettenis PC is not at the start of the instruction sequence, there will be
200b725ae77Skettenis a few trailing readable bytes on the stack. */
201b725ae77Skettenis
202*11efff7fSkettenis if (!safe_frame_unwind_memory (next_frame, pc, buf, LINUX_RT_SIGTRAMP_LEN))
203b725ae77Skettenis return 0;
204b725ae77Skettenis
205b725ae77Skettenis if (buf[0] != LINUX_RT_SIGTRAMP_INSN0)
206b725ae77Skettenis {
207b725ae77Skettenis if (buf[0] != LINUX_RT_SIGTRAMP_INSN1)
208b725ae77Skettenis return 0;
209b725ae77Skettenis
210b725ae77Skettenis pc -= LINUX_RT_SIGTRAMP_OFFSET1;
211b725ae77Skettenis
212*11efff7fSkettenis if (!safe_frame_unwind_memory (next_frame, pc, buf,
213*11efff7fSkettenis LINUX_RT_SIGTRAMP_LEN))
214b725ae77Skettenis return 0;
215b725ae77Skettenis }
216b725ae77Skettenis
217b725ae77Skettenis if (memcmp (buf, linux_rt_sigtramp_code, LINUX_RT_SIGTRAMP_LEN) != 0)
218b725ae77Skettenis return 0;
219b725ae77Skettenis
220b725ae77Skettenis return pc;
221b725ae77Skettenis }
222b725ae77Skettenis
223*11efff7fSkettenis /* Return whether the frame preceding NEXT_FRAME corresponds to a
224*11efff7fSkettenis GNU/Linux sigtramp routine. */
225b725ae77Skettenis
226b725ae77Skettenis static int
i386_linux_sigtramp_p(struct frame_info * next_frame)227*11efff7fSkettenis i386_linux_sigtramp_p (struct frame_info *next_frame)
228b725ae77Skettenis {
229*11efff7fSkettenis CORE_ADDR pc = frame_pc_unwind (next_frame);
230*11efff7fSkettenis char *name;
231*11efff7fSkettenis
232*11efff7fSkettenis find_pc_partial_function (pc, &name, NULL, NULL);
233*11efff7fSkettenis
234b725ae77Skettenis /* If we have NAME, we can optimize the search. The trampolines are
235b725ae77Skettenis named __restore and __restore_rt. However, they aren't dynamically
236b725ae77Skettenis exported from the shared C library, so the trampoline may appear to
237b725ae77Skettenis be part of the preceding function. This should always be sigaction,
238b725ae77Skettenis __sigaction, or __libc_sigaction (all aliases to the same function). */
239b725ae77Skettenis if (name == NULL || strstr (name, "sigaction") != NULL)
240*11efff7fSkettenis return (i386_linux_sigtramp_start (next_frame) != 0
241*11efff7fSkettenis || i386_linux_rt_sigtramp_start (next_frame) != 0);
242b725ae77Skettenis
243b725ae77Skettenis return (strcmp ("__restore", name) == 0
244b725ae77Skettenis || strcmp ("__restore_rt", name) == 0);
245b725ae77Skettenis }
246b725ae77Skettenis
247b725ae77Skettenis /* Offset to struct sigcontext in ucontext, from <asm/ucontext.h>. */
248b725ae77Skettenis #define I386_LINUX_UCONTEXT_SIGCONTEXT_OFFSET 20
249b725ae77Skettenis
250b725ae77Skettenis /* Assuming NEXT_FRAME is a frame following a GNU/Linux sigtramp
251b725ae77Skettenis routine, return the address of the associated sigcontext structure. */
252b725ae77Skettenis
253b725ae77Skettenis static CORE_ADDR
i386_linux_sigcontext_addr(struct frame_info * next_frame)254b725ae77Skettenis i386_linux_sigcontext_addr (struct frame_info *next_frame)
255b725ae77Skettenis {
256b725ae77Skettenis CORE_ADDR pc;
257b725ae77Skettenis CORE_ADDR sp;
258b725ae77Skettenis char buf[4];
259b725ae77Skettenis
260b725ae77Skettenis frame_unwind_register (next_frame, I386_ESP_REGNUM, buf);
261b725ae77Skettenis sp = extract_unsigned_integer (buf, 4);
262b725ae77Skettenis
263*11efff7fSkettenis pc = i386_linux_sigtramp_start (next_frame);
264b725ae77Skettenis if (pc)
265b725ae77Skettenis {
266b725ae77Skettenis /* The sigcontext structure lives on the stack, right after
267b725ae77Skettenis the signum argument. We determine the address of the
268b725ae77Skettenis sigcontext structure by looking at the frame's stack
269b725ae77Skettenis pointer. Keep in mind that the first instruction of the
270b725ae77Skettenis sigtramp code is "pop %eax". If the PC is after this
271b725ae77Skettenis instruction, adjust the returned value accordingly. */
272b725ae77Skettenis if (pc == frame_pc_unwind (next_frame))
273b725ae77Skettenis return sp + 4;
274b725ae77Skettenis return sp;
275b725ae77Skettenis }
276b725ae77Skettenis
277*11efff7fSkettenis pc = i386_linux_rt_sigtramp_start (next_frame);
278b725ae77Skettenis if (pc)
279b725ae77Skettenis {
280b725ae77Skettenis CORE_ADDR ucontext_addr;
281b725ae77Skettenis
282b725ae77Skettenis /* The sigcontext structure is part of the user context. A
283b725ae77Skettenis pointer to the user context is passed as the third argument
284b725ae77Skettenis to the signal handler. */
285b725ae77Skettenis read_memory (sp + 8, buf, 4);
286b725ae77Skettenis ucontext_addr = extract_unsigned_integer (buf, 4);
287b725ae77Skettenis return ucontext_addr + I386_LINUX_UCONTEXT_SIGCONTEXT_OFFSET;
288b725ae77Skettenis }
289b725ae77Skettenis
290b725ae77Skettenis error ("Couldn't recognize signal trampoline.");
291b725ae77Skettenis return 0;
292b725ae77Skettenis }
293b725ae77Skettenis
294b725ae77Skettenis /* Set the program counter for process PTID to PC. */
295b725ae77Skettenis
296b725ae77Skettenis static void
i386_linux_write_pc(CORE_ADDR pc,ptid_t ptid)297b725ae77Skettenis i386_linux_write_pc (CORE_ADDR pc, ptid_t ptid)
298b725ae77Skettenis {
299b725ae77Skettenis write_register_pid (I386_EIP_REGNUM, pc, ptid);
300b725ae77Skettenis
301b725ae77Skettenis /* We must be careful with modifying the program counter. If we
302b725ae77Skettenis just interrupted a system call, the kernel might try to restart
303b725ae77Skettenis it when we resume the inferior. On restarting the system call,
304b725ae77Skettenis the kernel will try backing up the program counter even though it
305b725ae77Skettenis no longer points at the system call. This typically results in a
306b725ae77Skettenis SIGSEGV or SIGILL. We can prevent this by writing `-1' in the
307b725ae77Skettenis "orig_eax" pseudo-register.
308b725ae77Skettenis
309b725ae77Skettenis Note that "orig_eax" is saved when setting up a dummy call frame.
310b725ae77Skettenis This means that it is properly restored when that frame is
311b725ae77Skettenis popped, and that the interrupted system call will be restarted
312b725ae77Skettenis when we resume the inferior on return from a function call from
313b725ae77Skettenis within GDB. In all other cases the system call will not be
314b725ae77Skettenis restarted. */
315b725ae77Skettenis write_register_pid (I386_LINUX_ORIG_EAX_REGNUM, -1, ptid);
316b725ae77Skettenis }
317b725ae77Skettenis
318b725ae77Skettenis
319b725ae77Skettenis /* The register sets used in GNU/Linux ELF core-dumps are identical to
320b725ae77Skettenis the register sets in `struct user' that are used for a.out
321b725ae77Skettenis core-dumps. These are also used by ptrace(2). The corresponding
322b725ae77Skettenis types are `elf_gregset_t' for the general-purpose registers (with
323b725ae77Skettenis `elf_greg_t' the type of a single GP register) and `elf_fpregset_t'
324b725ae77Skettenis for the floating-point registers.
325b725ae77Skettenis
326b725ae77Skettenis Those types used to be available under the names `gregset_t' and
327b725ae77Skettenis `fpregset_t' too, and GDB used those names in the past. But those
328b725ae77Skettenis names are now used for the register sets used in the `mcontext_t'
329b725ae77Skettenis type, which have a different size and layout. */
330b725ae77Skettenis
331b725ae77Skettenis /* Mapping between the general-purpose registers in `struct user'
332b725ae77Skettenis format and GDB's register cache layout. */
333b725ae77Skettenis
334b725ae77Skettenis /* From <sys/reg.h>. */
335b725ae77Skettenis static int i386_linux_gregset_reg_offset[] =
336b725ae77Skettenis {
337b725ae77Skettenis 6 * 4, /* %eax */
338b725ae77Skettenis 1 * 4, /* %ecx */
339b725ae77Skettenis 2 * 4, /* %edx */
340b725ae77Skettenis 0 * 4, /* %ebx */
341b725ae77Skettenis 15 * 4, /* %esp */
342b725ae77Skettenis 5 * 4, /* %ebp */
343b725ae77Skettenis 3 * 4, /* %esi */
344b725ae77Skettenis 4 * 4, /* %edi */
345b725ae77Skettenis 12 * 4, /* %eip */
346b725ae77Skettenis 14 * 4, /* %eflags */
347b725ae77Skettenis 13 * 4, /* %cs */
348b725ae77Skettenis 16 * 4, /* %ss */
349b725ae77Skettenis 7 * 4, /* %ds */
350b725ae77Skettenis 8 * 4, /* %es */
351b725ae77Skettenis 9 * 4, /* %fs */
352b725ae77Skettenis 10 * 4, /* %gs */
353b725ae77Skettenis -1, -1, -1, -1, -1, -1, -1, -1,
354b725ae77Skettenis -1, -1, -1, -1, -1, -1, -1, -1,
355b725ae77Skettenis -1, -1, -1, -1, -1, -1, -1, -1,
356b725ae77Skettenis -1,
357b725ae77Skettenis 11 * 4 /* "orig_eax" */
358b725ae77Skettenis };
359b725ae77Skettenis
360b725ae77Skettenis /* Mapping between the general-purpose registers in `struct
361b725ae77Skettenis sigcontext' format and GDB's register cache layout. */
362b725ae77Skettenis
363b725ae77Skettenis /* From <asm/sigcontext.h>. */
364b725ae77Skettenis static int i386_linux_sc_reg_offset[] =
365b725ae77Skettenis {
366b725ae77Skettenis 11 * 4, /* %eax */
367b725ae77Skettenis 10 * 4, /* %ecx */
368b725ae77Skettenis 9 * 4, /* %edx */
369b725ae77Skettenis 8 * 4, /* %ebx */
370b725ae77Skettenis 7 * 4, /* %esp */
371b725ae77Skettenis 6 * 4, /* %ebp */
372b725ae77Skettenis 5 * 4, /* %esi */
373b725ae77Skettenis 4 * 4, /* %edi */
374b725ae77Skettenis 14 * 4, /* %eip */
375b725ae77Skettenis 16 * 4, /* %eflags */
376b725ae77Skettenis 15 * 4, /* %cs */
377b725ae77Skettenis 18 * 4, /* %ss */
378b725ae77Skettenis 3 * 4, /* %ds */
379b725ae77Skettenis 2 * 4, /* %es */
380b725ae77Skettenis 1 * 4, /* %fs */
381b725ae77Skettenis 0 * 4 /* %gs */
382b725ae77Skettenis };
383b725ae77Skettenis
384b725ae77Skettenis static void
i386_linux_init_abi(struct gdbarch_info info,struct gdbarch * gdbarch)385b725ae77Skettenis i386_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
386b725ae77Skettenis {
387b725ae77Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
388b725ae77Skettenis
389b725ae77Skettenis /* GNU/Linux uses ELF. */
390b725ae77Skettenis i386_elf_init_abi (info, gdbarch);
391b725ae77Skettenis
392b725ae77Skettenis /* Since we have the extra "orig_eax" register on GNU/Linux, we have
393b725ae77Skettenis to adjust a few things. */
394b725ae77Skettenis
395b725ae77Skettenis set_gdbarch_write_pc (gdbarch, i386_linux_write_pc);
396b725ae77Skettenis set_gdbarch_num_regs (gdbarch, I386_LINUX_NUM_REGS);
397b725ae77Skettenis set_gdbarch_register_name (gdbarch, i386_linux_register_name);
398b725ae77Skettenis set_gdbarch_register_reggroup_p (gdbarch, i386_linux_register_reggroup_p);
399b725ae77Skettenis
400b725ae77Skettenis tdep->gregset_reg_offset = i386_linux_gregset_reg_offset;
401b725ae77Skettenis tdep->gregset_num_regs = ARRAY_SIZE (i386_linux_gregset_reg_offset);
402b725ae77Skettenis tdep->sizeof_gregset = 17 * 4;
403b725ae77Skettenis
404b725ae77Skettenis tdep->jb_pc_offset = 20; /* From <bits/setjmp.h>. */
405b725ae77Skettenis
406*11efff7fSkettenis tdep->sigtramp_p = i386_linux_sigtramp_p;
407b725ae77Skettenis tdep->sigcontext_addr = i386_linux_sigcontext_addr;
408b725ae77Skettenis tdep->sc_reg_offset = i386_linux_sc_reg_offset;
409b725ae77Skettenis tdep->sc_num_regs = ARRAY_SIZE (i386_linux_sc_reg_offset);
410b725ae77Skettenis
411*11efff7fSkettenis /* GNU/Linux uses SVR4-style shared libraries. */
412*11efff7fSkettenis set_solib_svr4_fetch_link_map_offsets
413*11efff7fSkettenis (gdbarch, svr4_ilp32_fetch_link_map_offsets);
414b725ae77Skettenis
415*11efff7fSkettenis /* GNU/Linux uses the dynamic linker included in the GNU C Library. */
416b725ae77Skettenis set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver);
417b725ae77Skettenis }
418b725ae77Skettenis
419b725ae77Skettenis /* Provide a prototype to silence -Wmissing-prototypes. */
420b725ae77Skettenis extern void _initialize_i386_linux_tdep (void);
421b725ae77Skettenis
422b725ae77Skettenis void
_initialize_i386_linux_tdep(void)423b725ae77Skettenis _initialize_i386_linux_tdep (void)
424b725ae77Skettenis {
425b725ae77Skettenis gdbarch_register_osabi (bfd_arch_i386, 0, GDB_OSABI_LINUX,
426b725ae77Skettenis i386_linux_init_abi);
427b725ae77Skettenis }
428