* alphabsd-tdep.h: Tweak comments.

(SIZOEF_STRUCT_REG, SIZEOF_STRUCT_FPREG): Remove.
* alphanbsd-tdep.c: Reorder includes.  Include "regset.h".
(ALPHANBSD_SIZEOF_GREGS, ALPHANBSD_SIZEOF_FPREGS): New defines.
(alphanbsd_supply_fpregset, alphanbsd_supply_gregset)
(alphanbsd_aout_supply_gregset): New functions.
(alphanbsd_gregset, alphanbsd_fpregset, alphanbsd_aout_gregset):
New variables.
(alphanbsd_regset_from_core_section)
(alphanbsd_aout_regset_from_core_section): New functions.
(fetch_core_registers, fetch_elfcore_registers): Remove functions.
(alphanbsd_core_fns, alphanbsd_elf_fns): Remove variables.
(alphanbsd_init_abi): Set regset_from_core_section.
(alphanbsd_aout_init_abi, alphanbsd_core_osabi_sniffer): New
functions.
(_initialize_alphanbsd_tdep): Register NetBSD core file sniffer.
Use alphanbsd_aout_init_abi whre appropriate.  Don't call
deprecated_add_core_fns.
* Makefile.in (alphanbsd-tdep.o): Update dependencies.
This commit is contained in:
Mark Kettenis
2006-07-09 16:12:11 +00:00
parent 8fe7c54bf1
commit 3beabdb233
4 changed files with 192 additions and 76 deletions

View File

@ -1,5 +1,25 @@
2006-07-09 Mark Kettenis <kettenis@gnu.org> 2006-07-09 Mark Kettenis <kettenis@gnu.org>
* alphabsd-tdep.h: Tweak comments.
(SIZOEF_STRUCT_REG, SIZEOF_STRUCT_FPREG): Remove.
* alphanbsd-tdep.c: Reorder includes. Include "regset.h".
(ALPHANBSD_SIZEOF_GREGS, ALPHANBSD_SIZEOF_FPREGS): New defines.
(alphanbsd_supply_fpregset, alphanbsd_supply_gregset)
(alphanbsd_aout_supply_gregset): New functions.
(alphanbsd_gregset, alphanbsd_fpregset, alphanbsd_aout_gregset):
New variables.
(alphanbsd_regset_from_core_section)
(alphanbsd_aout_regset_from_core_section): New functions.
(fetch_core_registers, fetch_elfcore_registers): Remove functions.
(alphanbsd_core_fns, alphanbsd_elf_fns): Remove variables.
(alphanbsd_init_abi): Set regset_from_core_section.
(alphanbsd_aout_init_abi, alphanbsd_core_osabi_sniffer): New
functions.
(_initialize_alphanbsd_tdep): Register NetBSD core file sniffer.
Use alphanbsd_aout_init_abi whre appropriate. Don't call
deprecated_add_core_fns.
* Makefile.in (alphanbsd-tdep.o): Update dependencies.
* alphabsd-tdep.c (alphabsd_supply_reg, alphabsd_fill_reg) * alphabsd-tdep.c (alphabsd_supply_reg, alphabsd_fill_reg)
(alphabsd_supply_fpreg, alphabsd_fill_fpreg): Add missing spaces. (alphabsd_supply_fpreg, alphabsd_fill_fpreg): Add missing spaces.

View File

