PR gdb/13987:
[deliverable/binutils-gdb.git] / gdb / i386bsd-tdep.c
index a01ed6b89e6fe4faa61bbd9107da18f27dfbdbad..aa1039312cd8601f5a9259683e9deae410dc3f45 100644 (file)
@@ -1,11 +1,12 @@
 /* Target-dependent code for i386 BSD's.
-   Copyright 2001 Free Software Foundation, Inc.
+
+   Copyright (C) 2001-2013 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
+#include "arch-utils.h"
 #include "frame.h"
 #include "gdbcore.h"
 #include "regcache.h"
+#include "osabi.h"
 
-/* Support for signal handlers.  */
+#include "gdb_string.h"
 
-/* Range in which to find the signaltramp routine, traditionally found
-   on the use stack, just below the user area.  Initialized to values
-   that work for NetBSD and FreeBSD.  */
+#include "i386-tdep.h"
 
-CORE_ADDR i386bsd_sigtramp_start = 0xbfbfdf20;
-CORE_ADDR i386bsd_sigtramp_end = 0xbfbfdff0;
+/* Support for signal handlers.  */
 
-/* Return whether PC is in a BSD sigtramp routine.  */
+/* Assuming THIS_FRAME is for a BSD sigtramp routine, return the
+   address of the associated sigcontext structure.  */
 
-int
-i386bsd_in_sigtramp (CORE_ADDR pc, char *name)
+static CORE_ADDR
+i386bsd_sigcontext_addr (struct frame_info *this_frame)
 {
-  return (pc >= i386bsd_sigtramp_start && pc < i386bsd_sigtramp_end);
+  struct gdbarch *gdbarch = get_frame_arch (this_frame);
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+  gdb_byte buf[4];
+  CORE_ADDR sp;
+
+  get_frame_register (this_frame, I386_ESP_REGNUM, buf);
+  sp = extract_unsigned_integer (buf, 4, byte_order);
+
+  return read_memory_unsigned_integer (sp + 8, 4, byte_order);
 }
+\f
 
-/* Offset in the sigcontext structure of the program counter.
-   Initialized to the value from 4.4 BSD Lite.  */
-int i386bsd_sigcontext_pc_offset = 20;
+/* Support for shared libraries.  */
 
-/* Assuming FRAME is for a BSD sigtramp routine, return the address of
-   the associated sigcontext structure.  */
+/* Traditional BSD (4.3 BSD, still used for BSDI and 386BSD).  */
 
-static CORE_ADDR
-i386bsd_sigcontext_addr (struct frame_info *frame)
+/* From <machine/signal.h>.  */
+int i386bsd_sc_reg_offset[] =
+{
+  -1,                          /* %eax */
+  -1,                          /* %ecx */
+  -1,                          /* %edx */
+  -1,                          /* %ebx */
+  8 + 0 * 4,                   /* %esp */
+  8 + 1 * 4,                   /* %ebp */
+  -1,                          /* %esi */
+  -1,                          /* %edi */
+  8 + 3 * 4,                   /* %eip */
+  8 + 4 * 4,                   /* %eflags */
+  -1,                          /* %cs */
+  -1,                          /* %ss */
+  -1,                          /* %ds */
+  -1,                          /* %es */
+  -1,                          /* %fs */
+  -1                           /* %gs */
+};
+
+void
+i386bsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
-  if (frame->next)
-    /* If this isn't the top frame, the next frame must be for the
-       signal handler itself.  A pointer to the sigcontext structure
-       is passed as the third argument to the signal handler.  */
-    return read_memory_unsigned_integer (frame->next->frame + 16, 4);
-
-  /* This is the top frame.  We'll have to find the address of the
-     sigcontext structure by looking at the stack pointer.  */
-  return read_memory_unsigned_integer (read_register (SP_REGNUM) + 8, 4);
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+
+  tdep->jb_pc_offset = 0;
+
+  tdep->sigtramp_start = 0xfdbfdfc0;
+  tdep->sigtramp_end = 0xfdbfe000;
+  tdep->sigcontext_addr = i386bsd_sigcontext_addr;
+  tdep->sc_reg_offset = i386bsd_sc_reg_offset;
+  tdep->sc_num_regs = ARRAY_SIZE (i386bsd_sc_reg_offset);
 }
 
-/* Assuming FRAME is for a BSD sigtramp routine, return the saved
-   program counter.  */
+\f
+static enum gdb_osabi
+i386bsd_aout_osabi_sniffer (bfd *abfd)
+{
+  if (strcmp (bfd_get_target (abfd), "a.out-i386-netbsd") == 0)
+    return GDB_OSABI_NETBSD_AOUT;
 
-static CORE_ADDR
-i386bsd_sigtramp_saved_pc (struct frame_info *frame)
+  if (strcmp (bfd_get_target (abfd), "a.out-i386-freebsd") == 0)
+    return GDB_OSABI_FREEBSD_AOUT;
+
+  return GDB_OSABI_UNKNOWN;
+}
+
+static enum gdb_osabi
+i386bsd_core_osabi_sniffer (bfd *abfd)
 {
-  CORE_ADDR addr;
-  addr = i386bsd_sigcontext_addr (frame);
-  return read_memory_unsigned_integer (addr + i386bsd_sigcontext_pc_offset, 4);
+  if (strcmp (bfd_get_target (abfd), "netbsd-core") == 0)
+    return GDB_OSABI_NETBSD_AOUT;
+
+  return GDB_OSABI_UNKNOWN;
 }
 
-/* Return the saved program counter for FRAME.  */
+\f
+/* Provide a prototype to silence -Wmissing-prototypes.  */
+void _initialize_i386bsd_tdep (void);
 
-CORE_ADDR
-i386bsd_frame_saved_pc (struct frame_info *frame)
+void
+_initialize_i386bsd_tdep (void)
 {
-  if (frame->signal_handler_caller)
-    return i386bsd_sigtramp_saved_pc (frame);
+  gdbarch_register_osabi_sniffer (bfd_arch_i386, bfd_target_aout_flavour,
+                                 i386bsd_aout_osabi_sniffer);
 
-  return read_memory_unsigned_integer (frame->frame + 4, 4);
+  /* BFD doesn't set a flavour for NetBSD style a.out core files.  */
+  gdbarch_register_osabi_sniffer (bfd_arch_i386, bfd_target_unknown_flavour,
+                                 i386bsd_core_osabi_sniffer);
 }
This page took 0.061289 seconds and 4 git commands to generate.