/* Target-dependent code for the Matsushita MN10300 for GDB, the GNU debugger.
- Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008
- Free Software Foundation, Inc.
+ Copyright (C) 2003-2015 Free Software Foundation, Inc.
This file is part of GDB.
#include "defs.h"
#include "gdbcore.h"
-#include "gdb_string.h"
#include "regcache.h"
#include "mn10300-tdep.h"
-#include "gdb_assert.h"
#include "bfd.h"
#include "elf-bfd.h"
#include "osabi.h"
#include "frame.h"
#include "trad-frame.h"
#include "tramp-frame.h"
-
-#include <stdlib.h>
+#include "linux-tdep.h"
/* Transliterated from <asm-mn10300/elf.h>... */
#define MN10300_ELF_NGREG 28
Given a section name and size, create a struct reg object
with a supply_register and a collect_register method. */
-/* Copy register value of REGNUM from regset to regcache.
+/* Copy register value of REGNUM from regset to regcache.
If REGNUM is -1, do this for all gp registers in regset. */
static void
const mn10300_elf_greg_t *regp = (const mn10300_elf_greg_t *) gregs;
int i;
- gdb_assert (len == sizeof (mn10300_elf_gregset_t));
+ gdb_assert (len >= sizeof (mn10300_elf_gregset_t));
switch (regnum) {
case E_D0_REGNUM:
return;
}
-/* Copy fp register value of REGNUM from regset to regcache.
- If REGNUM is -1, do this for all fp registers in regset. */
+/* Copy fp register value of REGNUM from regset to regcache.
+ If REGNUM is -1, do this for all fp registers in regset. */
static void
am33_supply_fpregset_method (const struct regset *regset,
{
const mn10300_elf_fpregset_t *fpregset = fpregs;
- gdb_assert (len == sizeof (mn10300_elf_fpregset_t));
+ gdb_assert (len >= sizeof (mn10300_elf_fpregset_t));
if (regnum == -1)
{
else if (regnum == E_FPCR_REGNUM)
regcache_raw_supply (regcache, E_FPCR_REGNUM,
&fpregset->fpcr);
- else if (E_FS0_REGNUM <= regnum && regnum < E_FS0_REGNUM + MN10300_ELF_NFPREG)
+ else if (E_FS0_REGNUM <= regnum
+ && regnum < E_FS0_REGNUM + MN10300_ELF_NFPREG)
regcache_raw_supply (regcache, regnum,
&fpregset->fpregs[regnum - E_FS0_REGNUM]);
mn10300_elf_gregset_t *regp = gregs;
int i;
- gdb_assert (len == sizeof (mn10300_elf_gregset_t));
+ gdb_assert (len >= sizeof (mn10300_elf_gregset_t));
switch (regnum) {
case E_D0_REGNUM:
{
mn10300_elf_fpregset_t *fpregset = fpregs;
- gdb_assert (len == sizeof (mn10300_elf_fpregset_t));
+ gdb_assert (len >= sizeof (mn10300_elf_fpregset_t));
if (regnum == -1)
{
return;
}
-/* Create a struct regset from a corefile register section. */
+static const struct regset am33_gregset =
+ {
+ NULL, am33_supply_gregset_method, am33_collect_gregset_method
+ };
-static const struct regset *
-am33_regset_from_core_section (struct gdbarch *gdbarch,
- const char *sect_name,
- size_t sect_size)
-{
- /* We will call regset_alloc, and pass the names of the supply and
- collect methods. */
+static const struct regset am33_fpregset =
+ {
+ NULL, am33_supply_fpregset_method, am33_collect_fpregset_method
+ };
- if (sect_size == sizeof (mn10300_elf_fpregset_t))
- return regset_alloc (gdbarch,
- am33_supply_fpregset_method,
- am33_collect_fpregset_method);
- else
- return regset_alloc (gdbarch,
- am33_supply_gregset_method,
- am33_collect_gregset_method);
+/* Iterate over core file register note sections. */
+
+static void
+am33_iterate_over_regset_sections (struct gdbarch *gdbarch,
+ iterate_over_regset_sections_cb *cb,
+ void *cb_data,
+ const struct regcache *regcache)
+{
+ cb (".reg", sizeof (mn10300_elf_gregset_t), &am33_gregset,
+ NULL, cb_data);
+ cb (".reg2", sizeof(mn10300_elf_fpregset_t), &am33_fpregset,
+ NULL, cb_data);
}
\f
static void
sc_base + AM33_SIGCONTEXT_PC);
fpubase = get_frame_memory_unsigned (this_frame,
- sc_base + AM33_SIGCONTEXT_FPUCONTEXT, 4);
+ sc_base + AM33_SIGCONTEXT_FPUCONTEXT,
+ 4);
if (fpubase)
{
for (i = 0; i < 32; i++)
Now's our chance to register our corefile handling. */
static void
-am33_linux_init_osabi (struct gdbarch_info gdbinfo, struct gdbarch *gdbarch)
+am33_linux_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch)
{
- set_gdbarch_regset_from_core_section (gdbarch,
- am33_regset_from_core_section);
+ linux_init_abi (info, gdbarch);
+
+ set_gdbarch_iterate_over_regset_sections
+ (gdbarch, am33_iterate_over_regset_sections);
set_solib_svr4_fetch_link_map_offsets
(gdbarch, svr4_ilp32_fetch_link_map_offsets);
tramp_frame_prepend_unwinder (gdbarch, &am33_linux_rt_sigframe);
}
+/* Provide a prototype to silence -Wmissing-prototypes. */
+extern initialize_file_ftype _initialize_mn10300_linux_tdep;
+
void
_initialize_mn10300_linux_tdep (void)
{