aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/i386-nto-tdep.c73
-rw-r--r--gdb/i386-tdep.h8
-rw-r--r--gdb/nto-tdep.c37
3 files changed, 52 insertions, 66 deletions
diff --git a/gdb/i386-nto-tdep.c b/gdb/i386-nto-tdep.c
index ad9cfe5..744b8c9 100644
--- a/gdb/i386-nto-tdep.c
+++ b/gdb/i386-nto-tdep.c
@@ -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 *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;
diff --git a/gdb/i386-tdep.h b/gdb/i386-tdep.h
index 29f2f27..8e51a3a 100644
--- a/gdb/i386-tdep.h
+++ b/gdb/i386-tdep.h
@@ -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 *
diff --git a/gdb/nto-tdep.c b/gdb/nto-tdep.c
index b882a22..7cc1218 100644
--- a/gdb/nto-tdep.c
+++ b/gdb/nto-tdep.c
@@ -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);
}