2002-10-25 Andrew Cagney <cagney@redhat.com>
[deliverable/binutils-gdb.git] / gdb / remote-vxmips.c
CommitLineData
c906108c
SS
1/* MIPS-dependent portions of the RPC protocol
2 used with a VxWorks target
3
c5aa993b 4 Contributed by Wind River Systems.
c906108c 5
c5aa993b 6 This file is part of GDB.
c906108c 7
c5aa993b
JM
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
c906108c 12
c5aa993b
JM
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
c906108c 17
c5aa993b
JM
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
c906108c
SS
22
23#include <stdio.h>
24#include "defs.h"
25
c5aa993b 26#include "vx-share/regPacket.h"
c906108c
SS
27#include "frame.h"
28#include "inferior.h"
c906108c
SS
29#include "target.h"
30#include "gdbcore.h"
31#include "command.h"
32#include "symtab.h"
72367fb4 33#include "symfile.h"
4e052eda 34#include "regcache.h"
c906108c
SS
35
36#include "gdb_string.h"
37#include <errno.h>
c906108c
SS
38#include <fcntl.h>
39#include <sys/types.h>
40#include <sys/time.h>
41#include <sys/socket.h>
42#include <rpc/rpc.h>
43#include <sys/time.h> /* UTek's <rpc/rpc.h> doesn't #incl this */
44#include <netdb.h>
45#include "vx-share/ptrace.h"
46#include "vx-share/xdr_ptrace.h"
47#include "vx-share/xdr_ld.h"
48#include "vx-share/xdr_rdb.h"
49#include "vx-share/dbgRpcLib.h"
50
51/* get rid of value.h if possible */
52#include <value.h>
53#include <symtab.h>
54
55/* Flag set if target has fpu */
56
57extern int target_has_fp;
58
59/* Generic register read/write routines in remote-vx.c. */
60
61extern void net_read_registers ();
62extern void net_write_registers ();
63
64/* Read a register or registers from the VxWorks target.
65 REGNO is the register to read, or -1 for all; currently,
66 it is ignored. FIXME look at regno to improve efficiency. */
67
68void
fba45db2 69vx_read_register (int regno)
c906108c
SS
70{
71 char mips_greg_packet[MIPS_GREG_PLEN];
72 char mips_fpreg_packet[MIPS_FPREG_PLEN];
73
74 /* Get general-purpose registers. */
75
76 net_read_registers (mips_greg_packet, MIPS_GREG_PLEN, PTRACE_GETREGS);
77
78 /* this code copies the registers obtained by RPC
79 stored in a structure(s) like this :
c5aa993b
JM
80
81 Register(s) Offset(s)
82 gp 0-31 0x00
83 hi 0x80
84 lo 0x84
85 sr 0x88
86 pc 0x8c
87
c906108c 88 into a stucture like this:
c5aa993b
JM
89
90 0x00 GP 0-31
91 0x80 SR
92 0x84 LO
93 0x88 HI
94 0x8C BAD --- Not available currently
95 0x90 CAUSE --- Not available currently
96 0x94 PC
97 0x98 FP 0-31
98 0x118 FCSR
99 0x11C FIR --- Not available currently
100 0x120 FP --- Not available currently
101
c906108c 102 structure is 0x124 (292) bytes in length */
c5aa993b 103
c906108c 104 /* Copy the general registers. */
c5aa993b 105
c906108c 106 bcopy (&mips_greg_packet[MIPS_R_GP0], &registers[0], 32 * MIPS_GREG_SIZE);
c5aa993b 107
c906108c 108 /* Copy SR, LO, HI, and PC. */
c5aa993b 109
c906108c 110 bcopy (&mips_greg_packet[MIPS_R_SR],
c5aa993b 111 &registers[REGISTER_BYTE (PS_REGNUM)], MIPS_GREG_SIZE);
c906108c 112 bcopy (&mips_greg_packet[MIPS_R_LO],
c5aa993b 113 &registers[REGISTER_BYTE (LO_REGNUM)], MIPS_GREG_SIZE);
c906108c 114 bcopy (&mips_greg_packet[MIPS_R_HI],
c5aa993b 115 &registers[REGISTER_BYTE (HI_REGNUM)], MIPS_GREG_SIZE);
c906108c 116 bcopy (&mips_greg_packet[MIPS_R_PC],
c5aa993b
JM
117 &registers[REGISTER_BYTE (PC_REGNUM)], MIPS_GREG_SIZE);
118
c906108c
SS
119 /* If the target has floating point registers, fetch them.
120 Otherwise, zero the floating point register values in
121 registers[] for good measure, even though we might not
122 need to. */
c5aa993b 123
c906108c
SS
124 if (target_has_fp)
125 {
126 net_read_registers (mips_fpreg_packet, MIPS_FPREG_PLEN,
127 PTRACE_GETFPREGS);
128
129 /* Copy the floating point registers. */
130
c5aa993b 131 bcopy (&mips_fpreg_packet[MIPS_R_FP0],
c906108c
SS
132 &registers[REGISTER_BYTE (FP0_REGNUM)],
133 REGISTER_RAW_SIZE (FP0_REGNUM) * 32);
134
135 /* Copy the floating point control/status register (fpcsr). */
136
c5aa993b 137 bcopy (&mips_fpreg_packet[MIPS_R_FPCSR],
c906108c
SS
138 &registers[REGISTER_BYTE (FCRCS_REGNUM)],
139 REGISTER_RAW_SIZE (FCRCS_REGNUM));
c5aa993b 140 }
c906108c 141 else
c5aa993b 142 {
c906108c
SS
143 bzero ((char *) &registers[REGISTER_BYTE (FP0_REGNUM)],
144 REGISTER_RAW_SIZE (FP0_REGNUM) * 32);
145 bzero ((char *) &registers[REGISTER_BYTE (FCRCS_REGNUM)],
146 REGISTER_RAW_SIZE (FCRCS_REGNUM));
c5aa993b 147 }
c906108c
SS
148
149 /* Mark the register cache valid. */
150
151 registers_fetched ();
152}
153
154/* Store a register or registers into the VxWorks target.
155 REGNO is the register to store, or -1 for all; currently,
156 it is ignored. FIXME look at regno to improve efficiency. */
157
fba45db2 158vx_write_register (int regno)
c906108c
SS
159{
160 char mips_greg_packet[MIPS_GREG_PLEN];
161 char mips_fpreg_packet[MIPS_FPREG_PLEN];
162
163 /* Store general registers. */
164
165 bcopy (&registers[0], &mips_greg_packet[MIPS_R_GP0], 32 * MIPS_GREG_SIZE);
c5aa993b 166
c906108c 167 /* Copy SR, LO, HI, and PC. */
c5aa993b 168
c906108c 169 bcopy (&registers[REGISTER_BYTE (PS_REGNUM)],
c5aa993b 170 &mips_greg_packet[MIPS_R_SR], MIPS_GREG_SIZE);
c906108c 171 bcopy (&registers[REGISTER_BYTE (LO_REGNUM)],
c5aa993b 172 &mips_greg_packet[MIPS_R_LO], MIPS_GREG_SIZE);
c906108c 173 bcopy (&registers[REGISTER_BYTE (HI_REGNUM)],
c5aa993b 174 &mips_greg_packet[MIPS_R_HI], MIPS_GREG_SIZE);
c906108c 175 bcopy (&registers[REGISTER_BYTE (PC_REGNUM)],
c5aa993b
JM
176 &mips_greg_packet[MIPS_R_PC], MIPS_GREG_SIZE);
177
c906108c
SS
178 net_write_registers (mips_greg_packet, MIPS_GREG_PLEN, PTRACE_SETREGS);
179
180 /* Store floating point registers if the target has them. */
181
182 if (target_has_fp)
183 {
184 /* Copy the floating point data registers. */
185
186 bcopy (&registers[REGISTER_BYTE (FP0_REGNUM)],
c5aa993b 187 &mips_fpreg_packet[MIPS_R_FP0],
c906108c
SS
188 REGISTER_RAW_SIZE (FP0_REGNUM) * 32);
189
190 /* Copy the floating point control/status register (fpcsr). */
191
192 bcopy (&registers[REGISTER_BYTE (FCRCS_REGNUM)],
c5aa993b 193 &mips_fpreg_packet[MIPS_R_FPCSR],
c906108c
SS
194 REGISTER_RAW_SIZE (FCRCS_REGNUM));
195
196 net_write_registers (mips_fpreg_packet, MIPS_FPREG_PLEN,
197 PTRACE_SETFPREGS);
198 }
199}
This page took 0.345199 seconds and 4 git commands to generate.