diff options
author | Mark Kettenis <kettenis@gnu.org> | 2004-10-30 21:40:48 +0000 |
---|---|---|
committer | Mark Kettenis <kettenis@gnu.org> | 2004-10-30 21:40:48 +0000 |
commit | d1180b0f305684a9ee6fcf1e362f61df20bdae75 (patch) | |
tree | 4c0df5787ade7e36a844d0dd4fac903ccfaa3145 /gdb/mipsnbsd-tdep.c | |
parent | ceb41096a895f6f4cf08f9d9d5cb05fb6ab01be6 (diff) | |
download | gdb-d1180b0f305684a9ee6fcf1e362f61df20bdae75.zip gdb-d1180b0f305684a9ee6fcf1e362f61df20bdae75.tar.gz gdb-d1180b0f305684a9ee6fcf1e362f61df20bdae75.tar.bz2 |
* 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.
Diffstat (limited to 'gdb/mipsnbsd-tdep.c')
-rw-r--r-- | gdb/mipsnbsd-tdep.c | 185 |
1 files changed, 117 insertions, 68 deletions
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); } |