* i386-tdep.h (i386_collect_gregset): New prototype.
authorMark Kettenis <kettenis@gnu.org>
Fri, 24 Dec 2004 14:45:32 +0000 (14:45 +0000)
committerMark Kettenis <kettenis@gnu.org>
Fri, 24 Dec 2004 14:45:32 +0000 (14:45 +0000)
* i386-nto-tdep.c (i386_nto_target): Move variable.  Add comment.
(i386nto_gregset_reg_offset): Rename frame regmap.
(nto_reg_offset): Tweak comment.  Use ARRAY_SIZE.
(i386nto_supply_gregset): Implement using register set support.
(i386nto_supply_regset): Remove redundant comment.
(i386nto_init_abi): Initialize TDEP->gregset_reg_offset,
TDEP->gregset_num_regs and TDEP->sizeof_gregset.
* nto-tdep.c (fetch_core_registers): Remove function.
(regset_core_fns): Remove structure.
(_initialize_nto_tdep): Don't call deprecated_add_core_fns.

gdb/i386-nto-tdep.c
gdb/i386-tdep.h
gdb/nto-tdep.c

index ad9cfe523678bdf847dcdca0026c5abb23995a48..744b8c934a67b82a454351eaf363aa2df960feeb 100644 (file)
@@ -35,6 +35,9 @@
 #include "nto-tdep.h"
 #include "solib-svr4.h"
 
+/* Target vector for QNX NTO x86.  */
+static struct nto_target_ops i386_nto_target;
+
 #ifndef X86_CPU_FXSR
 #define X86_CPU_FXSR (1L << 12)
 #endif
    that is just filler.  Don't ask me, ask the kernel guys.  */
 #define NUM_GPREGS 13
 
