2003-11-16 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
524d7c18
AC
106 bcopy (&mips_greg_packet[MIPS_R_GP0], &deprecated_registers[0],
107 32 * MIPS_GREG_SIZE);
c5aa993b 108
c906108c 109 /* Copy SR, LO, HI, and PC. */
c5aa993b 110
c906108c 111 bcopy (&mips_greg_packet[MIPS_R_SR],
62700349 112 &deprecated_registers[DEPRECATED_REGISTER_BYTE (PS_REGNUM)], MIPS_GREG_SIZE);
c906108c 113 bcopy (&mips_greg_packet[MIPS_R_LO],
62700349 114 &deprecated_registers[DEPRECATED_REGISTER_BYTE (LO_REGNUM)], MIPS_GREG_SIZE);
c906108c 115 bcopy (&mips_greg_packet[MIPS_R_HI],
62700349 116 &deprecated_registers[DEPRECATED_REGISTER_BYTE (HI_REGNUM)], MIPS_GREG_SIZE);
c906108c 117 bcopy (&mips_greg_packet[MIPS_R_PC],
62700349 118 &deprecated_registers[DEPRECATED_REGISTER_BYTE (PC_REGNUM)], MIPS_GREG_SIZE);
c5aa993b 119
c906108c
SS
120 /* If the target has floating point registers, fetch them.
121 Otherwise, zero the floating point register values in
122 registers[] for good measure, even though we might not
123 need to. */
c5aa993b 124
c906108c
SS
125 if (target_has_fp)
126 {
127 net_read_registers (mips_fpreg_packet, MIPS_FPREG_PLEN,
128 PTRACE_GETFPREGS);
129
130 /* Copy the floating point registers. */
131
c5aa993b 132 bcopy (&mips_fpreg_packet[MIPS_R_FP0],
62700349 133 &deprecated_registers[DEPRECATED_REGISTER_BYTE (FP0_REGNUM)],
12c266ea 134 DEPRECATED_REGISTER_RAW_SIZE (FP0_REGNUM) * 32);
c906108c
SS
135
136 /* Copy the floating point control/status register (fpcsr). */
137
c5aa993b 138 bcopy (&mips_fpreg_packet[MIPS_R_FPCSR],
62700349 139 &deprecated_registers[DEPRECATED_REGISTER_BYTE (FCRCS_REGNUM)],
12c266ea 140 DEPRECATED_REGISTER_RAW_SIZE (FCRCS_REGNUM));
c5aa993b 141 }
c906108c 142 else
c5aa993b 143 {
4deab737 144 memset (&deprecated_registers[DEPRECATED_REGISTER_BYTE (FP0_REGNUM)],
12c266ea 145 0, DEPRECATED_REGISTER_RAW_SIZE (FP0_REGNUM) * 32);
4deab737 146 memset (&deprecated_registers[DEPRECATED_REGISTER_BYTE (FCRCS_REGNUM)],
12c266ea 147 0, DEPRECATED_REGISTER_RAW_SIZE (FCRCS_REGNUM));
c5aa993b 148 }
c906108c
SS
149
150 /* Mark the register cache valid. */
151
2b9e5f3f 152 deprecated_registers_fetched ();
c906108c
SS
153}
154
155/* Store a register or registers into the VxWorks target.
156 REGNO is the register to store, or -1 for all; currently,
157 it is ignored. FIXME look at regno to improve efficiency. */
158
fba45db2 159vx_write_register (int regno)
c906108c
SS
160{
161 char mips_greg_packet[MIPS_GREG_PLEN];
162 char mips_fpreg_packet[MIPS_FPREG_PLEN];
163
164 /* Store general registers. */
165
524d7c18
AC
166 bcopy (&deprecated_registers[0], &mips_greg_packet[MIPS_R_GP0],
167 32 * MIPS_GREG_SIZE);
c5aa993b 168
c906108c 169 /* Copy SR, LO, HI, and PC. */
c5aa993b 170
62700349 171 bcopy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (PS_REGNUM)],
c5aa993b 172 &mips_greg_packet[MIPS_R_SR], MIPS_GREG_SIZE);
62700349 173 bcopy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (LO_REGNUM)],
c5aa993b 174 &mips_greg_packet[MIPS_R_LO], MIPS_GREG_SIZE);
62700349 175 bcopy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (HI_REGNUM)],
c5aa993b 176 &mips_greg_packet[MIPS_R_HI], MIPS_GREG_SIZE);
62700349 177 bcopy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (PC_REGNUM)],
c5aa993b
JM
178 &mips_greg_packet[MIPS_R_PC], MIPS_GREG_SIZE);
179
c906108c
SS
180 net_write_registers (mips_greg_packet, MIPS_GREG_PLEN, PTRACE_SETREGS);
181
182 /* Store floating point registers if the target has them. */
183
184 if (target_has_fp)
185 {
186 /* Copy the floating point data registers. */
187
62700349 188 bcopy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (FP0_REGNUM)],
c5aa993b 189 &mips_fpreg_packet[MIPS_R_FP0],
12c266ea 190 DEPRECATED_REGISTER_RAW_SIZE (FP0_REGNUM) * 32);
c906108c
SS
191
192 /* Copy the floating point control/status register (fpcsr). */
193
62700349 194 bcopy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (FCRCS_REGNUM)],
c5aa993b 195 &mips_fpreg_packet[MIPS_R_FPCSR],
12c266ea 196 DEPRECATED_REGISTER_RAW_SIZE (FCRCS_REGNUM));
c906108c
SS
197
198 net_write_registers (mips_fpreg_packet, MIPS_FPREG_PLEN,
199 PTRACE_SETFPREGS);
200 }
201}
This page took 0.354819 seconds and 4 git commands to generate.