X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Falphanbsd-tdep.c;h=1f814121d9ec15b13daf1871fba1071321ca3cbc;hb=197e01b6dcd118b70ed3621b62b2ff3fa929d50f;hp=ba705aa4015162329a23df9e6a571eb374cad2f9;hpb=70f80edf7ccd4c18977394be8b91c852e119b7e3;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/alphanbsd-tdep.c b/gdb/alphanbsd-tdep.c index ba705aa401..1f814121d9 100644 --- a/gdb/alphanbsd-tdep.c +++ b/gdb/alphanbsd-tdep.c @@ -1,5 +1,6 @@ /* Target-dependent code for NetBSD/Alpha. - Copyright 2002 Free Software Foundation, Inc. + + Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. Contributed by Wasabi Systems, Inc. This file is part of GDB. @@ -16,17 +17,22 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "defs.h" #include "gdbcore.h" +#include "frame.h" #include "regcache.h" #include "value.h" +#include "osabi.h" + +#include "gdb_string.h" #include "alpha-tdep.h" #include "alphabsd-tdep.h" #include "nbsd-tdep.h" +#include "solib-svr4.h" static void fetch_core_registers (char *core_reg_sect, unsigned core_reg_size, int which, @@ -58,16 +64,15 @@ fetch_core_registers (char *core_reg_sect, unsigned core_reg_size, int which, if (core_reg_size < (SIZEOF_TRAPFRAME + SIZEOF_STRUCT_FPREG)) { - warning ("Wrong size register set in core file."); + warning (_("Wrong size register set in core file.")); return; } /* Integer registers. */ for (regno = 0; regno < ALPHA_ZERO_REGNUM; regno++) - supply_register (regno, regs + (regmap[regno] * 8)); - supply_register (ALPHA_ZERO_REGNUM, NULL); - supply_register (FP_REGNUM, NULL); - supply_register (PC_REGNUM, regs + (28 * 8)); + regcache_raw_supply (current_regcache, regno, regs + (regmap[regno] * 8)); + regcache_raw_supply (current_regcache, ALPHA_ZERO_REGNUM, NULL); + regcache_raw_supply (current_regcache, PC_REGNUM, regs + (28 * 8)); /* Floating point registers. */ alphabsd_supply_fpreg (fpregs, -1); @@ -81,14 +86,14 @@ fetch_elfcore_registers (char *core_reg_sect, unsigned core_reg_size, int which, { case 0: /* Integer registers. */ if (core_reg_size != SIZEOF_STRUCT_REG) - warning ("Wrong size register set in core file."); + warning (_("Wrong size register set in core file.")); else alphabsd_supply_reg (core_reg_sect, -1); break; case 2: /* Floating point registers. */ if (core_reg_size != SIZEOF_STRUCT_FPREG) - warning ("Wrong size FP register set in core file."); + warning (_("Wrong size FP register set in core file.")); else alphabsd_supply_fpreg (core_reg_sect, -1); break; @@ -133,29 +138,29 @@ static struct core_fns alphanbsd_elfcore_fns = sequence and can then check whether we really are executing in the signal trampoline. If not, -1 is returned, otherwise the offset from the start of the return sequence is returned. */ -static const unsigned int sigtramp_retcode[] = +static const unsigned char sigtramp_retcode[] = { - 0xa61e0000, /* ldq a0, 0(sp) */ - 0x23de0010, /* lda sp, 16(sp) */ - 0x201f0127, /* lda v0, 295(zero) */ - 0x00000083, /* call_pal callsys */ + 0x00, 0x00, 0x1e, 0xa6, /* ldq a0, 0(sp) */ + 0x10, 0x00, 0xde, 0x23, /* lda sp, 16(sp) */ + 0x27, 0x01, 0x1f, 0x20, /* lda v0, 295(zero) */ + 0x83, 0x00, 0x00, 0x00, /* call_pal callsys */ }; -#define RETCODE_NWORDS \ - (sizeof (sigtramp_retcode) / sizeof (sigtramp_retcode[0])) +#define RETCODE_NWORDS 4 +#define RETCODE_SIZE (RETCODE_NWORDS * 4) LONGEST alphanbsd_sigtramp_offset (CORE_ADDR pc) { - unsigned int ret[4], w; + unsigned char ret[RETCODE_SIZE], w[4]; LONGEST off; int i; - if (read_memory_nobpt (pc, (char *) &w, 4) != 0) + if (deprecated_read_memory_nobpt (pc, (char *) w, 4) != 0) return -1; for (i = 0; i < RETCODE_NWORDS; i++) { - if (w == sigtramp_retcode[i]) + if (memcmp (w, sigtramp_retcode + (i * 4), 4) == 0) break; } if (i == RETCODE_NWORDS) @@ -164,10 +169,10 @@ alphanbsd_sigtramp_offset (CORE_ADDR pc) off = i * 4; pc -= off; - if (read_memory_nobpt (pc, (char *) ret, sizeof (ret)) != 0) + if (deprecated_read_memory_nobpt (pc, (char *) ret, sizeof (ret)) != 0) return -1; - if (memcmp (ret, sigtramp_retcode, sizeof (sigtramp_retcode)) == 0) + if (memcmp (ret, sigtramp_retcode, RETCODE_SIZE) == 0) return off; return -1; @@ -176,7 +181,17 @@ alphanbsd_sigtramp_offset (CORE_ADDR pc) static int alphanbsd_pc_in_sigtramp (CORE_ADDR pc, char *func_name) { - return (alphanbsd_sigtramp_offset (pc) >= 0); + return (nbsd_pc_in_sigtramp (pc, func_name) + || alphanbsd_sigtramp_offset (pc) >= 0); +} + +static CORE_ADDR +alphanbsd_sigcontext_addr (struct frame_info *frame) +{ + /* FIXME: This is not correct for all versions of NetBSD/alpha. + We will probably need to disassemble the trampoline to figure + out which trampoline frame type we have. */ + return get_frame_base (frame); } static void @@ -185,7 +200,11 @@ alphanbsd_init_abi (struct gdbarch_info info, { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); - set_gdbarch_pc_in_sigtramp (gdbarch, alphanbsd_pc_in_sigtramp); + /* Hook into the DWARF CFI frame unwinder. */ + alpha_dwarf2_init_abi (info, gdbarch); + + /* Hook into the MDEBUG frame unwinder. */ + alpha_mdebug_init_abi (info, gdbarch); /* NetBSD/alpha does not provide single step support via ptrace(2); we must use software single-stepping. */ @@ -195,6 +214,8 @@ alphanbsd_init_abi (struct gdbarch_info info, nbsd_lp64_solib_svr4_fetch_link_map_offsets); tdep->dynamic_sigtramp_offset = alphanbsd_sigtramp_offset; + tdep->pc_in_sigtramp = alphanbsd_pc_in_sigtramp; + tdep->sigcontext_addr = alphanbsd_sigcontext_addr; tdep->jb_pc = 2; tdep->jb_elt_size = 8; @@ -203,9 +224,11 @@ alphanbsd_init_abi (struct gdbarch_info info, void _initialize_alphanbsd_tdep (void) { - gdbarch_register_osabi (bfd_arch_alpha, GDB_OSABI_NETBSD_ELF, + gdbarch_register_osabi (bfd_arch_alpha, 0, GDB_OSABI_NETBSD_ELF, + alphanbsd_init_abi); + gdbarch_register_osabi (bfd_arch_alpha, 0, GDB_OSABI_OPENBSD_ELF, alphanbsd_init_abi); - add_core_fns (&alphanbsd_core_fns); - add_core_fns (&alphanbsd_elfcore_fns); + deprecated_add_core_fns (&alphanbsd_core_fns); + deprecated_add_core_fns (&alphanbsd_elfcore_fns); }