Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/gnu/dist/toolchain/gdb Overhaul, and add support for ELF cor...



details:   https://anonhg.NetBSD.org/src/rev/3fa33211d3ac
branches:  trunk
changeset: 520170:3fa33211d3ac
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Fri Jan 04 06:19:31 2002 +0000

description:
Overhaul, and add support for ELF core files.

diffstat:

 gnu/dist/toolchain/gdb/mipsnbsd-nat.c |  114 ++++++++++++++++++++++++++-------
 1 files changed, 89 insertions(+), 25 deletions(-)

diffs (182 lines):

diff -r b63006499058 -r 3fa33211d3ac gnu/dist/toolchain/gdb/mipsnbsd-nat.c
--- a/gnu/dist/toolchain/gdb/mipsnbsd-nat.c     Fri Jan 04 05:29:39 2002 +0000
+++ b/gnu/dist/toolchain/gdb/mipsnbsd-nat.c     Fri Jan 04 06:19:31 2002 +0000
@@ -29,8 +29,42 @@
 #include "target.h"
 #include "gdbcore.h"
 
+/* NOTE: This file works only with the o32 ABI. */
+
 #define JB_ELEMENT_SIZE 4
 
+static char zerobuf[MAX_REGISTER_RAW_SIZE] = {0};
+
+/* Determine if PT_GETREGS fetches this register.  */
+#define GETREGS_SUPPLIES(regno) \
+  ((regno) >= ZERO_REGNUM && (regno) <= PC_REGNUM)
+
+static void
+supply_regs (regs)
+     char *regs;
+{
+  int i;
+
+  /* Conveniently, GDB's register indices map directly to the NetBSD
+     "reg" structure.  */
+  for (i = 1 /* $at */; i <= PC_REGNUM; i++)
+    supply_register (i, regs + (i * 4));
+  supply_register (ZERO_REGNUM, zerobuf);
+}
+
+static void
+supply_fpregs (fregs)
+     char *fregs;
+{
+  int i;
+
+  for (i = FP0_REGNUM; i <= FCRCS_REGNUM; i++)
+    supply_register (i, fregs + ((i - FP0_REGNUM) * 4));
+
+  /* FIXME: how can we supply FCRIR_REGNUM?  NetBSD doesn't tell us.  */
+  supply_register (FCRIR_REGNUM, zerobuf);
+}
+
 void
 fetch_inferior_registers (regno)
      int regno;
@@ -38,21 +72,19 @@
   struct reg inferior_registers;
   struct fpreg inferior_fp_registers;
 
-  bzero(&inferior_registers, sizeof(inferior_registers));
-  ptrace (PT_GETREGS, inferior_pid,
-         (PTRACE_ARG3_TYPE) &inferior_registers, 0);
+  if (regno == -1 || GETREGS_SUPPLIES (regno))
+    {
+      ptrace (PT_GETREGS, inferior_pid,
+              (PTRACE_ARG3_TYPE) &inferior_registers, 0);
+      supply_regs ((char *) &inferior_registers);
 
-  memcpy (&registers[REGISTER_BYTE (0)], 
-         &inferior_registers, sizeof(inferior_registers));
+      if (regno != -1)
+       return;
+    }
 
-  bzero(&inferior_fp_registers, sizeof(inferior_fp_registers));
   ptrace (PT_GETFPREGS, inferior_pid,
          (PTRACE_ARG3_TYPE) &inferior_fp_registers, 0);
-
-  memcpy (&registers[REGISTER_BYTE (FP0_REGNUM)],
-         &inferior_fp_registers, sizeof(struct fpreg));
-
-  registers_fetched ();
+  supply_fpregs ((char *) &inferior_fp_registers);
 }
 
 void
@@ -73,8 +105,6 @@
 
   ptrace (PT_SETFPREGS, inferior_pid,
          (PTRACE_ARG3_TYPE) &inferior_fp_registers, 0);
-
-  registers_fetched ();
 }
 
 
@@ -121,12 +151,12 @@
            locate the registers in a large upage-plus-stack ".reg" section.
            Original upage address X is at location core_reg_sect+x+reg_addr.
  */
-void
+static void
 fetch_core_registers (core_reg_sect, core_reg_size, which, ignore)
   char *core_reg_sect;
   unsigned core_reg_size;
   int which;
-  unsigned int ignore; /* reg addr, unused in this version */
+  CORE_ADDR ignore;    /* reg addr, unused in this version */
 {
   struct md_core *core_reg;
 
@@ -137,14 +167,39 @@
     return;
 
   /* Integer registers */
-  memcpy(&registers[REGISTER_BYTE (0)],
-        &core_reg->intreg, sizeof(struct reg));
-  
+  supply_regs ((char *) &core_reg->intreg);
+
   /* Floating point registers */
-  memcpy(&registers[REGISTER_BYTE (FP0_REGNUM)],
-        &core_reg->freg, sizeof(struct fpreg));
+  supply_fpregs ((char *) &core_reg->freg);
+}
 
-  registers_fetched ();
+static void
+fetch_elfcore_registers (core_reg_sect, core_reg_size, which, ignore)
+     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
+       supply_regs (core_reg_sect);
+      break;
+
+    case 2:  /* Floating point registers */
+      if (core_reg_size != sizeof (struct fpreg))
+       warning ("Wrong size FP register set in core file.");
+      else
+       supply_fpregs (core_reg_sect);
+      break;
+
+    default:
+      /* Don't know what kind of register request this is; just ignore it.  */
+      break;
+    }
 }
 
 #ifdef FETCH_KCORE_REGISTERS
@@ -178,10 +233,9 @@
 #endif /* FETCH_KCORE_REGISTERS */
 
 
-/* Register that we are able to handle core file formats.
-   FIXME: is this really bfd_target_unknown_flavour? */
+/* Register that we are able to handle core file formats.  */
 
-static struct core_fns netbsd_core_fns =
+static struct core_fns mipsnbsd_core_fns =
 {
   bfd_target_unknown_flavour,           /* core_flavour */
   default_check_format,                 /* check_format */
@@ -190,10 +244,20 @@
   NULL                                  /* next */
 };
 
+static struct core_fns mipsnbsd_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 */
+};
+
 void
 _initialize_mipsbsd_nat ()
 {
-  add_core_fns (&netbsd_core_fns);
+  add_core_fns (&mipsnbsd_core_fns);
+  add_core_fns (&mipsnbsd_elfcore_fns);
 }
 
 int one_stepped;



Home | Main Index | Thread Index | Old Index