X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fmipsnbsd-tdep.c;h=e690322f16aa62c58e01bd1ddd1f66bf3e20fa51;hb=4ee62156d969867d3d3ffedf656a74643f77279e;hp=5008211ad6e795200e8c4868f28cb79628c63c50;hpb=60ade65d49ec4fd35e72823c786daf5043efca0a;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/mipsnbsd-tdep.c b/gdb/mipsnbsd-tdep.c index 5008211ad6..e690322f16 100644 --- a/gdb/mipsnbsd-tdep.c +++ b/gdb/mipsnbsd-tdep.c @@ -1,6 +1,7 @@ /* Target-dependent code for NetBSD/mips. - Copyright (C) 2002, 2003, 2004, 2006, 2007 Free Software Foundation, Inc. + Copyright (C) 2002, 2003, 2004, 2006, 2007, 2008, 2009 + Free Software Foundation, Inc. Contributed by Wasabi Systems, Inc. @@ -8,7 +9,7 @@ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -17,9 +18,7 @@ GNU General Public License for more details. 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., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ + along with this program. If not, see . */ #include "defs.h" #include "gdbcore.h" @@ -144,17 +143,18 @@ mipsnbsd_regset_from_core_section (struct gdbarch *gdbarch, void mipsnbsd_supply_reg (struct regcache *regcache, const char *regs, int regno) { + struct gdbarch *gdbarch = get_regcache_arch (regcache); int i; - for (i = 0; i <= PC_REGNUM; i++) + for (i = 0; i <= gdbarch_pc_regnum (gdbarch); i++) { if (regno == i || regno == -1) { - if (gdbarch_cannot_fetch_register (current_gdbarch, i)) + if (gdbarch_cannot_fetch_register (gdbarch, i)) regcache_raw_supply (regcache, i, NULL); else regcache_raw_supply (regcache, i, - regs + (i * mips_isa_regsize (current_gdbarch))); + regs + (i * mips_isa_regsize (gdbarch))); } } } @@ -162,31 +162,35 @@ mipsnbsd_supply_reg (struct regcache *regcache, const char *regs, int regno) void mipsnbsd_fill_reg (const struct regcache *regcache, char *regs, int regno) { + struct gdbarch *gdbarch = get_regcache_arch (regcache); int i; - for (i = 0; i <= PC_REGNUM; i++) + for (i = 0; i <= gdbarch_pc_regnum (gdbarch); i++) if ((regno == i || regno == -1) - && ! gdbarch_cannot_store_register (current_gdbarch, i)) + && ! gdbarch_cannot_store_register (gdbarch, i)) regcache_raw_collect (regcache, i, - regs + (i * mips_isa_regsize (current_gdbarch))); + regs + (i * mips_isa_regsize (gdbarch))); } void mipsnbsd_supply_fpreg (struct regcache *regcache, const char *fpregs, int regno) { + struct gdbarch *gdbarch = get_regcache_arch (regcache); int i; - for (i = FP0_REGNUM; - i <= mips_regnum (current_gdbarch)->fp_implementation_revision; + for (i = gdbarch_fp0_regnum (gdbarch); + i <= mips_regnum (gdbarch)->fp_implementation_revision; i++) { if (regno == i || regno == -1) { - if (gdbarch_cannot_fetch_register (current_gdbarch, i)) + if (gdbarch_cannot_fetch_register (gdbarch, i)) regcache_raw_supply (regcache, i, NULL); else regcache_raw_supply (regcache, i, - fpregs + ((i - FP0_REGNUM) * mips_isa_regsize (current_gdbarch))); + fpregs + + ((i - gdbarch_fp0_regnum (gdbarch)) + * mips_isa_regsize (gdbarch))); } } } @@ -194,14 +198,17 @@ mipsnbsd_supply_fpreg (struct regcache *regcache, const char *fpregs, int regno) void mipsnbsd_fill_fpreg (const struct regcache *regcache, char *fpregs, int regno) { + struct gdbarch *gdbarch = get_regcache_arch (regcache); int i; - for (i = FP0_REGNUM; i <= mips_regnum (current_gdbarch)->fp_control_status; + for (i = gdbarch_fp0_regnum (gdbarch); + i <= mips_regnum (gdbarch)->fp_control_status; i++) if ((regno == i || regno == -1) - && ! gdbarch_cannot_store_register (current_gdbarch, i)) + && ! gdbarch_cannot_store_register (gdbarch, i)) regcache_raw_collect (regcache, i, - fpregs + ((i - FP0_REGNUM) * mips_isa_regsize (current_gdbarch))); + fpregs + ((i - gdbarch_fp0_regnum (gdbarch)) + * mips_isa_regsize (gdbarch))); } /* Under NetBSD/mips, signal handler invocations can be identified by the @@ -238,17 +245,17 @@ static const unsigned char sigtramp_retcode_mipseb[RETCODE_SIZE] = }; static LONGEST -mipsnbsd_sigtramp_offset (struct frame_info *next_frame) +mipsnbsd_sigtramp_offset (struct frame_info *this_frame) { - CORE_ADDR pc = frame_pc_unwind (next_frame); - const char *retcode = gdbarch_byte_order (current_gdbarch) + CORE_ADDR pc = get_frame_pc (this_frame); + const char *retcode = gdbarch_byte_order (get_frame_arch (this_frame)) == BFD_ENDIAN_BIG ? sigtramp_retcode_mipseb : sigtramp_retcode_mipsel; unsigned char ret[RETCODE_SIZE], w[4]; LONGEST off; int i; - if (!safe_frame_unwind_memory (next_frame, pc, w, sizeof (w))) + if (!safe_frame_unwind_memory (this_frame, pc, w, sizeof (w))) return -1; for (i = 0; i < RETCODE_NWORDS; i++) @@ -262,7 +269,7 @@ mipsnbsd_sigtramp_offset (struct frame_info *next_frame) off = i * 4; pc -= off; - if (!safe_frame_unwind_memory (next_frame, pc, ret, sizeof (ret))) + if (!safe_frame_unwind_memory (this_frame, pc, ret, sizeof (ret))) return -1; if (memcmp (ret, retcode, RETCODE_SIZE) == 0) @@ -279,41 +286,43 @@ mipsnbsd_sigtramp_offset (struct frame_info *next_frame) success. */ #define NBSD_MIPS_JB_PC (2 * 4) -#define NBSD_MIPS_JB_ELEMENT_SIZE mips_isa_regsize (current_gdbarch) -#define NBSD_MIPS_JB_OFFSET (NBSD_MIPS_JB_PC * \ - NBSD_MIPS_JB_ELEMENT_SIZE) +#define NBSD_MIPS_JB_ELEMENT_SIZE(gdbarch) mips_isa_regsize (gdbarch) +#define NBSD_MIPS_JB_OFFSET(gdbarch) (NBSD_MIPS_JB_PC * \ + NBSD_MIPS_JB_ELEMENT_SIZE (gdbarch)) static int mipsnbsd_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc) { + struct gdbarch *gdbarch = get_frame_arch (frame); + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); CORE_ADDR jb_addr; char *buf; - buf = alloca (NBSD_MIPS_JB_ELEMENT_SIZE); + buf = alloca (NBSD_MIPS_JB_ELEMENT_SIZE (gdbarch)); jb_addr = get_frame_register_unsigned (frame, MIPS_A0_REGNUM); - if (target_read_memory (jb_addr + NBSD_MIPS_JB_OFFSET, buf, - NBSD_MIPS_JB_ELEMENT_SIZE)) + if (target_read_memory (jb_addr + NBSD_MIPS_JB_OFFSET (gdbarch), buf, + NBSD_MIPS_JB_ELEMENT_SIZE (gdbarch))) return 0; - *pc = extract_unsigned_integer (buf, NBSD_MIPS_JB_ELEMENT_SIZE); - + *pc = extract_unsigned_integer (buf, NBSD_MIPS_JB_ELEMENT_SIZE (gdbarch), + byte_order); return 1; } static int -mipsnbsd_cannot_fetch_register (int regno) +mipsnbsd_cannot_fetch_register (struct gdbarch *gdbarch, int regno) { return (regno == MIPS_ZERO_REGNUM - || regno == mips_regnum (current_gdbarch)->fp_implementation_revision); + || regno == mips_regnum (gdbarch)->fp_implementation_revision); } static int -mipsnbsd_cannot_store_register (int regno) +mipsnbsd_cannot_store_register (struct gdbarch *gdbarch, int regno) { return (regno == MIPS_ZERO_REGNUM - || regno == mips_regnum (current_gdbarch)->fp_implementation_revision); + || regno == mips_regnum (gdbarch)->fp_implementation_revision); } /* Shared library support. */ @@ -334,6 +343,7 @@ mipsnbsd_ilp32_fetch_link_map_offsets (void) lmo.r_version_offset = 0; lmo.r_version_size = 4; lmo.r_map_offset = 4; + lmo.r_brk_offset = 8; lmo.r_ldsomap_offset = -1; /* Everything we need is in the first 24 bytes. */ @@ -361,6 +371,7 @@ mipsnbsd_lp64_fetch_link_map_offsets (void) lmo.r_version_offset = 0; lmo.r_version_size = 4; lmo.r_map_offset = 8; + lmo.r_brk_offset = 16; lmo.r_ldsomap_offset = -1; /* Everything we need is in the first 40 bytes. */ @@ -407,6 +418,9 @@ mipsnbsd_core_osabi_sniffer (bfd *abfd) return GDB_OSABI_UNKNOWN; } +/* Provide a prototype to silence -Wmissing-prototypes. */ +extern initialize_file_ftype _initialize_mipsnbsd_tdep; + void _initialize_mipsnbsd_tdep (void) {