This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: [patch] remove deprecated core support from QNX NTO
- From: Kris Warkentin <kewarken at qnx dot com>
- To: "M.M. Kettenis" <m dot m dot kettenis at alumnus dot utwente dot nl>
- Cc: gdb-patches at sources dot redhat dot com
- Date: Thu, 23 Dec 2004 12:19:19 -0500
- Subject: Re: [patch] remove deprecated core support from QNX NTO
- References: <41CAF4EC.3040804@qnx.com>
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 *) ®set, core_reg_sect,
- min (core_reg_size, sizeof (regset)));
- nto_supply_gregset ((char *) ®set);
- }
- else if (which == 2)
- {
- memcpy ((char *) ®set, core_reg_sect,
- min (core_reg_size, sizeof (regset)));
- nto_supply_fpregset ((char *) ®set);
- }
- }
-
- /* 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 (®set_core_fns);
}
--- 383,386 ----