/* Target-dependent code for NetBSD/mips.
- Copyright (C) 2002, 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
+ Copyright (C) 2002-2015 Free Software Foundation, Inc.
Contributed by Wasabi Systems, Inc.
#include "value.h"
#include "osabi.h"
-#include "gdb_assert.h"
-#include "gdb_string.h"
-
#include "nbsd-tdep.h"
#include "mipsnbsd-tdep.h"
#include "mips-tdep.h"
/* NetBSD/mips register sets. */
-static struct regset mipsnbsd_gregset =
+static const struct regset mipsnbsd_gregset =
{
NULL,
- mipsnbsd_supply_gregset
+ mipsnbsd_supply_gregset,
+ NULL,
+ REGSET_VARIABLE_SIZE
};
-static struct regset mipsnbsd_fpregset =
+static const struct regset mipsnbsd_fpregset =
{
NULL,
mipsnbsd_supply_fpregset
};
-/* Return the appropriate register set for the core section identified
- by SECT_NAME and SECT_SIZE. */
+/* Iterate over core file register note sections. */
-static const struct regset *
-mipsnbsd_regset_from_core_section (struct gdbarch *gdbarch,
- const char *sect_name, size_t sect_size)
+static void
+mipsnbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
+ iterate_over_regset_sections_cb *cb,
+ void *cb_data,
+ const struct regcache *regcache)
{
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;
+ cb (".reg", MIPSNBSD_NUM_GREGS * regsize, &mipsnbsd_gregset,
+ NULL, cb_data);
+ cb (".reg2", MIPSNBSD_NUM_FPREGS * regsize, &mipsnbsd_fpregset,
+ NULL, cb_data);
}
\f
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 <= gdbarch_pc_regnum (current_gdbarch); 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)));
}
}
}
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 <= gdbarch_pc_regnum (current_gdbarch); 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)
+mipsnbsd_supply_fpreg (struct regcache *regcache,
+ const char *fpregs, int regno)
{
+ struct gdbarch *gdbarch = get_regcache_arch (regcache);
int i;
- for (i = gdbarch_fp0_regnum (current_gdbarch);
- 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 - gdbarch_fp0_regnum (current_gdbarch))
- * mips_isa_regsize (current_gdbarch)));
+ + ((i - gdbarch_fp0_regnum (gdbarch))
+ * mips_isa_regsize (gdbarch)));
}
}
}
void
mipsnbsd_fill_fpreg (const struct regcache *regcache, char *fpregs, int regno)
{
+ struct gdbarch *gdbarch = get_regcache_arch (regcache);
int i;
- for (i = gdbarch_fp0_regnum (current_gdbarch);
- 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 - gdbarch_fp0_regnum
- (current_gdbarch))
- * mips_isa_regsize (current_gdbarch)));
+ fpregs + ((i - gdbarch_fp0_regnum (gdbarch))
+ * mips_isa_regsize (gdbarch)));
}
+#if 0
+
/* 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
0x00, 0x00, 0x00, 0x0c, /* syscall */
};
-static LONGEST
-mipsnbsd_sigtramp_offset (struct frame_info *next_frame)
-{
- CORE_ADDR pc = frame_pc_unwind (next_frame);
- const char *retcode = gdbarch_byte_order (current_gdbarch)
- == 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)))
- return -1;
-
- for (i = 0; i < RETCODE_NWORDS; i++)
- {
- if (memcmp (w, retcode + (i * 4), 4) == 0)
- break;
- }
- if (i == RETCODE_NWORDS)
- return -1;
-
- off = i * 4;
- pc -= off;
-
- if (!safe_frame_unwind_memory (next_frame, pc, ret, sizeof (ret)))
- return -1;
-
- if (memcmp (ret, retcode, RETCODE_SIZE) == 0)
- return off;
-
- return -1;
-}
+#endif
/* Figure out where the longjmp will land. We expect that we have
just entered longjmp and haven't yet setup the stack frame, so the
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;
+ gdb_byte *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. */
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. */
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. */
mipsnbsd_init_abi (struct gdbarch_info info,
struct gdbarch *gdbarch)
{
- set_gdbarch_regset_from_core_section
- (gdbarch, mipsnbsd_regset_from_core_section);
+ set_gdbarch_iterate_over_regset_sections
+ (gdbarch, mipsnbsd_iterate_over_regset_sections);
set_gdbarch_get_longjmp_target (gdbarch, mipsnbsd_get_longjmp_target);
}
\f
-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;
-}
+/* Provide a prototype to silence -Wmissing-prototypes. */
+extern initialize_file_ftype _initialize_mipsnbsd_tdep;
void
_initialize_mipsnbsd_tdep (void)