#include "defs.h"
#include "inferior.h"
#include "gdbcore.h"
#include "regcache.h"
#include <sys/ptrace.h>
#define KERNEL
#include <machine/reg.h>
static void fetch_core_registers (char *, unsigned, int, CORE_ADDR);
void
fetch_inferior_registers (int regno)
{
struct regs inferior_registers;
struct fp_status inferior_fp_registers;
registers_fetched ();
ptrace (PTRACE_GETREGS, PIDGET (inferior_ptid),
(PTRACE_ARG3_TYPE) & inferior_registers);
if (FP0_REGNUM >= 0)
ptrace (PTRACE_GETFPREGS, PIDGET (inferior_ptid),
(PTRACE_ARG3_TYPE) & inferior_fp_registers);
memcpy (registers, &inferior_registers, 16 * 4);
if (FP0_REGNUM >= 0)
memcpy (®isters[REGISTER_BYTE (FP0_REGNUM)], &inferior_fp_registers,
sizeof inferior_fp_registers.fps_regs);
*(int *) ®isters[REGISTER_BYTE (PS_REGNUM)] = inferior_registers.r_ps;
*(int *) ®isters[REGISTER_BYTE (PC_REGNUM)] = inferior_registers.r_pc;
if (FP0_REGNUM >= 0)
memcpy (®isters[REGISTER_BYTE (FPC_REGNUM)],
&inferior_fp_registers.fps_control,
sizeof inferior_fp_registers -
sizeof inferior_fp_registers.fps_regs);
}
void
store_inferior_registers (int regno)
{
struct regs inferior_registers;
struct fp_status inferior_fp_registers;
memcpy (&inferior_registers, registers, 16 * 4);
if (FP0_REGNUM >= 0)
memcpy (&inferior_fp_registers, ®isters[REGISTER_BYTE (FP0_REGNUM)],
sizeof inferior_fp_registers.fps_regs);
inferior_registers.r_ps = *(int *) ®isters[REGISTER_BYTE (PS_REGNUM)];
inferior_registers.r_pc = *(int *) ®isters[REGISTER_BYTE (PC_REGNUM)];
if (FP0_REGNUM >= 0)
memcpy (&inferior_fp_registers.fps_control,
®isters[REGISTER_BYTE (FPC_REGNUM)],
sizeof inferior_fp_registers -
sizeof inferior_fp_registers.fps_regs);
ptrace (PTRACE_SETREGS, PIDGET (inferior_ptid),
(PTRACE_ARG3_TYPE) & inferior_registers);
if (FP0_REGNUM >= 0)
ptrace (PTRACE_SETFPREGS, PIDGET (inferior_ptid),
(PTRACE_ARG3_TYPE) & inferior_fp_registers);
}
static void
fetch_core_registers (char *core_reg_sect, unsigned core_reg_size,
int which, CORE_ADDR reg_addr)
{
struct regs *regs = (struct regs *) core_reg_sect;
if (which == 0)
{
if (core_reg_size < sizeof (struct regs))
error ("Can't find registers in core file");
memcpy (registers, (char *) regs, 16 * 4);
supply_register (PS_REGNUM, (char *) ®s->r_ps);
supply_register (PC_REGNUM, (char *) ®s->r_pc);
}
else if (which == 2)
{
#define fpustruct ((struct fpu *) core_reg_sect)
if (core_reg_size >= sizeof (struct fpu))
{
if (FP0_REGNUM >= 0)
{
memcpy (®isters[REGISTER_BYTE (FP0_REGNUM)],
fpustruct->f_fpstatus.fps_regs,
sizeof fpustruct->f_fpstatus.fps_regs);
memcpy (®isters[REGISTER_BYTE (FPC_REGNUM)],
&fpustruct->f_fpstatus.fps_control,
sizeof fpustruct->f_fpstatus -
sizeof fpustruct->f_fpstatus.fps_regs);
}
}
else
fprintf_unfiltered (gdb_stderr,
"Couldn't read float regs from core file\n");
}
}
static struct core_fns sun3_core_fns =
{
bfd_target_unknown_flavour,
default_check_format,
default_core_sniffer,
fetch_core_registers,
NULL
};
void
_initialize_core_sun3 (void)
{
add_core_fns (&sun3_core_fns);
}