@ -1707,9 +1707,10 @@ alpha-mdebug-tdep.o: alpha-mdebug-tdep.c $(defs_h) $(frame_h) \
$(block_h) $(gdb_assert_h) $(alpha_tdep_h) $(mdebugread_h) $(block_h) $(gdb_assert_h) $(alpha_tdep_h) $(mdebugread_h)
alpha-nat.o: alpha-nat.c $(defs_h) $(gdb_string_h) $(inferior_h) \ alpha-nat.o: alpha-nat.c $(defs_h) $(gdb_string_h) $(inferior_h) \
$(gdbcore_h) $(target_h) $(regcache_h) $(alpha_tdep_h) $(gregset_h) $(gdbcore_h) $(target_h) $(regcache_h) $(alpha_tdep_h) $(gregset_h)
alphanbsd-tdep.o: alphanbsd-tdep.c $(defs_h) $(gdbcore_h) $(frame_h) \ alphanbsd-tdep.o: alphanbsd-tdep.c $(defs_h) $(frame_h) $(gdbcore_h) \
$(regcache_h) $(value_h) $(osabi_h) $(gdb_string_h) $(alpha_tdep_h) \ $(regcache_h) $(regset_h) $(value_h) $(osabi_h) $(gdb_string_h) \
$(alphabsd_tdep_h) $(nbsd_tdep_h) $(solib_svr4_h) $(gdb_assert_h) $(alpha_tdep_h) $(alphabsd_tdep_h) $(nbsd_tdep_h) \
$(solib_svr4_h)
alpha-osf1-tdep.o: alpha-osf1-tdep.c $(defs_h) $(frame_h) $(gdbcore_h) \ alpha-osf1-tdep.o: alpha-osf1-tdep.c $(defs_h) $(frame_h) $(gdbcore_h) \
$(value_h) $(osabi_h) $(gdb_string_h) $(objfiles_h) $(alpha_tdep_h) $(value_h) $(osabi_h) $(gdb_string_h) $(objfiles_h) $(alpha_tdep_h)
alpha-tdep.o: alpha-tdep.c $(defs_h) $(doublest_h) $(frame_h) \ alpha-tdep.o: alpha-tdep.c $(defs_h) $(doublest_h) $(frame_h) \

View File

@ -1,5 +1,6 @@
/* Common target dependent code for GDB on Alpha systems running BSD. /* Common target dependent code for Alpha BSD's.
Copyright (C) 2002 Free Software Foundation, Inc.
Copyright (C) 2002, 2006 Free Software Foundation, Inc.
This file is part of GDB. This file is part of GDB.
@ -27,7 +28,4 @@ void alphabsd_fill_reg (char *, int);
void alphabsd_supply_fpreg (char *, int); void alphabsd_supply_fpreg (char *, int);
void alphabsd_fill_fpreg (char *, int); void alphabsd_fill_fpreg (char *, int);
#define SIZEOF_STRUCT_REG (32 * 8) #endif /* alphabsd-tdep.h */
#define SIZEOF_STRUCT_FPREG (33 * 8)
#endif /* ALPHABSD_TDEP_H */

View File

