[PATCH] Register sets for NetBSD/i386

Mark Kettenis kettenis@chello.nl
Thu Nov 27 13:30:00 GMT 2003


This converts NetBSD/i386 to the new mechanism.  I didn't test a.out,
but I'm fairly confident that it will work.  Tested on NetBSD/i386
1.6.1.

Mark


Index: ChangeLog
from  Mark Kettenis  <kettenis@gnu.org>
 
	* i386nbsd-tdep.c: Don't include "gdbtypes.h".  Include
	"gdb_assert.h" and "gdb_string.h".
	(i386nbsd_r_reg_offset): Rename from regmap.
	(SIZEOF_STRUCT_REG): Remove.
	(i386nbsd_supply_reg, fetch_core_registers,
	fetch_elfcore_registers, i386nbsd_core_fns, i386nbsd_elfcore_fns):
	Remove.
	(i386nbsd_aout_supply_regset,
	i386nbsd_aout_regset_from_core_section): New functions.
	(i386nbsd_sc_reg_offset): Don't explicitly specify size of array.
	(i386nbsd_init_abi): Initialize TDEP->gregset_reg_offset,
	TDEP->gregset_num_regs amd sizeof_gregset.  Use ARRAY_SIZE to
	initialize TDEP->sc_num_regs.
	(i386nbsdaout_init_abi): New function.
	(i386nbsdelf_init_abi): Remove initialization of
	TDEP->num_xmm_regs.  Don't set num_regs here.
	(_initialize_i386nbsd_tdep): Don't call add_core_fns.  Use
	i386nbsd_aout_init to register NetBSD a.out OS/ABI.

 
Index: i386nbsd-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/i386nbsd-tdep.c,v
retrieving revision 1.16
diff -u -p -r1.16 i386nbsd-tdep.c
--- i386nbsd-tdep.c 28 Sep 2003 13:35:44 -0000 1.16
+++ i386nbsd-tdep.c 27 Nov 2003 13:27:57 -0000
@@ -21,129 +21,80 @@
    Boston, MA 02111-1307, USA.  */
 
 #include "defs.h"
-#include "gdbtypes.h"
+#include "arch-utils.h"
 #include "gdbcore.h"
 #include "regcache.h"
-#include "arch-utils.h"
+#include "regset.h"
 #include "osabi.h"
 
+#include "gdb_assert.h"
+#include "gdb_string.h"
+
 #include "i386-tdep.h"
 #include "i387-tdep.h"
 #include "nbsd-tdep.h"
 
 #include "solib-svr4.h"
 
-/* Map a GDB register number to an offset in the reg structure.  */
-static int regmap[] =
+/* From <machine/reg.h>.  */
+static int i386nbsd_r_reg_offset[] =
 {
-  ( 0 * 4),		/* %eax */
-  ( 1 * 4),		/* %ecx */
-  ( 2 * 4),		/* %edx */
-  ( 3 * 4),		/* %ebx */
-  ( 4 * 4),		/* %esp */
-  ( 5 * 4),		/* %epb */
-  ( 6 * 4),		/* %esi */
-  ( 7 * 4),		/* %edi */
-  ( 8 * 4),		/* %eip */
-  ( 9 * 4),		/* %eflags */
-  (10 * 4),		/* %cs */
-  (11 * 4),		/* %ss */
-  (12 * 4),		/* %ds */
-  (13 * 4),		/* %es */
-  (14 * 4),		/* %fs */
-  (15 * 4),		/* %gs */
+  0 * 4,			/* %eax */
+  1 * 4,			/* %ecx */
+  2 * 4,			/* %edx */
+  3 * 4,			/* %ebx */
+  4 * 4,			/* %esp */
+  5 * 4,			/* %ebp */
+  6 * 4,			/* %esi */
+  7 * 4,			/* %edi */
+  8 * 4,			/* %eip */
+  9 * 4,			/* %eflags */
+  10 * 4,			/* %cs */
+  11 * 4,			/* %ss */
+  12 * 4,			/* %ds */
+  13 * 4,			/* %es */
+  14 * 4,			/* %fs */
+  15 * 4			/* %gs */
 };
 
