* mipsnbsd-tdep.c: Include "regset.h" and "gdb_assert.h".
(MIPS_PC_REGNUM, MIPS_FP0_REGNUM, MIPS_FSR_REGNUM) (MIPSNBSD_NUM_GREGS, MIPSNBSD_NUM_FPREGS): New defines. (fetch_core_registers, fetch_elfcore_registers): Remove functions. (mipsnbsd_core_fns, mipsnbsd_elfcore_fns): Remove variables. (mipsnbsd_core_osabi_sniffer): New function. (mipsnbsd_init_abi): Set regset_from_core_section. (_initialize_mipsnbsd_tdep): Remove calls to deprecated_add_core_fns. (mipsnbsd_supply_fpregset, mipsnbsd_supply_gregset) (mipsnbsd_regset_from_core_section): New functions. (mipsnbsd_gregset, mipsnbsd_fpregset): New variables. * Makefile.in (mipsnbsd-tdep.o): Update dependencies.
This commit is contained in:
parent
ceb41096a8
commit
d1180b0f30
3 changed files with 134 additions and 70 deletions
|
@ -1,5 +1,19 @@
|
|||
2004-10-30 Mark Kettenis <kettenis@gnu.org>
|
||||
|
||||
* mipsnbsd-tdep.c: Include "regset.h" and "gdb_assert.h".
|
||||
(MIPS_PC_REGNUM, MIPS_FP0_REGNUM, MIPS_FSR_REGNUM)
|
||||
(MIPSNBSD_NUM_GREGS, MIPSNBSD_NUM_FPREGS): New defines.
|
||||
(fetch_core_registers, fetch_elfcore_registers): Remove functions.
|
||||
(mipsnbsd_core_fns, mipsnbsd_elfcore_fns): Remove variables.
|
||||
(mipsnbsd_core_osabi_sniffer): New function.
|
||||
(mipsnbsd_init_abi): Set regset_from_core_section.
|
||||
(_initialize_mipsnbsd_tdep): Remove calls to
|
||||
deprecated_add_core_fns.
|
||||
(mipsnbsd_supply_fpregset, mipsnbsd_supply_gregset)
|
||||
(mipsnbsd_regset_from_core_section): New functions.
|
||||
(mipsnbsd_gregset, mipsnbsd_fpregset): New variables.
|
||||
* Makefile.in (mipsnbsd-tdep.o): Update dependencies.
|
||||
|
||||
* procfs.c (procfs_fetch_registers, procfs_store_registers): Like
|
||||
Remove optimization for DEPRECATED_FP_REGNUM.
|
||||
|
||||
|
|
|
@ -2246,8 +2246,9 @@ mips-mdebug-tdep.o: mips-mdebug-tdep.c $(defs_h) $(frame_h) $(mips_tdep_h) \
|
|||
mipsnbsd-nat.o: mipsnbsd-nat.c $(defs_h) $(inferior_h) $(regcache_h) \
|
||||
$(mips_tdep_h) $(mipsnbsd_tdep_h)
|
||||
mipsnbsd-tdep.o: mipsnbsd-tdep.c $(defs_h) $(gdbcore_h) $(regcache_h) \
|
||||
$(target_h) $(value_h) $(osabi_h) $(gdb_string_h) $(nbsd_tdep_h) \
|
||||
$(mipsnbsd_tdep_h) $(mips_tdep_h) $(solib_svr4_h)
|
||||
$(regset_h) $(target_h) $(value_h) $(osabi_h) $(gdb_assert_h) \
|
||||
$(gdb_string_h) $(nbsd_tdep_h) $(mipsnbsd_tdep_h) $(mips_tdep_h) \
|
||||
$(solib_svr4_h)
|
||||
mipsread.o: mipsread.c $(defs_h) $(gdb_string_h) $(bfd_h) $(symtab_h) \
|
||||
$(objfiles_h) $(buildsym_h) $(stabsread_h) $(coff_sym_h) \
|
||||
$(coff_internal_h) $(coff_ecoff_h) $(libcoff_h) $(libecoff_h) \
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Target-dependent code for MIPS systems running NetBSD.
|
||||
/* Target-dependent code for NetBSD/mips.
|
||||
|
||||
Copyright 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||
Contributed by Wasabi Systems, Inc.
|
||||
|
||||
|
@ -22,10 +23,12 @@
|
|||
#include "defs.h"
|
||||
#include "gdbcore.h"
|
||||
#include "regcache.h"
|
||||
#include "regset.h"
|
||||
#include "target.h"
|
||||
#include "value.h"
|
||||
#include "osabi.h"
|
||||
|
||||
#include "gdb_assert.h"
|
||||
#include "gdb_string.h"
|
||||
|
||||
#include "nbsd-tdep.h"
|
||||
|
@ -34,6 +37,106 @@
|
|||
|
||||
#include "solib-svr4.h"
|
||||
|
||||
/* Shorthand for some register numbers used below. */
|
||||
#define MIPS_PC_REGNUM MIPS_EMBED_PC_REGNUM
|
||||
#define MIPS_FP0_REGNUM MIPS_EMBED_FP0_REGNUM
|
||||
#define MIPS_FSR_REGNUM MIPS_EMBED_FP0_REGNUM + 32
|
||||
|
||||
/* Core file support. */
|
||||
|
||||
/* Number of registers in `struct reg' from <machine/reg.h>. */
|
||||
#define MIPSNBSD_NUM_GREGS 38
|
||||
|
||||
/* Number of registers in `struct fpreg' from <machine/reg.h>. */
|
||||
#define MIPSNBSD_NUM_FPREGS 33
|
||||
|
||||
/* Supply register REGNUM from the buffer specified by FPREGS and LEN
|
||||
in the floating-point register set REGSET to register cache
|
||||
REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
|
||||
|
||||
static void
|
||||
mipsnbsd_supply_fpregset (const struct regset *regset,
|
||||
struct regcache *regcache,
|
||||
int regnum, const void *fpregs, size_t len)
|
||||
{
|
||||
size_t regsize = mips_isa_regsize (get_regcache_arch (regcache));
|
||||
const char *regs = fpregs;
|
||||
int i;
|
||||
|
||||
gdb_assert (len >= MIPSNBSD_NUM_FPREGS * regsize);
|
||||
|
||||
for (i = MIPS_FP0_REGNUM; i <= MIPS_FSR_REGNUM; i++)
|
||||
{
|
||||
if (regnum == i || regnum == -1)
|
||||
regcache_raw_supply (regcache, i,
|
||||
regs + (i - MIPS_FP0_REGNUM) * regsize);
|
||||
}
|
||||
}
|
||||
|
||||
/* Supply register REGNUM from the buffer specified by GREGS and LEN
|
||||
in the general-purpose register set REGSET to register cache
|
||||
REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
|
||||
|
||||
static void
|
||||
mipsnbsd_supply_gregset (const struct regset *regset,
|
||||
struct regcache *regcache, int regnum,
|
||||
const void *gregs, size_t len)
|
||||
{
|
||||
size_t regsize = mips_isa_regsize (get_regcache_arch (regcache));
|
||||
const char *regs = gregs;
|
||||
int i;
|
||||
|
||||
gdb_assert (len >= MIPSNBSD_NUM_GREGS * regsize);
|
||||
|
||||
for (i = 0; i <= MIPS_PC_REGNUM; i++)
|
||||
{
|
||||
if (regnum == i || regnum == -1)
|
||||
regcache_raw_supply (regcache, i, regs + i * regsize);
|
||||
}
|
||||
|
||||
if (len >= (MIPSNBSD_NUM_GREGS + MIPSNBSD_NUM_FPREGS) * regsize)
|
||||
{
|
||||
regs += MIPSNBSD_NUM_GREGS * regsize;
|
||||
len -= MIPSNBSD_NUM_GREGS * regsize;
|
||||
mipsnbsd_supply_fpregset (regset, regcache, regnum, regs, len);
|
||||
}
|
||||
}
|
||||
|
||||
/* NetBSD/mips register sets. */
|
||||
|
||||
static struct regset mipsnbsd_gregset =
|
||||
{
|
||||
NULL,
|
||||
mipsnbsd_supply_gregset
|
||||
};
|
||||
|
||||
static struct regset mipsnbsd_fpregset =
|
||||
{
|
||||
NULL,
|
||||
mipsnbsd_supply_fpregset
|
||||
};
|
||||
|
||||
/* Return the appropriate register set for the core section identified
|
||||
by SECT_NAME and SECT_SIZE. */
|
||||
|
||||
static const struct regset *
|
||||
mipsnbsd_regset_from_core_section (struct gdbarch *gdbarch,
|
||||
const char *sect_name, size_t sect_size)
|
||||
{
|
||||
size_t regsize = mips_isa_regsize (gdbarch);
|
||||
|
||||
if (strcmp (sect_name, ".reg") == 0
|
||||
&& sect_size >= MIPSNBSD_NUM_GREGS * regsize)
|
||||
return &mipsnbsd_gregset;
|
||||
|
||||
if (strcmp (sect_name, ".reg2") == 0
|
||||
&& sect_size >= MIPSNBSD_NUM_FPREGS * regsize)
|
||||
return &mipsnbsd_fpregset;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/* Conveniently, GDB uses the same register numbering as the
|
||||
ptrace register structure used by NetBSD/mips. */
|
||||
|
||||
|
@ -98,70 +201,6 @@ mipsnbsd_fill_fpreg (char *fpregs, int regno)
|
|||
fpregs + ((i - FP0_REGNUM) * mips_isa_regsize (current_gdbarch)));
|
||||
}
|
||||
|
||||
static void
|
||||
fetch_core_registers (char *core_reg_sect, unsigned core_reg_size, int which,
|
||||
CORE_ADDR ignore)
|
||||
{
|
||||
char *regs, *fpregs;
|
||||
|
||||
/* We get everything from one section. */
|
||||
if (which != 0)
|
||||
return;
|
||||
|
||||
regs = core_reg_sect;
|
||||
fpregs = core_reg_sect + SIZEOF_STRUCT_REG;
|
||||
|
||||
/* Integer registers. */
|
||||
mipsnbsd_supply_reg (regs, -1);
|
||||
|
||||
/* Floating point registers. */
|
||||
mipsnbsd_supply_fpreg (fpregs, -1);
|
||||
}
|
||||
|
||||
static void
|
||||
fetch_elfcore_registers (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
|
||||
mipsnbsd_supply_reg (core_reg_sect, -1);
|
||||
break;
|
||||
|
||||
case 2: /* Floating point registers. */
|
||||
if (core_reg_size != SIZEOF_STRUCT_FPREG)
|
||||
warning ("Wrong size register set in core file.");
|
||||
else
|
||||
mipsnbsd_supply_fpreg (core_reg_sect, -1);
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Don't know what kind of register request this is; just ignore it. */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static struct core_fns mipsnbsd_core_fns =
|
||||
{
|
||||
bfd_target_unknown_flavour, /* core_flavour */
|
||||
default_check_format, /* check_format */
|
||||
default_core_sniffer, /* core_sniffer */
|
||||
fetch_core_registers, /* core_read_registers */
|
||||
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 */
|
||||
};
|
||||
|
||||
/* Under NetBSD/mips, signal handler invocations can be identified by the
|
||||
designated code sequence that is used to return from a signal handler.
|
||||
In particular, the return address of a signal handler points to the
|
||||
|
@ -345,6 +384,9 @@ static void
|
|||
mipsnbsd_init_abi (struct gdbarch_info info,
|
||||
struct gdbarch *gdbarch)
|
||||
{
|
||||
set_gdbarch_regset_from_core_section
|
||||
(gdbarch, mipsnbsd_regset_from_core_section);
|
||||
|
||||
set_gdbarch_get_longjmp_target (gdbarch, mipsnbsd_get_longjmp_target);
|
||||
|
||||
set_gdbarch_cannot_fetch_register (gdbarch, mipsnbsd_cannot_fetch_register);
|
||||
|
@ -357,13 +399,20 @@ mipsnbsd_init_abi (struct gdbarch_info info,
|
|||
mipsnbsd_ilp32_solib_svr4_fetch_link_map_offsets :
|
||||
mipsnbsd_lp64_solib_svr4_fetch_link_map_offsets);
|
||||
}
|
||||
|
||||
|
||||
static enum gdb_osabi
|
||||
mipsnbsd_core_osabi_sniffer (bfd *abfd)
|
||||
{
|
||||
if (strcmp (bfd_get_target (abfd), "netbsd-core") == 0)
|
||||
return GDB_OSABI_NETBSD_ELF;
|
||||
|
||||
return GDB_OSABI_UNKNOWN;
|
||||
}
|
||||
|
||||
void
|
||||
_initialize_mipsnbsd_tdep (void)
|
||||
{
|
||||
gdbarch_register_osabi (bfd_arch_mips, 0, GDB_OSABI_NETBSD_ELF,
|
||||
mipsnbsd_init_abi);
|
||||
|
||||
deprecated_add_core_fns (&mipsnbsd_core_fns);
|
||||
deprecated_add_core_fns (&mipsnbsd_elfcore_fns);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue