#include <stdio.h>
#include "defs.h"
#include "vx-share/regPacket.h"
#include "frame.h"
#include "inferior.h"
#include "target.h"
#include "gdbcore.h"
#include "command.h"
#include "symtab.h"
#include "symfile.h"
#include "regcache.h"
#include "gdb_string.h"
#include <errno.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/socket.h>
#ifdef _AIX
#define malloc bogon_malloc
#endif
#include <rpc/rpc.h>
#include <sys/time.h>
#include <netdb.h>
#include "vx-share/ptrace.h"
#include "vx-share/xdr_ptrace.h"
#include "vx-share/xdr_ld.h"
#include "vx-share/xdr_rdb.h"
#include "vx-share/dbgRpcLib.h"
#include <value.h>
#include <symtab.h>
extern int target_has_fp;
extern struct ext_format ext_format_sparc;
extern void net_read_registers ();
extern void net_write_registers ();
void
vx_read_register (int regno)
{
char sparc_greg_packet[SPARC_GREG_PLEN];
char sparc_fpreg_packet[SPARC_FPREG_PLEN];
CORE_ADDR sp;
net_read_registers (sparc_greg_packet, SPARC_GREG_PLEN, PTRACE_GETREGS);
bcopy (&sparc_greg_packet[SPARC_R_G0],
®isters[REGISTER_BYTE (G0_REGNUM)], 32 * SPARC_GREG_SIZE);
bcopy (&sparc_greg_packet[SPARC_R_Y],
®isters[REGISTER_BYTE (Y_REGNUM)], 6 * SPARC_GREG_SIZE);
sp = extract_address (®isters[REGISTER_BYTE (SP_REGNUM)],
REGISTER_RAW_SIZE (SP_REGNUM));
write_memory (sp, ®isters[REGISTER_BYTE (L0_REGNUM)],
16 * REGISTER_RAW_SIZE (L0_REGNUM));
if (target_has_fp)
{
net_read_registers (sparc_fpreg_packet, SPARC_FPREG_PLEN,
PTRACE_GETFPREGS);
bcopy (&sparc_fpreg_packet[SPARC_R_FP0],
®isters[REGISTER_BYTE (FP0_REGNUM)], 32 * SPARC_FPREG_SIZE);
bcopy (&sparc_fpreg_packet[SPARC_R_FSR],
®isters[REGISTER_BYTE (FPS_REGNUM)], 1 * SPARC_FPREG_SIZE);
}
else
{
bzero (®isters[REGISTER_BYTE (FP0_REGNUM)], 32 * SPARC_FPREG_SIZE);
bzero (®isters[REGISTER_BYTE (FPS_REGNUM)], 1 * SPARC_FPREG_SIZE);
}
registers_fetched ();
}
void
vx_write_register (int regno)
{
char sparc_greg_packet[SPARC_GREG_PLEN];
char sparc_fpreg_packet[SPARC_FPREG_PLEN];
int in_gp_regs;
int in_fp_regs;
CORE_ADDR sp;
in_gp_regs = 1;
in_fp_regs = 1;
if (regno >= 0)
{
if ((G0_REGNUM <= regno && regno <= I7_REGNUM)
|| (Y_REGNUM <= regno && regno <= NPC_REGNUM))
in_fp_regs = 0;
else
in_gp_regs = 0;
}
if (in_gp_regs)
{
bcopy (®isters[REGISTER_BYTE (G0_REGNUM)],
&sparc_greg_packet[SPARC_R_G0], 32 * SPARC_GREG_SIZE);
bcopy (®isters[REGISTER_BYTE (Y_REGNUM)],
&sparc_greg_packet[SPARC_R_Y], 6 * SPARC_GREG_SIZE);
net_write_registers (sparc_greg_packet, SPARC_GREG_PLEN, PTRACE_SETREGS);
if (regno < 0 || (L0_REGNUM <= regno && regno <= I7_REGNUM))
{
sp = extract_address (®isters[REGISTER_BYTE (SP_REGNUM)],
REGISTER_RAW_SIZE (SP_REGNUM));
write_memory (sp, ®isters[REGISTER_BYTE (L0_REGNUM)],
16 * REGISTER_RAW_SIZE (L0_REGNUM));
}
}
if (in_fp_regs && target_has_fp)
{
bcopy (®isters[REGISTER_BYTE (FP0_REGNUM)],
&sparc_fpreg_packet[SPARC_R_FP0], 32 * SPARC_FPREG_SIZE);
bcopy (®isters[REGISTER_BYTE (FPS_REGNUM)],
&sparc_fpreg_packet[SPARC_R_FSR], 1 * SPARC_FPREG_SIZE);
net_write_registers (sparc_fpreg_packet, SPARC_FPREG_PLEN,
PTRACE_SETFPREGS);
}
}