/* Target-dependent code for NetBSD/mips.
- Copyright (C) 2002, 2003, 2004, 2006, 2007, 2008, 2009, 2010
- 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_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;
* 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 *this_frame)
-{
- 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 (this_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 (this_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
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 (gdbarch));
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;