This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch] remove deprecated core support from QNX NTO


Kris Warkentin wrote:

When I run an app, it's dumping core in i386_supply_gregset because tdep->regset is not initialized. Not quite sure what the proper way to do that is. Still investigating.


Got it working. I had to put a check in i386_nto_supply_gregset for whether tdep->regset had been allocated or not. I've attached the new patch which is a blend of your code and mine. Much cleaner and results in a fair bit of code removal. I'll wait until you tell me I'm not completely off base before I construct a ChangeLog.


cheers,

Kris
Index: i386-nto-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/i386-nto-tdep.c,v
retrieving revision 1.16
diff -c -r1.16 i386-nto-tdep.c
*** i386-nto-tdep.c	10 Dec 2004 13:38:23 -0000	1.16
--- i386-nto-tdep.c	23 Dec 2004 17:15:14 -0000
***************
*** 21,37 ****
     Foundation, Inc., 59 Temple Place - Suite 330,
     Boston, MA 02111-1307, USA.  */
  
- #include "gdb_string.h"
- #include "gdb_assert.h"
  #include "defs.h"
  #include "frame.h"
! #include "target.h"
  #include "regcache.h"
! #include "solib-svr4.h"
  #include "i386-tdep.h"
- #include "nto-tdep.h"
- #include "osabi.h"
  #include "i387-tdep.h"
  
  #ifndef X86_CPU_FXSR
  #define X86_CPU_FXSR (1L << 12)
--- 21,42 ----
     Foundation, Inc., 59 Temple Place - Suite 330,
     Boston, MA 02111-1307, USA.  */
  
  #include "defs.h"
  #include "frame.h"
! #include "osabi.h"
  #include "regcache.h"
! #include "target.h"
! 
! #include "gdb_string.h"
! #include "gdb_assert.h"
! 
  #include "i386-tdep.h"
  #include "i387-tdep.h"
+ #include "nto-tdep.h"
+ #include "solib-svr4.h"
+ 
+ /* Target vector for i386nto target.  */
+ static struct nto_target_ops i386_nto_target;
  
  #ifndef X86_CPU_FXSR
  #define X86_CPU_FXSR (1L << 12)
***************
*** 42,88 ****
     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 */
  };
  
! static struct nto_target_ops i386_nto_target;
  
- /* 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)
  {
!   return (regno >= 0 && regno < NUM_GPREGS) ? regmap[regno] : -1;
  }
  
  static void
  i386nto_supply_gregset (char *gpregs)
  {
!   unsigned regno;
!   int empty = 0;
  
!   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);
!     }
  }
  
  static void
--- 47,95 ----
     that is just filler.  Don't ask me, ask the kernel guys.  */
  #define NUM_GPREGS 13
  
! /* 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 */
  };
  
! /* Given a GDB register number REGNUM, return the offset into
!    Neutrino's register structure or -1 if the register is unknown.  */
  
  static int
! nto_reg_offset (int regnum)
  {
!   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)
  {
!   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
  
!   if(tdep->gregset == NULL)
!     tdep->gregset = regset_alloc (current_gdbarch, i386_supply_gregset, NULL);
! 
!   gdb_assert (tdep->gregset_reg_offset == i386nto_gregset_reg_offset);
!   i386_supply_gregset (tdep->gregset, current_regcache, -1, gpregs, NUM_GPREGS * 4);
  }
  
  static void
