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