-#define SIZEOF_STRUCT_REG	(16 * 4)
-
 static void
-i386nbsd_supply_reg (char *regs, int regno)
+i386nbsd_aout_supply_regset (const struct regset *regset,
+			     struct regcache *regcache, int regnum,
+			     const void *regs, size_t len)
 {
-  int i;
+  const struct gdbarch_tdep *tdep = regset->descr;
+
+  gdb_assert (len >= tdep->sizeof_gregset + I387_SIZEOF_FSAVE);
 
-  for (i = 0; i <= 15; i++)
-    if (regno == i || regno == -1)
-      supply_register (i, regs + regmap[i]);
+  i386_supply_gregset (regset, regcache, regnum, regs, tdep->sizeof_gregset);
+  i387_supply_fsave (regcache, regnum, (char *) regs + tdep->sizeof_gregset);
 }
 
-static void
-fetch_core_registers (char *core_reg_sect, unsigned core_reg_size, int which,
-                      CORE_ADDR ignore)
+const struct regset *
+i386nbsd_aout_regset_from_core_section (struct gdbarch *gdbarch,
+					const char *sect_name,
+					size_t sect_size)
 {
-  char *regs, *fsave;
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 
-  /* We get everything from one section.  */
-  if (which != 0)
-    return;
+  /* NetBSD a.out core dumps don't use seperate register sets for the
+     general-purpose and floating-point registers.  */
 
-  if (core_reg_size < (SIZEOF_STRUCT_REG + 108))
+  if (strcmp (sect_name, ".reg") == 0
+      && sect_size >= tdep->sizeof_gregset + I387_SIZEOF_FSAVE)
     {
-      warning ("Wrong size register set in core file.");
-      return;
+      if (tdep->gregset == NULL)
+	{
+	  tdep->gregset = XMALLOC (struct regset);
+	  tdep->gregset->descr = tdep;
+	  tdep->gregset->supply_regset = i386nbsd_aout_supply_regset;
+	}
+      return tdep->gregset;
     }
 
-  regs = core_reg_sect;
-  fsave = core_reg_sect + SIZEOF_STRUCT_REG;
-
-  /* Integer registers.  */
-  i386nbsd_supply_reg (regs, -1);
-
-  /* Floating point registers.  */
-  i387_supply_fsave (current_regcache, -1, fsave);
-}
-
-static void
-fetch_elfcore_registers (char *core_reg_sect, unsigned core_reg_size,
-			 int which, CORE_ADDR ignore)
-{
-  switch (which)
-    {
-    case 0:  /* Integer registers.  */
-      if (core_reg_size != SIZEOF_STRUCT_REG)
-	warning ("Wrong size register set in core file.");
-      else
-	i386nbsd_supply_reg (core_reg_sect, -1);
-      break;
-
-    case 2:  /* Floating point registers.  */
-      if (core_reg_size != 108)
-	warning ("Wrong size FP register set in core file.");
-      else
-	i387_supply_fsave (current_regcache, -1, core_reg_sect);
-      break;
-
-    case 3:  /* "Extended" floating point registers.  This is gdb-speak
-		for SSE/SSE2. */
-      if (core_reg_size != 512)
-	warning ("Wrong size XMM register set in core file.");
-      else
-	i387_supply_fxsave (current_regcache, -1, core_reg_sect);
-      break;
-
-    default:
-      /* Don't know what kind of register request this is; just ignore it.  */
-      break;
-    }
+  return NULL;
 }
 
-static struct core_fns i386nbsd_core_fns =
-{
-  bfd_target_unknown_flavour,		/* core_flavour */
-  default_check_format,			/* check_format */
-  default_core_sniffer,			/* core_sniffer */
-  fetch_core_registers,			/* core_read_registers */
-  NULL					/* next */
-};
-
-static struct core_fns i386nbsd_elfcore_fns =
-{
-  bfd_target_elf_flavour,		/* core_flavour */
-  default_check_format,			/* check_format */
-  default_core_sniffer,			/* core_sniffer */
-  fetch_elfcore_registers,		/* core_read_registers */
-  NULL					/* next */
-};
-
 /* Under NetBSD/i386, signal handler invocations can be identified by the
    designated code sequence that is used to return from a signal handler.
    In particular, the return address of a signal handler points to the
@@ -240,7 +191,7 @@ i386nbsd_pc_in_sigtramp (CORE_ADDR pc, c
 }
 
 /* From <machine/signal.h>.  */
-int i386nbsd_sc_reg_offset[I386_NUM_GREGS] =
+int i386nbsd_sc_reg_offset[] =
 {
   10 * 4,			/* %eax */
   9 * 4,			/* %ecx */
@@ -268,6 +219,11 @@ i386nbsd_init_abi (struct gdbarch_info i
   /* Obviously NetBSD is BSD-based.  */
   i386bsd_init_abi (info, gdbarch);
 
+  /* NetBSD has a different `struct reg'.  */
+  tdep->gregset_reg_offset = i386nbsd_r_reg_offset;
+  tdep->gregset_num_regs = ARRAY_SIZE (i386nbsd_r_reg_offset);
+  tdep->sizeof_gregset = 16 * 4;
+
   /* NetBSD has different signal trampoline conventions.  */
   set_gdbarch_pc_in_sigtramp (gdbarch, i386nbsd_pc_in_sigtramp);
   /* FIXME: kettenis/20020906: We should probably provide
@@ -282,10 +238,23 @@ i386nbsd_init_abi (struct gdbarch_info i
   /* NetBSD has a `struct sigcontext' that's different from the
      origional 4.3 BSD.  */
   tdep->sc_reg_offset = i386nbsd_sc_reg_offset;
-  tdep->sc_num_regs = I386_NUM_GREGS;
+  tdep->sc_num_regs = ARRAY_SIZE (i386nbsd_sc_reg_offset);
+}
+
+/* NetBSD a.out.  */
+
+static void
+i386nbsdaout_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
+{
+  i386nbsd_init_abi (info, gdbarch);
+
+  /* NetBSD a.out has a single register set.  */
+  set_gdbarch_regset_from_core_section
+    (gdbarch, i386nbsd_aout_regset_from_core_section);
 }
 
 /* NetBSD ELF.  */
+
 static void
 i386nbsdelf_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
@@ -300,26 +269,18 @@ i386nbsdelf_init_abi (struct gdbarch_inf
   /* NetBSD ELF uses SVR4-style shared libraries.  */
   set_gdbarch_in_solib_call_trampoline (gdbarch,
                                         generic_in_solib_call_trampoline);
-  set_solib_svr4_fetch_link_map_offsets (gdbarch,
-				 nbsd_ilp32_solib_svr4_fetch_link_map_offsets);
+  set_solib_svr4_fetch_link_map_offsets
+    (gdbarch, nbsd_ilp32_solib_svr4_fetch_link_map_offsets);
 
   /* NetBSD ELF uses -fpcc-struct-return by default.  */
   tdep->struct_return = pcc_struct_return;
-
-  /* We support the SSE registers on NetBSD ELF.  */
-  tdep->num_xmm_regs = I386_NUM_XREGS - 1;
-  set_gdbarch_num_regs (gdbarch, I386_NUM_GREGS + I386_NUM_FREGS
-                        + I386_NUM_XREGS);
 }
 
 void
 _initialize_i386nbsd_tdep (void)
 {
-  add_core_fns (&i386nbsd_core_fns);
-  add_core_fns (&i386nbsd_elfcore_fns);
-
   gdbarch_register_osabi (bfd_arch_i386, 0, GDB_OSABI_NETBSD_AOUT,
-			  i386nbsd_init_abi);
+			  i386nbsdaout_init_abi);
   gdbarch_register_osabi (bfd_arch_i386, 0, GDB_OSABI_NETBSD_ELF,
 			  i386nbsdelf_init_abi);
 }



More information about the Gdb-patches mailing list