***************
*** 99,105 ****
  {
    switch (regset)
      {
!     case NTO_REG_GENERAL:	/* QNX has different ordering of GP regs than GDB.  */
        i386nto_supply_gregset (data);
        break;
      case NTO_REG_FLOAT:
--- 106,112 ----
  {
    switch (regset)
      {
!     case NTO_REG_GENERAL:
        i386nto_supply_gregset (data);
        break;
      case NTO_REG_FLOAT:
***************
*** 194,232 ****
    return 0;
  }
  
- static struct link_map_offsets *
- i386nto_svr4_fetch_link_map_offsets (void)
- {
-   static struct link_map_offsets lmo;
-   static struct link_map_offsets *lmp = NULL;
- 
-   if (lmp == NULL)
-     {
-       lmp = &lmo;
- 
-       lmo.r_debug_size = 8;	/* The actual size is 20 bytes, but
- 				   only 8 bytes are used.  */
-       lmo.r_map_offset = 4;
-       lmo.r_map_size = 4;
- 
-       lmo.link_map_size = 20;	/* The actual size is 552 bytes, but
- 				   only 20 bytes are used.  */
-       lmo.l_addr_offset = 0;
-       lmo.l_addr_size = 4;
- 
-       lmo.l_name_offset = 4;
-       lmo.l_name_size = 4;
- 
-       lmo.l_next_offset = 12;
-       lmo.l_next_size = 4;
- 
-       lmo.l_prev_offset = 16;
-       lmo.l_prev_size = 4;
-     }
- 
-   return lmp;
- }
- 
  /* Return whether the frame preceding NEXT_FRAME corresponds to a QNX
     Neutrino sigtramp routine.  */
  
--- 201,206 ----
***************
*** 268,274 ****
    i386_nto_target.register_area = i386nto_register_area;
    i386_nto_target.regset_fill = i386nto_regset_fill;
    i386_nto_target.fetch_link_map_offsets =
!     i386nto_svr4_fetch_link_map_offsets;
  }
  
  static void
--- 242,248 ----
    i386_nto_target.register_area = i386nto_register_area;
    i386_nto_target.regset_fill = i386nto_regset_fill;
    i386_nto_target.fetch_link_map_offsets =
!     svr4_ilp32_fetch_link_map_offsets;
  }
  
  static void
***************
*** 276,281 ****
--- 250,259 ----
  {
    struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
  
+   /* Register core file support.  */
+   set_gdbarch_regset_from_core_section
+     (gdbarch, i386_regset_from_core_section);
+ 
    /* Deal with our strange signals.  */
    nto_initialize_signals ();
  
***************
*** 289,294 ****
--- 267,276 ----
    /* 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;
***************
*** 297,304 ****
    /* Setjmp()'s return PC saved in EDX (5).  */
    tdep->jb_pc_offset = 20;	/* 5x32 bit ints in.  */
  
!   set_solib_svr4_fetch_link_map_offsets (gdbarch,
! 					 i386nto_svr4_fetch_link_map_offsets);
  
    /* Our loader handles solib relocations slightly differently than svr4.  */
    TARGET_SO_RELOCATE_SECTION_ADDRESSES = nto_relocate_section_addresses;
--- 279,286 ----
    /* Setjmp()'s return PC saved in EDX (5).  */
    tdep->jb_pc_offset = 20;	/* 5x32 bit ints in.  */
  
!   set_solib_svr4_fetch_link_map_offsets
!     (gdbarch, svr4_ilp32_fetch_link_map_offsets);
  
    /* Our loader handles solib relocations slightly differently than svr4.  */
    TARGET_SO_RELOCATE_SECTION_ADDRESSES = nto_relocate_section_addresses;
Index: nto-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/nto-tdep.c,v
retrieving revision 1.10
diff -c -r1.10 nto-tdep.c
*** nto-tdep.c	10 Dec 2004 13:38:23 -0000	1.10
--- nto-tdep.c	23 Dec 2004 17:15:14 -0000
***************
*** 66,72 ****
  }
  
  void
! nto_set_target(struct nto_target_ops *targ)
  {
    nto_regset_id = targ->regset_id;
    nto_supply_gregset = targ->supply_gregset;
--- 66,72 ----
  }
  
  void
! nto_set_target (struct nto_target_ops *targ)
  {
    nto_regset_id = targ->regset_id;
    nto_supply_gregset = targ->supply_gregset;
***************
*** 345,385 ****
  nto_elf_osabi_sniffer (bfd *abfd)
  {
    if (nto_is_nto_target)
!       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)
  {
--- 345,354 ----
  nto_elf_osabi_sniffer (bfd *abfd)
  {
    if (nto_is_nto_target)
!     return nto_is_nto_target (abfd);
    return GDB_OSABI_UNKNOWN;
  }
  
  void
  nto_initialize_signals (void)
  {
***************
*** 414,419 ****
  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);
  }
--- 383,386 ----

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]