diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 53a2881473..525827ad99 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,24 @@ +2007-03-02 Mark Kettenis + + * shnbsd-tdep.c: Include "regset.h", "gdb_assert.h" and + "gdb_string.h". Don't include "nbsd-tdep.h". + (SIZEOF_STRUCT_REG): Remove. + (SHNBSD_SIZEOF_GREGS): New. + (shnbsd_supply_gregset, shnbsd_collect_gregset) + (shnbsd_regset_from_core_section): New functions. + (fetch_core_registers, fetch_elfcore_registers): Remove functions. + (shnbsd_supply_reg, shnbsd_fill_reg): Simply call + shnbsd_supply_gregset, shnbsd_collect_gregset. + (shnbsd_gregset): New variable. + (shnbsd_init_abi): Set regset_from_core_section. + (GDB_OSABI_NETBSD_CORE): New define. + (shnbsd_core_osabi_sniffer): New function. + (_initialize_shnbsd_tdep): Register shnbsd_core_osabi_sniffer. + * Makefile.in (shnbsd-tdep.o): Update dependencies. + * config/sh/nbsd.mt (TDEPFILES): Add corelow.o, remove + nbsd-tdep.o. + * config/sh/obsd.mt (TDEPFILES): Remove nbsd-tdep.o. + 2007-02-28 Joel Brobecker * gdbtypes.c (replace_type): Fix typo that caused us to not update diff --git a/gdb/Makefile.in b/gdb/Makefile.in index cfc805f22a..041f2ebefa 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -2633,9 +2633,9 @@ sh64-tdep.o: sh64-tdep.c $(defs_h) $(frame_h) $(frame_base_h) \ $(osabi_h) $(elf_bfd_h) $(elf_sh_h) $(gdb_sim_sh_h) shnbsd-nat.o: shnbsd-nat.c $(defs_h) $(inferior_h) $(sh_tdep_h) \ $(shnbsd_tdep_h) $(inf_ptrace_h) -shnbsd-tdep.o: shnbsd-tdep.c $(defs_h) $(gdbcore_h) $(regcache_h) $(value_h) \ - $(osabi_h) $(solib_svr4_h) $(nbsd_tdep_h) $(sh_tdep_h) \ - $(shnbsd_tdep_h) +shnbsd-tdep.o: shnbsd-tdep.c $(defs_h) $(gdbcore_h) $(regcache_h) $(regset_h) \ + $(value_h) $(osabi_h) $(gdb_assert_h) $(gdb_string_h) $(sh_tdep_h) \ + $(shnbsd_tdep_h) $(solib_svr4_h) sh-stub.o: sh-stub.c sh-linux-tdep.o: sh-linux-tdep.c $(defs_h) $(osabi_h) $(solib_svr4_h) \ $(symtab_h) diff --git a/gdb/config/sh/nbsd.mt b/gdb/config/sh/nbsd.mt index fee04d53ed..1d1de038fe 100644 --- a/gdb/config/sh/nbsd.mt +++ b/gdb/config/sh/nbsd.mt @@ -1,5 +1,6 @@ -# Target: SuperH running NetBSD -TDEPFILES= sh-tdep.o shnbsd-tdep.o corelow.o nbsd-tdep.o solib.o solib-svr4.o +# Target: NetBSD/sh +TDEPFILES= sh-tdep.o shnbsd-tdep.o \ + corelow.o solib.o solib-svr4.o DEPRECATED_TM_FILE= tm-sh.h SIM_OBS = remote-sim.o diff --git a/gdb/config/sh/obsd.mt b/gdb/config/sh/obsd.mt index 4909f867e2..a61bba90b8 100644 --- a/gdb/config/sh/obsd.mt +++ b/gdb/config/sh/obsd.mt @@ -1,3 +1,3 @@ # Target: OpenBSD/sh -TDEPFILES= sh-tdep.o sh64-tdep.o shnbsd-tdep.o nbsd-tdep.o \ +TDEPFILES= sh-tdep.o sh64-tdep.o shnbsd-tdep.o \ corelow.o solib.o solib-svr4.o diff --git a/gdb/shnbsd-tdep.c b/gdb/shnbsd-tdep.c index 2cba6dcf34..da2431d732 100644 --- a/gdb/shnbsd-tdep.c +++ b/gdb/shnbsd-tdep.c @@ -24,14 +24,16 @@ #include "defs.h" #include "gdbcore.h" #include "regcache.h" +#include "regset.h" #include "value.h" #include "osabi.h" -#include "solib-svr4.h" +#include "gdb_assert.h" +#include "gdb_string.h" -#include "nbsd-tdep.h" #include "sh-tdep.h" #include "shnbsd-tdep.h" +#include "solib-svr4.h" /* Convert an r0-r15 register number into an offset into a ptrace register structure. */ @@ -55,134 +57,150 @@ static const int regmap[] = ( 5 * 4), /* r15 */ }; -#define SIZEOF_STRUCT_REG (21 * 4) +/* Sizeof `struct reg' in . */ +#define SHNBSD_SIZEOF_GREGS (21 * 4) -void -shnbsd_supply_reg (char *regs, int regno) +/* 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 +shnbsd_supply_gregset (const struct regset *regset, + struct regcache *regcache, + int regnum, const void *gregs, size_t len) { + const gdb_byte *regs = gregs; int i; - if (regno == PC_REGNUM || regno == -1) - regcache_raw_supply (current_regcache, PC_REGNUM, regs + (0 * 4)); + gdb_assert (len >= SHNBSD_SIZEOF_GREGS); - if (regno == SR_REGNUM || regno == -1) - regcache_raw_supply (current_regcache, SR_REGNUM, regs + (1 * 4)); + if (regnum == PC_REGNUM || regnum == -1) + regcache_raw_supply (regcache, PC_REGNUM, regs + (0 * 4)); - if (regno == PR_REGNUM || regno == -1) - regcache_raw_supply (current_regcache, PR_REGNUM, regs + (2 * 4)); + if (regnum == SR_REGNUM || regnum == -1) + regcache_raw_supply (regcache, SR_REGNUM, regs + (1 * 4)); - if (regno == MACH_REGNUM || regno == -1) - regcache_raw_supply (current_regcache, MACH_REGNUM, regs + (3 * 4)); + if (regnum == PR_REGNUM || regnum == -1) + regcache_raw_supply (regcache, PR_REGNUM, regs + (2 * 4)); - if (regno == MACL_REGNUM || regno == -1) - regcache_raw_supply (current_regcache, MACL_REGNUM, regs + (4 * 4)); + if (regnum == MACH_REGNUM || regnum == -1) + regcache_raw_supply (regcache, MACH_REGNUM, regs + (3 * 4)); - if ((regno >= R0_REGNUM && regno <= (R0_REGNUM + 15)) || regno == -1) + if (regnum == MACL_REGNUM || regnum == -1) + regcache_raw_supply (regcache, MACL_REGNUM, regs + (4 * 4)); + + for (i = R0_REGNUM; i <= (R0_REGNUM + 15); i++) { - for (i = R0_REGNUM; i <= (R0_REGNUM + 15); i++) - if (regno == i || regno == -1) - regcache_raw_supply (current_regcache, i, - regs + regmap[i - R0_REGNUM]); + if (regnum == i || regnum == -1) + regcache_raw_supply (regcache, i, regs + regmap[i - R0_REGNUM]); } } +/* Collect register REGNUM in the general-purpose register set + REGSET. from register cache REGCACHE into the buffer specified by + GREGS and LEN. If REGNUM is -1, do this for all registers in + REGSET. */ + +static void +shnbsd_collect_gregset (const struct regset *regset, + const struct regcache *regcache, + int regnum, void *gregs, size_t len) +{ + gdb_byte *regs = gregs; + int i; + + gdb_assert (len >= SHNBSD_SIZEOF_GREGS); + + if (regnum == PC_REGNUM || regnum == -1) + regcache_raw_collect (regcache, PC_REGNUM, regs + (0 * 4)); + + if (regnum == SR_REGNUM || regnum == -1) + regcache_raw_collect (regcache, SR_REGNUM, regs + (1 * 4)); + + if (regnum == PR_REGNUM || regnum == -1) + regcache_raw_collect (regcache, PR_REGNUM, regs + (2 * 4)); + + if (regnum == MACH_REGNUM || regnum == -1) + regcache_raw_collect (regcache, MACH_REGNUM, regs + (3 * 4)); + + if (regnum == MACL_REGNUM || regnum == -1) + regcache_raw_collect (regcache, MACL_REGNUM, regs + (4 * 4)); + + for (i = R0_REGNUM; i <= (R0_REGNUM + 15); i++) + { + if (regnum == i || regnum == -1) + regcache_raw_collect (regcache, i, regs + regmap[i - R0_REGNUM]); + } +} + +/* SH register sets. */ + +static struct regset shnbsd_gregset = +{ + NULL, + shnbsd_supply_gregset, + shnbsd_collect_gregset +}; + +/* Return the appropriate register set for the core section identified + by SECT_NAME and SECT_SIZE. */ + +const struct regset * +shnbsd_regset_from_core_section (struct gdbarch *gdbarch, + const char *sect_name, size_t sect_size) +{ + if (strcmp (sect_name, ".reg") == 0 && sect_size >= SHNBSD_SIZEOF_GREGS) + return &shnbsd_gregset; + + return NULL; +} + void -shnbsd_fill_reg (char *regs, int regno) +shnbsd_supply_reg (char *regs, int regnum) { - int i; - - if (regno == PC_REGNUM || regno == -1) - regcache_raw_collect (current_regcache, PC_REGNUM, regs + (0 * 4)); - - if (regno == SR_REGNUM || regno == -1) - regcache_raw_collect (current_regcache, SR_REGNUM, regs + (1 * 4)); - - if (regno == PR_REGNUM || regno == -1) - regcache_raw_collect (current_regcache, PR_REGNUM, regs + (2 * 4)); - - if (regno == MACH_REGNUM || regno == -1) - regcache_raw_collect (current_regcache, MACH_REGNUM, regs + (3 * 4)); - - if (regno == MACL_REGNUM || regno == -1) - regcache_raw_collect (current_regcache, MACL_REGNUM, regs + (4 * 4)); - - if ((regno >= R0_REGNUM && regno <= (R0_REGNUM + 15)) || regno == -1) - { - for (i = R0_REGNUM; i <= (R0_REGNUM + 15); i++) - if (regno == i || regno == -1) - regcache_raw_collect (current_regcache, i, - regs + regmap[i - R0_REGNUM]); - } + shnbsd_supply_gregset (&shnbsd_gregset, current_regcache, regnum, + regs, SHNBSD_SIZEOF_GREGS); } -static void -fetch_core_registers (char *core_reg_sect, unsigned core_reg_size, - int which, CORE_ADDR ignore) +void +shnbsd_fill_reg (char *regs, int regnum) { - /* We get everything from the .reg section. */ - if (which != 0) - return; - - if (core_reg_size < SIZEOF_STRUCT_REG) - { - warning (_("Wrong size register set in core file.")); - return; - } - - /* Integer registers. */ - shnbsd_supply_reg (core_reg_sect, -1); + shnbsd_collect_gregset (&shnbsd_gregset, current_regcache, regnum, + regs, SHNBSD_SIZEOF_GREGS); } - -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 - shnbsd_supply_reg (core_reg_sect, -1); - break; - - default: - /* Don't know what kind of register request this is; just ignore it. */ - break; - } -} - -static struct core_fns shnbsd_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 shnbsd_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 */ -}; + static void shnbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { - set_solib_svr4_fetch_link_map_offsets (gdbarch, - nbsd_ilp32_solib_svr4_fetch_link_map_offsets); + set_gdbarch_regset_from_core_section + (gdbarch, shnbsd_regset_from_core_section); + + set_solib_svr4_fetch_link_map_offsets + (gdbarch, svr4_ilp32_fetch_link_map_offsets); +} + + +/* OpenBSD uses uses the traditional NetBSD core file format, even for + ports that use ELF. */ +#define GDB_OSABI_NETBSD_CORE GDB_OSABI_OPENBSD_ELF + +static enum gdb_osabi +shnbsd_core_osabi_sniffer (bfd *abfd) +{ + if (strcmp (bfd_get_target (abfd), "netbsd-core") == 0) + return GDB_OSABI_NETBSD_CORE; + + return GDB_OSABI_UNKNOWN; } void _initialize_shnbsd_tdep (void) { - deprecated_add_core_fns (&shnbsd_core_fns); - deprecated_add_core_fns (&shnbsd_elfcore_fns); + /* BFD doesn't set a flavour for NetBSD style a.out core files. */ + gdbarch_register_osabi_sniffer (bfd_arch_sh, bfd_target_unknown_flavour, + shnbsd_core_osabi_sniffer); gdbarch_register_osabi (bfd_arch_sh, 0, GDB_OSABI_NETBSD_ELF, shnbsd_init_abi);