Add support for ELF core files.
This commit is contained in:
parent
87899d0b72
commit
b56d2fc557
|
@ -28,6 +28,16 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
#include "target.h"
|
#include "target.h"
|
||||||
#include "gdbcore.h"
|
#include "gdbcore.h"
|
||||||
|
|
||||||
|
static void
|
||||||
|
supply_regs (regs)
|
||||||
|
char *regs;
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < NUM_REGS; i++)
|
||||||
|
supply_register (i, regs + (i * REGISTER_SIZE));
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
fetch_inferior_registers (regno)
|
fetch_inferior_registers (regno)
|
||||||
int regno;
|
int regno;
|
||||||
|
@ -36,10 +46,7 @@ fetch_inferior_registers (regno)
|
||||||
|
|
||||||
ptrace (PT_GETREGS, inferior_pid,
|
ptrace (PT_GETREGS, inferior_pid,
|
||||||
(PTRACE_ARG3_TYPE) &inferior_registers, 0);
|
(PTRACE_ARG3_TYPE) &inferior_registers, 0);
|
||||||
memcpy (®isters[REGISTER_BYTE (0)], &inferior_registers,
|
supply_regs ((char *) &inferior_registers);
|
||||||
sizeof(inferior_registers));
|
|
||||||
|
|
||||||
registers_fetched ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -52,8 +59,6 @@ store_inferior_registers (regno)
|
||||||
sizeof(inferior_registers));
|
sizeof(inferior_registers));
|
||||||
ptrace (PT_SETREGS, inferior_pid,
|
ptrace (PT_SETREGS, inferior_pid,
|
||||||
(PTRACE_ARG3_TYPE) &inferior_registers, 0);
|
(PTRACE_ARG3_TYPE) &inferior_registers, 0);
|
||||||
|
|
||||||
registers_fetched ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -71,7 +76,7 @@ fetch_core_registers (core_reg_sect, core_reg_size, which, reg_addr)
|
||||||
unsigned int reg_addr; /* Unused in this version */
|
unsigned int reg_addr; /* Unused in this version */
|
||||||
{
|
{
|
||||||
struct md_core *core_reg;
|
struct md_core *core_reg;
|
||||||
struct reg *reg;
|
struct reg reg;
|
||||||
|
|
||||||
core_reg = (struct md_core *)core_reg_sect;
|
core_reg = (struct md_core *)core_reg_sect;
|
||||||
|
|
||||||
|
@ -85,21 +90,42 @@ fetch_core_registers (core_reg_sect, core_reg_size, which, reg_addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Integer registers */
|
/* Integer registers */
|
||||||
reg = (struct reg *) ®isters[REGISTER_BYTE (0)];
|
memcpy(®.r0, &core_reg->intreg.r0, sizeof(reg.r0)*12);
|
||||||
memcpy(®->r0, &core_reg->intreg.r0, sizeof(reg->r0)*12);
|
reg.ap = core_reg->intreg.ap;
|
||||||
reg->ap = core_reg->intreg.ap;
|
reg.fp = core_reg->intreg.fp;
|
||||||
reg->fp = core_reg->intreg.fp;
|
reg.sp = core_reg->intreg.sp;
|
||||||
reg->sp = core_reg->intreg.sp;
|
reg.pc = core_reg->intreg.pc;
|
||||||
reg->pc = core_reg->intreg.pc;
|
reg.psl = core_reg->intreg.psl;
|
||||||
reg->psl = core_reg->intreg.psl;
|
|
||||||
|
|
||||||
registers_fetched ();
|
supply_regs ((char *) ®);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fetch_elfcore_registers (core_reg_sect, core_reg_size, which, ignore)
|
||||||
|
char *core_reg_sect;
|
||||||
|
unsigned core_reg_size;
|
||||||
|
int which;
|
||||||
|
CORE_ADDR ignore;
|
||||||
|
{
|
||||||
|
switch (which)
|
||||||
|
{
|
||||||
|
case 0: /* Integer registers */
|
||||||
|
if (core_reg_size != sizeof (struct reg))
|
||||||
|
warning ("Wrong size register set in core file.");
|
||||||
|
else
|
||||||
|
supply_regs (core_reg_sect);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* Don't know what kind of register request this is; just ignore it. */
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Register that we are able to handle vaxnbsd core file formats.
|
/* Register that we are able to handle vaxnbsd core file formats.
|
||||||
FIXME: is this really bfd_target_unknown_flavour? */
|
FIXME: is this really bfd_target_unknown_flavour? */
|
||||||
|
|
||||||
static struct core_fns nat_core_fns =
|
static struct core_fns vaxnbsd_core_fns =
|
||||||
{
|
{
|
||||||
bfd_target_unknown_flavour, /* core_flavour */
|
bfd_target_unknown_flavour, /* core_flavour */
|
||||||
default_check_format, /* check_format */
|
default_check_format, /* check_format */
|
||||||
|
@ -108,10 +134,20 @@ static struct core_fns nat_core_fns =
|
||||||
NULL /* next */
|
NULL /* next */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct core_fns vaxnbsd_elfcore_fns =
|
||||||
|
{
|
||||||
|
bfd_target_elf_flavour, /* core_flavour */
|
||||||
|
default_check_format, /* check_format */
|
||||||
|
default_core_sniffer, /* core_sniffer */
|
||||||
|
fetch_elfcore_registers, /* core_read_registers */
|
||||||
|
NULL /* next */
|
||||||
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
_initialize_vaxnbsd_nat ()
|
_initialize_vaxnbsd_nat ()
|
||||||
{
|
{
|
||||||
add_core_fns (&nat_core_fns);
|
add_core_fns (&vaxnbsd_core_fns);
|
||||||
|
add_core_fns (&vaxnbsd_elfcore_fns);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue