* 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:
Mark Kettenis 2004-10-30 21:40:48 +00:00
parent ceb41096a8
commit d1180b0f30
3 changed files with 134 additions and 70 deletions

View File

@ -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.

View File

@ -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) \

View File

@ -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);
}