-/* Map a GDB register number to an offset in the reg structure.  */
-static int regmap[] = {
-  (7 * 4),                     /* eax */
-  (6 * 4),                     /* ecx */
-  (5 * 4),                     /* edx */
-  (4 * 4),                     /* ebx */
-  (11 * 4),                    /* esp */
-  (2 * 4),                     /* epb */
-  (1 * 4),                     /* esi */
-  (0 * 4),                     /* edi */
-  (8 * 4),                     /* eip */
-  (10 * 4),                    /* eflags */
-  (9 * 4),                     /* cs */
-  (12 * 4),                    /* ss */
-  (-1 * 4)                     /* filler */
+/* Mapping between the general-purpose registers in `struct xxx'
+   format and GDB's register cache layout.  */
+
+/* From <x86/context.h>.  */
+static int i386nto_gregset_reg_offset[] =
+{
+  7 * 4,                       /* %eax */
+  6 * 4,                       /* %ecx */
+  5 * 4,                       /* %edx */
+  4 * 4,                       /* %ebx */
+  11 * 4,                      /* %esp */
+  2 * 4,                       /* %epb */
+  1 * 4,                       /* %esi */
+  0 * 4,                       /* %edi */
+  8 * 4,                       /* %eip */
+  10 * 4,                      /* %eflags */
+  9 * 4,                       /* %cs */
+  12 * 4,                      /* %ss */
+  -1                           /* filler */
 };
 
-static struct nto_target_ops i386_nto_target;
+/* Given a GDB register number REGNUM, return the offset into
+   Neutrino's register structure or -1 if the register is unknown.  */
 
-/* Given a gdb regno, return the offset into Neutrino's register structure
-   or -1 if register is unknown.  */
 static int
-nto_reg_offset (int regno)
+nto_reg_offset (int regnum)
 {
-  return (regno >= 0 && regno < NUM_GPREGS) ? regmap[regno] : -1;
+  if (regnum >= 0 && regnum < ARRAY_SIZE (i386nto_gregset_reg_offset))
+    return i386nto_gregset_reg_offset[regnum];
+
+  return -1;
 }
 
 static void
 i386nto_supply_gregset (char *gpregs)
 {
-  unsigned regno;
-  int empty = 0;
+  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
 
-  for (regno = 0; regno < I386_NUM_GREGS; regno++)
-    {
-      int offset = nto_reg_offset (regno);
-      if (offset == -1)
-       regcache_raw_supply (current_regcache, regno, (char *) &empty);
-      else
-       regcache_raw_supply (current_regcache, regno, gpregs + offset);
-    }
+  if(tdep->gregset == NULL)
+    tdep->gregset = regset_alloc (current_gdbarch, i386_supply_gregset,
+                                 i386_collect_gregset);
+
+  gdb_assert (tdep->gregset_reg_offset == i386nto_gregset_reg_offset);
+  tdep->gregset->supply_regset (tdep->gregset, current_regcache, -1,
+                               gpregs, NUM_GPREGS * 4);
 }
 
 static void
@@ -101,7 +108,7 @@ i386nto_supply_regset (int regset, char *data)
 {
   switch (regset)
     {
-    case NTO_REG_GENERAL:      /* QNX has different ordering of GP regs than GDB.  */
+    case NTO_REG_GENERAL:
       i386nto_supply_gregset (data);
       break;
     case NTO_REG_FLOAT:
@@ -258,6 +265,10 @@ i386nto_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   /* NTO has shared libraries.  */
   set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
 
+  tdep->gregset_reg_offset = i386nto_gregset_reg_offset;
+  tdep->gregset_num_regs = ARRAY_SIZE (i386nto_gregset_reg_offset);
+  tdep->sizeof_gregset = NUM_GPREGS * 4;
+
   tdep->sigtramp_p = i386nto_sigtramp_p;
   tdep->sigcontext_addr = i386nto_sigcontext_addr;
   tdep->sc_pc_offset = 56;
index 29f2f27ececacdc7512be80c81c42e6c0d6e02a2..8e51a3aa8438ed01fe40ad5cf564c59e93040ba9 100644 (file)
@@ -166,6 +166,14 @@ extern void i386_supply_gregset (const struct regset *regset,
                                 struct regcache *regcache, int regnum,
                                 const void *gregs, size_t len);
 
+/* Collect register REGNUM from the register cache REGCACHE and store
+   it in the buffer specified by GREGS and LEN as described by the
+   general-purpose register set REGSET.  If REGNUM is -1, do this for
+   all registers in REGSET.  */
+extern void i386_collect_gregset (const struct regset *regset,
+                                 const struct regcache *regcache,
+                                 int regnum, void *gregs, size_t len);
+
 /* Return the appropriate register set for the core section identified
    by SECT_NAME and SECT_SIZE.  */
 extern const struct regset *
index b882a224b19e5218ec9fa2e020ea94b308a6e9fc..7cc1218b4027b0ca2c9f272a23b93a7ec0f42378 100644 (file)
@@ -66,7 +66,7 @@ nto_target (void)
 }
 
 void
-nto_set_target(struct nto_target_ops *targ)
+nto_set_target (struct nto_target_ops *targ)
 {
   nto_regset_id = targ->regset_id;
   nto_supply_gregset = targ->supply_gregset;
@@ -345,41 +345,10 @@ enum gdb_osabi
 nto_elf_osabi_sniffer (bfd *abfd)
 {
   if (nto_is_nto_target)
-      return nto_is_nto_target (abfd);
+    return nto_is_nto_target (abfd);
   return GDB_OSABI_UNKNOWN;
 }
 
-static void
-fetch_core_registers (char *core_reg_sect, unsigned core_reg_size,
-                     int which, CORE_ADDR reg_addr)
-{
-  nto_regset_t regset;
-
-/* See corelow.c:get_core_registers for values of WHICH.  */
-  if (which == 0)
-    {
-      memcpy ((char *) &regset, core_reg_sect,
-             min (core_reg_size, sizeof (regset)));
-      nto_supply_gregset ((char *) &regset);
-    }
-  else if (which == 2)
-    {
-      memcpy ((char *) &regset, core_reg_sect,
-             min (core_reg_size, sizeof (regset)));
-      nto_supply_fpregset ((char *) &regset);
-    }
-}
-
-/* Register that we are able to handle ELF file formats using standard
-   procfs "regset" structures.  */
-static struct core_fns regset_core_fns = {
-  bfd_target_elf_flavour,      /* core_flavour */
-  default_check_format,                /* check_format */
-  default_core_sniffer,                /* core_sniffer */
-  fetch_core_registers,                /* core_read_registers */
-  NULL                         /* next */
-};
-
 void
 nto_initialize_signals (void)
 {
@@ -414,6 +383,4 @@ When non-zero, nto specific debug info is\n\
 displayed. Different information is displayed\n\
 for different positive values.", "\
 QNX NTO internal debugging is %s.", NULL, NULL, &setdebuglist, &showdebuglist);
-  /* Register core file support.  */
-  deprecated_add_core_fns (&regset_core_fns);
 }