1130812Smarcel/* 68k-dependent portions of the RPC protocol
2130812Smarcel   used with a VxWorks target
3130812Smarcel
4130812Smarcel   Contributed by Wind River Systems.
5130812Smarcel
6130812Smarcel   This file is part of GDB.
7130812Smarcel
8130812Smarcel   This program is free software; you can redistribute it and/or modify
9130812Smarcel   it under the terms of the GNU General Public License as published by
10130812Smarcel   the Free Software Foundation; either version 2 of the License, or
11130812Smarcel   (at your option) any later version.
12130812Smarcel
13130812Smarcel   This program is distributed in the hope that it will be useful,
14130812Smarcel   but WITHOUT ANY WARRANTY; without even the implied warranty of
15130812Smarcel   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16130812Smarcel   GNU General Public License for more details.
17130812Smarcel
18130812Smarcel   You should have received a copy of the GNU General Public License
19130812Smarcel   along with this program; if not, write to the Free Software
20130812Smarcel   Foundation, Inc., 59 Temple Place - Suite 330,
21130812Smarcel   Boston, MA 02111-1307, USA.  */
22130812Smarcel
23130812Smarcel#include <stdio.h>
24130812Smarcel#include "defs.h"
25130812Smarcel
26130812Smarcel#include "vx-share/regPacket.h"
27130812Smarcel#include "frame.h"
28130812Smarcel#include "inferior.h"
29130812Smarcel#include "target.h"
30130812Smarcel#include "gdbcore.h"
31130812Smarcel#include "command.h"
32130812Smarcel#include "symtab.h"
33130812Smarcel#include "symfile.h"
34130812Smarcel#include "regcache.h"
35130812Smarcel
36130812Smarcel#include "gdb_string.h"
37130812Smarcel#include <errno.h>
38130812Smarcel#include <fcntl.h>
39130812Smarcel#include <sys/types.h>
40130812Smarcel#include <sys/time.h>
41130812Smarcel#include <sys/socket.h>
42130812Smarcel
43130812Smarcel#ifdef _AIX			/* IBM claims "void *malloc()" not char * */
44130812Smarcel#define malloc bogon_malloc
45130812Smarcel#endif
46130812Smarcel
47130812Smarcel#include <rpc/rpc.h>
48130812Smarcel
49130812Smarcel#ifdef _AIX
50130812Smarcel#undef malloc
51130812Smarcel#endif
52130812Smarcel
53130812Smarcel#include <sys/time.h>		/* UTek's <rpc/rpc.h> doesn't #incl this */
54130812Smarcel#include <netdb.h>
55130812Smarcel#include "vx-share/ptrace.h"
56130812Smarcel#include "vx-share/xdr_ptrace.h"
57130812Smarcel#include "vx-share/xdr_ld.h"
58130812Smarcel#include "vx-share/xdr_rdb.h"
59130812Smarcel#include "vx-share/dbgRpcLib.h"
60130812Smarcel
61130812Smarcel/* get rid of value.h if possible */
62130812Smarcel#include <value.h>
63130812Smarcel#include <symtab.h>
64130812Smarcel
65130812Smarcel/* Flag set if target has fpu */
66130812Smarcel
67130812Smarcelextern int target_has_fp;
68130812Smarcel
69130812Smarcel/* Generic register read/write routines in remote-vx.c.  */
70130812Smarcel
71130812Smarcelextern void net_read_registers ();
72130812Smarcelextern void net_write_registers ();
73130812Smarcel
74130812Smarcel/* Read a register or registers from the VxWorks target.
75130812Smarcel   REGNO is the register to read, or -1 for all; currently,
76130812Smarcel   it is ignored.  FIXME look at regno to improve efficiency.  */
77130812Smarcel
78130812Smarcelvoid
79130812Smarcelvx_read_register (int regno)
80130812Smarcel{
81130812Smarcel  char mc68k_greg_packet[MC68K_GREG_PLEN];
82130812Smarcel  char mc68k_fpreg_packet[MC68K_FPREG_PLEN];
83130812Smarcel
84130812Smarcel  /* Get general-purpose registers.  */
85130812Smarcel
86130812Smarcel  net_read_registers (mc68k_greg_packet, MC68K_GREG_PLEN, PTRACE_GETREGS);
87130812Smarcel
88130812Smarcel  bcopy (&mc68k_greg_packet[MC68K_R_D0], deprecated_registers,
89130812Smarcel	 16 * MC68K_GREG_SIZE);
90130812Smarcel  bcopy (&mc68k_greg_packet[MC68K_R_SR],
91130812Smarcel	 &deprecated_registers[DEPRECATED_REGISTER_BYTE (PS_REGNUM)],
92130812Smarcel	 MC68K_GREG_SIZE);
93130812Smarcel  bcopy (&mc68k_greg_packet[MC68K_R_PC],
94130812Smarcel	 &deprecated_registers[DEPRECATED_REGISTER_BYTE (PC_REGNUM)],
95130812Smarcel	 MC68K_GREG_SIZE);
96130812Smarcel
97130812Smarcel  /* Get floating-point registers, if the target system has them.
98130812Smarcel     Otherwise, zero them.  */
99130812Smarcel
100130812Smarcel  if (target_has_fp)
101130812Smarcel    {
102130812Smarcel      net_read_registers (mc68k_fpreg_packet, MC68K_FPREG_PLEN,
103130812Smarcel			  PTRACE_GETFPREGS);
104130812Smarcel
105130812Smarcel      bcopy (&mc68k_fpreg_packet[MC68K_R_FP0],
106130812Smarcel	     &deprecated_registers[DEPRECATED_REGISTER_BYTE (FP0_REGNUM)],
107130812Smarcel	     MC68K_FPREG_SIZE * 8);
108130812Smarcel      bcopy (&mc68k_fpreg_packet[MC68K_R_FPCR],
109130812Smarcel	     &deprecated_registers[DEPRECATED_REGISTER_BYTE (FPC_REGNUM)],
110130812Smarcel	     MC68K_FPREG_PLEN - (MC68K_FPREG_SIZE * 8));
111130812Smarcel    }
112130812Smarcel  else
113130812Smarcel    {
114130812Smarcel      memset (&deprecated_registers[DEPRECATED_REGISTER_BYTE (FP0_REGNUM)],
115130812Smarcel	      0, MC68K_FPREG_SIZE * 8);
116130812Smarcel      memset (&deprecated_registers[DEPRECATED_REGISTER_BYTE (FPC_REGNUM)],
117130812Smarcel	      0, MC68K_FPREG_PLEN - (MC68K_FPREG_SIZE * 8));
118130812Smarcel    }
119130812Smarcel
120130812Smarcel  /* Mark the register cache valid.  */
121130812Smarcel
122130812Smarcel  deprecated_registers_fetched ();
123130812Smarcel}
124130812Smarcel
125130812Smarcel/* Store a register or registers into the VxWorks target.
126130812Smarcel   REGNO is the register to store, or -1 for all; currently,
127130812Smarcel   it is ignored.  FIXME look at regno to improve efficiency.  */
128130812Smarcel
129130812Smarcelvoid
130130812Smarcelvx_write_register (int regno)
131130812Smarcel{
132130812Smarcel  char mc68k_greg_packet[MC68K_GREG_PLEN];
133130812Smarcel  char mc68k_fpreg_packet[MC68K_FPREG_PLEN];
134130812Smarcel
135130812Smarcel  /* Store general-purpose registers.  */
136130812Smarcel
137130812Smarcel  bcopy (deprecated_registers, &mc68k_greg_packet[MC68K_R_D0],
138130812Smarcel	 16 * MC68K_GREG_SIZE);
139130812Smarcel  bcopy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (PS_REGNUM)],
140130812Smarcel	 &mc68k_greg_packet[MC68K_R_SR], MC68K_GREG_SIZE);
141130812Smarcel  bcopy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (PC_REGNUM)],
142130812Smarcel	 &mc68k_greg_packet[MC68K_R_PC], MC68K_GREG_SIZE);
143130812Smarcel
144130812Smarcel  net_write_registers (mc68k_greg_packet, MC68K_GREG_PLEN, PTRACE_SETREGS);
145130812Smarcel
146130812Smarcel  /* Store floating point registers if the target has them.  */
147130812Smarcel
148130812Smarcel  if (target_has_fp)
149130812Smarcel    {
150130812Smarcel      bcopy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (FP0_REGNUM)],
151130812Smarcel	     &mc68k_fpreg_packet[MC68K_R_FP0],
152130812Smarcel	     MC68K_FPREG_SIZE * 8);
153130812Smarcel      bcopy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (FPC_REGNUM)],
154130812Smarcel	     &mc68k_fpreg_packet[MC68K_R_FPCR],
155130812Smarcel	     MC68K_FPREG_PLEN - (MC68K_FPREG_SIZE * 8));
156130812Smarcel
157130812Smarcel      net_write_registers (mc68k_fpreg_packet, MC68K_FPREG_PLEN,
158130812Smarcel			   PTRACE_SETFPREGS);
159130812Smarcel    }
160130812Smarcel}
161