Add support for ELF core files on OpenBSD/sparc64.

gdb/ChangeLog:

        * sparc64obsd-tdep.c (sparc64obsd_gregset): New variable.
        (sparc64obsd_supply_gregset): Handle registers sets used in ELF
        core dumps.
        (sparc64obsd_init_abi): Adjust minimum size of the general purpose
        register set used in ELF core dumps.  Add floating-point register set.
This commit is contained in:
Mark Kettenis 2014-02-04 13:18:15 +01:00
parent c5bb736278
commit 26fd922825
2 changed files with 51 additions and 10 deletions

View File

@ -1,3 +1,11 @@
2014-02-04 Mark Kettenis <kettenis@gnu.org>
* sparc64obsd-tdep.c (sparc64obsd_gregset): New variable.
(sparc64obsd_supply_gregset): Handle registers sets used in ELF
core dumps.
(sparc64obsd_init_abi): Adjust minimum size of the general purpose
register set used in ELF core dumps. Add floating-point register set.
2014-02-03 Kevin Buettner <kevinb@redhat.com> 2014-02-03 Kevin Buettner <kevinb@redhat.com>
* mn10300-tdep.c (mn10300_dwarf2_reg_to_regnum): Rewrite * mn10300-tdep.c (mn10300_dwarf2_reg_to_regnum): Rewrite

View File

@ -35,14 +35,30 @@
#include "solib-svr4.h" #include "solib-svr4.h"
#include "bsd-uthread.h" #include "bsd-uthread.h"
/* OpenBSD uses the traditional NetBSD core file format, even for /* Older OpenBSD versions used the traditional NetBSD core file
ports that use ELF. The core files don't use multiple register format, even for ports that use ELF. These core files don't use
sets. Instead, the general-purpose and floating-point registers multiple register sets. Instead, the general-purpose and
are lumped together in a single section. Unlike on NetBSD, OpenBSD floating-point registers are lumped together in a single section.
uses a different layout for its general-purpose registers than the Unlike on NetBSD, OpenBSD uses a different layout for its
layout used for ptrace(2). */ general-purpose registers than the layout used for ptrace(2).
Newer OpenBSD versions use ELF core files. Here the register sets
match the ptrace(2) layout. */
/* From <machine/reg.h>. */ /* From <machine/reg.h>. */
const struct sparc_gregset sparc64obsd_gregset =
{
0 * 8, /* "tstate" */
1 * 8, /* %pc */
2 * 8, /* %npc */
3 * 8, /* %y */
-1, /* %fprs */
-1,
5 * 8, /* %g1 */
20 * 8, /* %l0 */
4 /* sizeof (%y) */
};
const struct sparc_gregset sparc64obsd_core_gregset = const struct sparc_gregset sparc64obsd_core_gregset =
{ {
0 * 8, /* "tstate" */ 0 * 8, /* "tstate" */
@ -61,10 +77,24 @@ sparc64obsd_supply_gregset (const struct regset *regset,
struct regcache *regcache, struct regcache *regcache,
int regnum, const void *gregs, size_t len) int regnum, const void *gregs, size_t len)
{ {
const char *regs = gregs; const void *fpregs = (char *)gregs + 288;
sparc64_supply_gregset (&sparc64obsd_core_gregset, regcache, regnum, regs); if (len < 832)
sparc64_supply_fpregset (&sparc64_bsd_fpregset, regcache, regnum, regs + 288); {
sparc64_supply_gregset (&sparc64obsd_gregset, regcache, regnum, gregs);
return;
}
sparc64_supply_gregset (&sparc64obsd_core_gregset, regcache, regnum, gregs);
sparc64_supply_fpregset (&sparc64_bsd_fpregset, regcache, regnum, fpregs);
}
static void
sparc64obsd_supply_fpregset (const struct regset *regset,
struct regcache *regcache,
int regnum, const void *fpregs, size_t len)
{
sparc64_supply_fpregset (&sparc64_bsd_fpregset, regcache, regnum, fpregs);
} }
@ -379,7 +409,10 @@ sparc64obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
tdep->gregset = regset_alloc (gdbarch, sparc64obsd_supply_gregset, NULL); tdep->gregset = regset_alloc (gdbarch, sparc64obsd_supply_gregset, NULL);
tdep->sizeof_gregset = 832; tdep->sizeof_gregset = 288;
tdep->fpregset = regset_alloc (gdbarch, sparc64obsd_supply_fpregset, NULL);
tdep->sizeof_fpregset = 272;
/* Make sure we can single-step "new" syscalls. */ /* Make sure we can single-step "new" syscalls. */
tdep->step_trap = sparcnbsd_step_trap; tdep->step_trap = sparcnbsd_step_trap;