1b725ae77Skettenis /* Target-dependent code for i386 BSD's.
2b725ae77Skettenis
3b725ae77Skettenis Copyright 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 "arch-utils.h"
24b725ae77Skettenis #include "frame.h"
25b725ae77Skettenis #include "gdbcore.h"
26b725ae77Skettenis #include "regcache.h"
27b725ae77Skettenis #include "osabi.h"
28b725ae77Skettenis
29b725ae77Skettenis #include "gdb_string.h"
30b725ae77Skettenis
31b725ae77Skettenis #include "i386-tdep.h"
32b725ae77Skettenis
33b725ae77Skettenis /* Support for signal handlers. */
34b725ae77Skettenis
35b725ae77Skettenis /* Assuming NEXT_FRAME is for a frame following a BSD sigtramp
36b725ae77Skettenis routine, return the address of the associated sigcontext structure. */
37b725ae77Skettenis
38b725ae77Skettenis static CORE_ADDR
i386bsd_sigcontext_addr(struct frame_info * next_frame)39b725ae77Skettenis i386bsd_sigcontext_addr (struct frame_info *next_frame)
40b725ae77Skettenis {
41b725ae77Skettenis char buf[4];
42b725ae77Skettenis CORE_ADDR sp;
43b725ae77Skettenis
44b725ae77Skettenis frame_unwind_register (next_frame, I386_ESP_REGNUM, buf);
45b725ae77Skettenis sp = extract_unsigned_integer (buf, 4);
46b725ae77Skettenis
47b725ae77Skettenis return read_memory_unsigned_integer (sp + 8, 4);
48b725ae77Skettenis }
49b725ae77Skettenis
50b725ae77Skettenis
51b725ae77Skettenis /* Support for shared libraries. */
52b725ae77Skettenis
53b725ae77Skettenis /* Return non-zero if we are in a shared library trampoline code stub. */
54b725ae77Skettenis
55b725ae77Skettenis int
i386bsd_aout_in_solib_call_trampoline(CORE_ADDR pc,char * name)56b725ae77Skettenis i386bsd_aout_in_solib_call_trampoline (CORE_ADDR pc, char *name)
57b725ae77Skettenis {
58b725ae77Skettenis return (name && !strcmp (name, "_DYNAMIC"));
59b725ae77Skettenis }
60b725ae77Skettenis
61b725ae77Skettenis /* Traditional BSD (4.3 BSD, still used for BSDI and 386BSD). */
62b725ae77Skettenis
63b725ae77Skettenis /* From <machine/signal.h>. */
64b725ae77Skettenis int i386bsd_sc_reg_offset[] =
65b725ae77Skettenis {
66b725ae77Skettenis -1, /* %eax */
67b725ae77Skettenis -1, /* %ecx */
68b725ae77Skettenis -1, /* %edx */
69b725ae77Skettenis -1, /* %ebx */
70b725ae77Skettenis 8 + 0 * 4, /* %esp */
71b725ae77Skettenis 8 + 1 * 4, /* %ebp */
72b725ae77Skettenis -1, /* %esi */
73b725ae77Skettenis -1, /* %edi */
74b725ae77Skettenis 8 + 3 * 4, /* %eip */
75b725ae77Skettenis 8 + 4 * 4, /* %eflags */
76b725ae77Skettenis -1, /* %cs */
77b725ae77Skettenis -1, /* %ss */
78b725ae77Skettenis -1, /* %ds */
79b725ae77Skettenis -1, /* %es */
80b725ae77Skettenis -1, /* %fs */
81b725ae77Skettenis -1 /* %gs */
82b725ae77Skettenis };
83b725ae77Skettenis
84b725ae77Skettenis void
i386bsd_init_abi(struct gdbarch_info info,struct gdbarch * gdbarch)85b725ae77Skettenis i386bsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
86b725ae77Skettenis {
87b725ae77Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
88b725ae77Skettenis
89b725ae77Skettenis /* Assume SunOS-style shared libraries. */
90b725ae77Skettenis set_gdbarch_in_solib_call_trampoline (gdbarch,
91b725ae77Skettenis i386bsd_aout_in_solib_call_trampoline);
92b725ae77Skettenis
93b725ae77Skettenis tdep->jb_pc_offset = 0;
94b725ae77Skettenis
95b725ae77Skettenis tdep->sigtramp_start = 0xfdbfdfc0;
96b725ae77Skettenis tdep->sigtramp_end = 0xfdbfe000;
97b725ae77Skettenis tdep->sigcontext_addr = i386bsd_sigcontext_addr;
98b725ae77Skettenis tdep->sc_reg_offset = i386bsd_sc_reg_offset;
99b725ae77Skettenis tdep->sc_num_regs = ARRAY_SIZE (i386bsd_sc_reg_offset);
100b725ae77Skettenis }
101b725ae77Skettenis
102b725ae77Skettenis
103b725ae77Skettenis static enum gdb_osabi
i386bsd_aout_osabi_sniffer(bfd * abfd)104b725ae77Skettenis i386bsd_aout_osabi_sniffer (bfd *abfd)
105b725ae77Skettenis {
106b725ae77Skettenis if (strcmp (bfd_get_target (abfd), "a.out-i386-netbsd") == 0)
107b725ae77Skettenis return GDB_OSABI_NETBSD_AOUT;
108b725ae77Skettenis
109b725ae77Skettenis if (strcmp (bfd_get_target (abfd), "a.out-i386-freebsd") == 0)
110b725ae77Skettenis return GDB_OSABI_FREEBSD_AOUT;
111b725ae77Skettenis
112b725ae77Skettenis return GDB_OSABI_UNKNOWN;
113b725ae77Skettenis }
114b725ae77Skettenis
115b725ae77Skettenis static enum gdb_osabi
i386bsd_core_osabi_sniffer(bfd * abfd)116b725ae77Skettenis i386bsd_core_osabi_sniffer (bfd *abfd)
117b725ae77Skettenis {
118b725ae77Skettenis if (strcmp (bfd_get_target (abfd), "netbsd-core") == 0)
119b725ae77Skettenis return GDB_OSABI_NETBSD_AOUT;
120b725ae77Skettenis
121b725ae77Skettenis return GDB_OSABI_UNKNOWN;
122b725ae77Skettenis }
123b725ae77Skettenis
124b725ae77Skettenis
125b725ae77Skettenis /* Provide a prototype to silence -Wmissing-prototypes. */
126b725ae77Skettenis void _initialize_i386bsd_tdep (void);
127b725ae77Skettenis
128b725ae77Skettenis void
_initialize_i386bsd_tdep(void)129b725ae77Skettenis _initialize_i386bsd_tdep (void)
130b725ae77Skettenis {
131b725ae77Skettenis gdbarch_register_osabi_sniffer (bfd_arch_i386, bfd_target_aout_flavour,
132b725ae77Skettenis i386bsd_aout_osabi_sniffer);
133b725ae77Skettenis
134*11efff7fSkettenis /* BFD doesn't set a flavour for NetBSD style a.out core files. */
135*11efff7fSkettenis gdbarch_register_osabi_sniffer (bfd_arch_i386, bfd_target_unknown_flavour,
136b725ae77Skettenis i386bsd_core_osabi_sniffer);
137b725ae77Skettenis }
138