/* i80960-dependent portions of the RPC protocol
   used with a VxWorks target 

   Contributed by Wind River Systems.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.  */

#include <stdio.h>
#include "defs.h"

#include "vx-share/regPacket.h"
#include "frame.h"
#include "inferior.h"
#include "gdb_wait.h"
#include "target.h"
#include "gdbcore.h"
#include "command.h"
#include "symtab.h"
#include "symfile.h"		/* for struct complaint */

#include "gdb_string.h"
#include <errno.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/socket.h>

#ifdef _AIX			/* IBM claims "void *malloc()" not char * */
#define malloc bogon_malloc
#endif

#include <rpc/rpc.h>
#include <sys/time.h>		/* UTek's <rpc/rpc.h> doesn't #incl this */
#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"

/* get rid of value.h if possible */
#include <value.h>
#include <symtab.h>

/* Flag set if target has fpu */

extern int target_has_fp;

/* 960 floating point format descriptor, from "i960-tdep.c."  */

extern struct ext_format ext_format_i960;

/* Generic register read/write routines in remote-vx.c.  */

extern void net_read_registers ();
extern void net_write_registers ();

/* Read a register or registers from the VxWorks target.
   REGNO is the register to read, or -1 for all; currently,
   it is ignored.  FIXME look at regno to improve efficiency.  */

void
vx_read_register (regno)
     int regno;
{
  char i960_greg_packet[I960_GREG_PLEN];
  char i960_fpreg_packet[I960_FPREG_PLEN];

  /* Get general-purpose registers.  When copying values into
     registers [], don't assume that a location in registers []
     is properly aligned for the target data type.  */

  net_read_registers (i960_greg_packet, I960_GREG_PLEN, PTRACE_GETREGS);

  bcopy (&i960_greg_packet[I960_R_R0],
	 &registers[REGISTER_BYTE (R0_REGNUM)], 16 * I960_GREG_SIZE);
  bcopy (&i960_greg_packet[I960_R_G0],
	 &registers[REGISTER_BYTE (G0_REGNUM)], 16 * I960_GREG_SIZE);
  bcopy (&i960_greg_packet[I960_R_PCW],
	 &registers[REGISTER_BYTE (PCW_REGNUM)], sizeof (int));
  bcopy (&i960_greg_packet[I960_R_ACW],
	 &registers[REGISTER_BYTE (ACW_REGNUM)], sizeof (int));
  bcopy (&i960_greg_packet[I960_R_TCW],
	 &registers[REGISTER_BYTE (TCW_REGNUM)], sizeof (int));

  /* If the target has floating point registers, fetch them.
     Otherwise, zero the floating point register values in
     registers[] for good measure, even though we might not
     need to.  */

  if (target_has_fp)
    {
      net_read_registers (i960_fpreg_packet, I960_FPREG_PLEN,
			  PTRACE_GETFPREGS);
      bcopy (&i960_fpreg_packet[I960_R_FP0],
	     &registers[REGISTER_BYTE (FP0_REGNUM)],
	     REGISTER_RAW_SIZE (FP0_REGNUM) * 4);
    }
  else
    bzero (&registers[REGISTER_BYTE (FP0_REGNUM)],
	   REGISTER_RAW_SIZE (FP0_REGNUM) * 4);

  /* Mark the register cache valid.  */

  registers_fetched ();
}

/* Store a register or registers into the VxWorks target.
   REGNO is the register to store, or -1 for all; currently,
   it is ignored.  FIXME look at regno to improve efficiency.  */

void
vx_write_register (regno)
     int regno;
{
  char i960_greg_packet[I960_GREG_PLEN];
  char i960_fpreg_packet[I960_FPREG_PLEN];

  /* Store floating-point registers.  When copying values from
     registers [], don't assume that a location in registers []
     is properly aligned for the target data type.  */

  bcopy (&registers[REGISTER_BYTE (R0_REGNUM)],
	 &i960_greg_packet[I960_R_R0], 16 * I960_GREG_SIZE);
  bcopy (&registers[REGISTER_BYTE (G0_REGNUM)],
	 &i960_greg_packet[I960_R_G0], 16 * I960_GREG_SIZE);
  bcopy (&registers[REGISTER_BYTE (PCW_REGNUM)],
	 &i960_greg_packet[I960_R_PCW], sizeof (int));
  bcopy (&registers[REGISTER_BYTE (ACW_REGNUM)],
	 &i960_greg_packet[I960_R_ACW], sizeof (int));
  bcopy (&registers[REGISTER_BYTE (TCW_REGNUM)],
	 &i960_greg_packet[I960_R_TCW], sizeof (int));

  net_write_registers (i960_greg_packet, I960_GREG_PLEN, PTRACE_SETREGS);

  /* Store floating point registers if the target has them.  */

  if (target_has_fp)
    {
      bcopy (&registers[REGISTER_BYTE (FP0_REGNUM)],
	     &i960_fpreg_packet[I960_R_FP0],
	     REGISTER_RAW_SIZE (FP0_REGNUM) * 4);

      net_write_registers (i960_fpreg_packet, I960_FPREG_PLEN,
			   PTRACE_SETFPREGS);
    }
}