@ -22,12 +22,14 @@
Boston, MA 02110-1301, USA. */ Boston, MA 02110-1301, USA. */
#include "defs.h" #include "defs.h"
#include "gdbcore.h"
#include "frame.h" #include "frame.h"
#include "regcache.h" #include "gdbcore.h"
#include "value.h"
#include "osabi.h" #include "osabi.h"
#include "regcache.h"
#include "regset.h"
#include "value.h"
#include "gdb_assert.h"
#include "gdb_string.h" #include "gdb_string.h"
#include "alpha-tdep.h" #include "alpha-tdep.h"
@ -35,14 +37,78 @@
#include "nbsd-tdep.h" #include "nbsd-tdep.h"
#include "solib-svr4.h" #include "solib-svr4.h"
static void /* Core file support. */
fetch_core_registers (char *core_reg_sect, unsigned core_reg_size, int which,
CORE_ADDR ignore)
{
char *regs, *fpregs;
int regno;
/* Table to map a gdb register number to a trapframe register index. */ /* Even though NetBSD/alpha used ELF since day one, it used the
traditional a.out-style core dump format before NetBSD 1.6. */
/* Sizeof `struct reg' in <machine/reg.h>. */
#define ALPHANBSD_SIZEOF_GREGS (32 * 8)
/* Sizeof `struct fpreg' in <machine/reg.h. */
#define ALPHANBSD_SIZEOF_FPREGS ((32 * 8) + 8)
/* Supply register REGNUM from the buffer specified by FPREGS and LEN
in the floating-point register set REGSET to register cache
REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
static void
alphanbsd_supply_fpregset (const struct regset *regset,
struct regcache *regcache,
int regnum, const void *fpregs, size_t len)
{
const gdb_byte *regs = fpregs;
int i;
gdb_assert (len >= ALPHANBSD_SIZEOF_FPREGS);
for (i = ALPHA_FP0_REGNUM; i < ALPHA_FP0_REGNUM + 31; i++)
{
if (regnum == i || regnum == -1)
regcache_raw_supply (regcache, i, regs + (i - ALPHA_FP0_REGNUM) * 8);
}
if (regnum == ALPHA_FPCR_REGNUM || regnum == -1)
regcache_raw_supply (regcache, ALPHA_FPCR_REGNUM, regs + 32 * 8);
}
/* Supply register REGNUM from the buffer specified by GREGS and LEN
in the general-purpose register set REGSET to register cache
REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
static void
alphanbsd_supply_gregset (const struct regset *regset,
struct regcache *regcache,
int regnum, const void *gregs, size_t len)
{
const gdb_byte *regs = gregs;
int i;
gdb_assert (len >= ALPHANBSD_SIZEOF_GREGS);
for (i = 0; i < ALPHA_ZERO_REGNUM; i++)
{
if (regnum == i || regnum == -1)
regcache_raw_supply (regcache, i, regs + i * 8);
}
if (regnum == ALPHA_PC_REGNUM || regnum == -1)
regcache_raw_supply (regcache, ALPHA_PC_REGNUM, regs + 31 * 8);
}
/* Supply register REGNUM from the buffer specified by GREGS and LEN
in the general-purpose register set REGSET to register cache
REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
static void
alphanbsd_aout_supply_gregset (const struct regset *regset,
struct regcache *regcache,
int regnum, const void *gregs, size_t len)
{
const gdb_byte *regs = gregs;
int i;
/* Table to map a GDB register number to a trapframe register index. */
static const int regmap[] = static const int regmap[] =
{ {
0, 1, 2, 3, 0, 1, 2, 3,
@ -54,75 +120,76 @@ fetch_core_registers (char *core_reg_sect, unsigned core_reg_size, int which,
21, 22, 23, 24, 21, 22, 23, 24,
25, 29, 26 25, 29, 26
}; };
#define SIZEOF_TRAPFRAME (33 * 8)
/* We get everything from one section. */ gdb_assert (len >= ALPHANBSD_SIZEOF_GREGS);
if (which != 0)
return;
regs = core_reg_sect; for (i = 0; i < ARRAY_SIZE(regmap); i++)
fpregs = core_reg_sect + SIZEOF_TRAPFRAME;
if (core_reg_size < (SIZEOF_TRAPFRAME + SIZEOF_STRUCT_FPREG))
{ {
warning (_("Wrong size register set in core file.")); if (regnum == i || regnum == -1)
return; regcache_raw_supply (regcache, i, regs + regmap[i] * 8);
} }
/* Integer registers. */ if (regnum == ALPHA_PC_REGNUM || regnum == -1)
for (regno = 0; regno < ALPHA_ZERO_REGNUM; regno++) regcache_raw_supply (regcache, ALPHA_PC_REGNUM, regs + 31 * 8);
regcache_raw_supply (current_regcache, regno, regs + (regmap[regno] * 8));
regcache_raw_supply (current_regcache, ALPHA_ZERO_REGNUM, NULL);
regcache_raw_supply (current_regcache, PC_REGNUM, regs + (28 * 8));
/* Floating point registers. */ if (len >= ALPHANBSD_SIZEOF_GREGS + ALPHANBSD_SIZEOF_FPREGS)
alphabsd_supply_fpreg (fpregs, -1);
}
static void
fetch_elfcore_registers (char *core_reg_sect, unsigned core_reg_size, int which,
CORE_ADDR ignore)
{ {
switch (which) regs += ALPHANBSD_SIZEOF_GREGS;
{ len -= ALPHANBSD_SIZEOF_GREGS;
case 0: /* Integer registers. */ alphanbsd_supply_fpregset (regset, regcache, regnum, regs, len);
if (core_reg_size != SIZEOF_STRUCT_REG)
warning (_("Wrong size register set in core file."));
else
alphabsd_supply_reg (core_reg_sect, -1);
break;
case 2: /* Floating point registers. */
if (core_reg_size != SIZEOF_STRUCT_FPREG)
warning (_("Wrong size FP register set in core file."));
else
alphabsd_supply_fpreg (core_reg_sect, -1);
break;
default:
/* Don't know what kind of register request this is; just ignore it. */
break;
} }
} }
static struct core_fns alphanbsd_core_fns = /* NetBSD/alpha register sets. */
static struct regset alphanbsd_gregset =
{ {
bfd_target_unknown_flavour, /* core_flavour */ NULL,
default_check_format, /* check_format */ alphanbsd_supply_gregset
default_core_sniffer, /* core_sniffer */
fetch_core_registers, /* core_read_registers */
NULL /* next */
}; };
static struct core_fns alphanbsd_elfcore_fns = static struct regset alphanbsd_fpregset =
{ {
bfd_target_elf_flavour, /* core_flavour */ NULL,
default_check_format, /* check_format */ alphanbsd_supply_fpregset
default_core_sniffer, /* core_sniffer */
fetch_elfcore_registers, /* core_read_registers */
NULL /* next */
}; };
static struct regset alphanbsd_aout_gregset =
{
NULL,
alphanbsd_aout_supply_gregset
};
/* Return the appropriate register set for the core section identified
by SECT_NAME and SECT_SIZE. */
static const struct regset *
alphanbsd_regset_from_core_section (struct gdbarch *gdbarch,
const char *sect_name, size_t sect_size)
{
if (strcmp (sect_name, ".reg") == 0 && sect_size >= ALPHANBSD_SIZEOF_GREGS)
return &alphanbsd_gregset;
if (strcmp (sect_name, ".reg2") == 0 && sect_size >= ALPHANBSD_SIZEOF_FPREGS)
return &alphanbsd_fpregset;
return NULL;
}
static const struct regset *
alphanbsd_aout_regset_from_core_section (struct gdbarch *gdbarch,
const char *sect_name,
size_t sect_size)
{
if (strcmp (sect_name, ".reg") == 0 && sect_size >= ALPHANBSD_SIZEOF_GREGS)
return &alphanbsd_aout_gregset;
return NULL;
}
/* Signal trampolines. */
/* Under NetBSD/alpha, signal handler invocations can be identified by the /* Under NetBSD/alpha, signal handler invocations can be identified by the
designated code sequence that is used to return from a signal handler. designated code sequence that is used to return from a signal handler.
In particular, the return address of a signal handler points to the In particular, the return address of a signal handler points to the
@ -221,16 +288,46 @@ alphanbsd_init_abi (struct gdbarch_info info,
tdep->jb_pc = 2; tdep->jb_pc = 2;
tdep->jb_elt_size = 8; tdep->jb_elt_size = 8;
set_gdbarch_regset_from_core_section
(gdbarch, alphanbsd_regset_from_core_section);
} }
static void
alphanbsd_aout_init_abi (struct gdbarch_info info,
struct gdbarch *gdbarch)
{
alphanbsd_init_abi(info, gdbarch);
set_gdbarch_regset_from_core_section
(gdbarch, alphanbsd_aout_regset_from_core_section);
}
static enum gdb_osabi
alphanbsd_core_osabi_sniffer (bfd *abfd)
{
if (strcmp (bfd_get_target (abfd), "netbsd-core") == 0)
return GDB_OSABI_NETBSD_AOUT;
return GDB_OSABI_UNKNOWN;
}
/* Provide a prototype to silence -Wmissing-prototypes. */
void _initialize_alphanbsd_tdep (void);
void void
_initialize_alphanbsd_tdep (void) _initialize_alphanbsd_tdep (void)
{ {
/* BFD doesn't set a flavour for NetBSD style a.out core files. */
gdbarch_register_osabi_sniffer (bfd_arch_alpha, bfd_target_unknown_flavour,
alphanbsd_core_osabi_sniffer);
gdbarch_register_osabi (bfd_arch_alpha, 0, GDB_OSABI_NETBSD_ELF, gdbarch_register_osabi (bfd_arch_alpha, 0, GDB_OSABI_NETBSD_ELF,
alphanbsd_init_abi); alphanbsd_init_abi);
gdbarch_register_osabi (bfd_arch_alpha, 0, GDB_OSABI_NETBSD_AOUT,
alphanbsd_aout_init_abi);
gdbarch_register_osabi (bfd_arch_alpha, 0, GDB_OSABI_OPENBSD_ELF, gdbarch_register_osabi (bfd_arch_alpha, 0, GDB_OSABI_OPENBSD_ELF,
alphanbsd_init_abi); alphanbsd_aout_init_abi);
deprecated_add_core_fns (&alphanbsd_core_fns);
deprecated_add_core_fns (&alphanbsd_elfcore_fns);
} }