diff options
-rw-r--r-- | gdb/ChangeLog | 14 | ||||
-rw-r--r-- | gdb/Makefile.in | 5 | ||||
-rw-r--r-- | gdb/mipsnbsd-tdep.c | 185 |
3 files changed, 134 insertions, 70 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 8213459..e4c4ebb 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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. diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 108785c..22e44c7 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -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) \ diff --git a/gdb/mipsnbsd-tdep.c b/gdb/mipsnbsd-tdep.c index 66b86b1..6031286 100644 --- a/gdb/mipsnbsd-tdep.c +++ b/gdb/mipsnbsd-tdep.c @@ -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); } |