Re: [COMMIT] Remove deprecated core support from QNX

Kris Warkentin
2005-01-06T18:18:18Z

Sorry about the late reply Mark, I was away for a bit over the
holidays. Thanks for committing that all in. Works great. Question
though. I noticed that you left off this part:

> /* Register core file support. */
> set_gdbarch_regset_from_core_section
> (gdbarch, i386_regset_from_core_section);

I'm assuming the corefile support now just uses the normal target regset
supply functions?

cheers,

Kris

Mark Kettenis wrote:

>Kris,
>
>I tweaked i386nto_supply_gregset a bit more, but I'm fairly confident
>this will work just as well. Guess you didn't supply the collect
>function since there was no prototype. Would be good if you tested
>this again soon though.
>
>Mark
>
>2004-12-24 Kris Warkentin <kewarken@qnx.com>
> Mark Kettenis <kettenis@gnu.org>
>
> * i386-tdep.h (i386_collect_gregset): New prototype.
> * 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.
>
>Index: i386-tdep.h
>===================================================================
>RCS file: /cvs/src/src/gdb/i386-tdep.h,v
>retrieving revision 1.41
>diff -u -p -r1.41 i386-tdep.h
>--- i386-tdep.h 8 Sep 2004 14:46:08 -0000 1.41
>+++ i386-tdep.h 24 Dec 2004 14:42:01 -0000
>@@ -166,6 +166,14 @@ extern void i386_supply_gregset (const s
> 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: i386-nto-tdep.c
>===================================================================
>RCS file: /cvs/src/src/gdb/i386-nto-tdep.c,v
>retrieving revision 1.17
>diff -u -p -r1.17 i386-nto-tdep.c
>--- i386-nto-tdep.c 23 Dec 2004 22:34:23 -0000 1.17
>+++ i386-nto-tdep.c 24 Dec 2004 14:42:01 -0000
>@@ -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
>@@ -44,47 +47,51 @@
> 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
> {
> 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 in
> /* 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: nto-tdep.c
>===================================================================
>RCS file: /cvs/src/src/gdb/nto-tdep.c,v
>retrieving revision 1.10
>diff -u -p -r1.10 nto-tdep.c
>--- nto-tdep.c 10 Dec 2004 13:38:23 -0000 1.10
>+++ nto-tdep.c 24 Dec 2004 14:42:01 -0000
>@@ -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 i
> 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);
> }
>
>