1 /* sparc-dependent portions of the RPC protocol
2 used with a VxWorks target
4 Contributed by Wind River Systems.
6 This file is part of GDB.
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.
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.
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, Boston, MA 02111-1307, USA. */
25 #include "vx-share/regPacket.h"
33 #include "symfile.h" /* for struct complaint */
35 #include "gdb_string.h"
39 #include <sys/types.h>
41 #include <sys/socket.h>
43 #ifdef _AIX /* IBM claims "void *malloc()" not char * */
44 #define malloc bogon_malloc
48 #include <sys/time.h> /* UTek's <rpc/rpc.h> doesn't #incl this */
50 #include "vx-share/ptrace.h"
51 #include "vx-share/xdr_ptrace.h"
52 #include "vx-share/xdr_ld.h"
53 #include "vx-share/xdr_rdb.h"
54 #include "vx-share/dbgRpcLib.h"
56 /* get rid of value.h if possible */
60 /* Flag set if target has fpu */
62 extern int target_has_fp
;
64 /* sparc floating point format descriptor, from "sparc-tdep.c." */
66 extern struct ext_format ext_format_sparc
;
68 /* Generic register read/write routines in remote-vx.c. */
70 extern void net_read_registers ();
71 extern void net_write_registers ();
73 /* Read a register or registers from the VxWorks target.
74 REGNO is the register to read, or -1 for all; currently,
75 it is ignored. FIXME look at regno to improve efficiency. */
78 vx_read_register (regno
)
81 char sparc_greg_packet
[SPARC_GREG_PLEN
];
82 char sparc_fpreg_packet
[SPARC_FPREG_PLEN
];
85 /* Get general-purpose registers. When copying values into
86 registers [], don't assume that a location in registers []
87 is properly aligned for the target data type. */
89 net_read_registers (sparc_greg_packet
, SPARC_GREG_PLEN
, PTRACE_GETREGS
);
91 /* Now copy the register values into registers[].
92 Note that this code depends on the ordering of the REGNUMs
93 as defined in "tm-sparc.h". */
95 bcopy (&sparc_greg_packet
[SPARC_R_G0
],
96 ®isters
[REGISTER_BYTE (G0_REGNUM
)], 32 * SPARC_GREG_SIZE
);
97 bcopy (&sparc_greg_packet
[SPARC_R_Y
],
98 ®isters
[REGISTER_BYTE (Y_REGNUM
)], 6 * SPARC_GREG_SIZE
);
100 /* Now write the local and in registers to the register window
101 spill area in the frame. VxWorks does not do this for the
102 active frame automatically; it greatly simplifies debugging
103 (FRAME_FIND_SAVED_REGS, in particular, depends on this). */
105 sp
= extract_address (®isters
[REGISTER_BYTE (SP_REGNUM
)],
106 REGISTER_RAW_SIZE (CORE_ADDR
));
107 write_memory (sp
, ®isters
[REGISTER_BYTE (L0_REGNUM
)],
108 16 * REGISTER_RAW_SIZE (L0_REGNUM
));
110 /* If the target has floating point registers, fetch them.
111 Otherwise, zero the floating point register values in
112 registers[] for good measure, even though we might not
117 net_read_registers (sparc_fpreg_packet
, SPARC_FPREG_PLEN
,
119 bcopy (&sparc_fpreg_packet
[SPARC_R_FP0
],
120 ®isters
[REGISTER_BYTE (FP0_REGNUM
)], 32 * SPARC_FPREG_SIZE
);
121 bcopy (&sparc_fpreg_packet
[SPARC_R_FSR
],
122 ®isters
[REGISTER_BYTE (FPS_REGNUM
)], 1 * SPARC_FPREG_SIZE
);
126 bzero (®isters
[REGISTER_BYTE (FP0_REGNUM
)], 32 * SPARC_FPREG_SIZE
);
127 bzero (®isters
[REGISTER_BYTE (FPS_REGNUM
)], 1 * SPARC_FPREG_SIZE
);
130 /* Mark the register cache valid. */
132 registers_fetched ();
135 /* Store a register or registers into the VxWorks target.
136 REGNO is the register to store, or -1 for all; currently,
137 it is ignored. FIXME look at regno to improve efficiency. */
140 vx_write_register (regno
)
143 char sparc_greg_packet
[SPARC_GREG_PLEN
];
144 char sparc_fpreg_packet
[SPARC_FPREG_PLEN
];
149 /* Store general purpose registers. When copying values from
150 registers [], don't assume that a location in registers []
151 is properly aligned for the target data type. */
157 if ((G0_REGNUM
<= regno
&& regno
<= I7_REGNUM
)
158 || (Y_REGNUM
<= regno
&& regno
<= NPC_REGNUM
))
165 bcopy (®isters
[REGISTER_BYTE (G0_REGNUM
)],
166 &sparc_greg_packet
[SPARC_R_G0
], 32 * SPARC_GREG_SIZE
);
167 bcopy (®isters
[REGISTER_BYTE (Y_REGNUM
)],
168 &sparc_greg_packet
[SPARC_R_Y
], 6 * SPARC_GREG_SIZE
);
170 net_write_registers (sparc_greg_packet
, SPARC_GREG_PLEN
, PTRACE_SETREGS
);
172 /* If this is a local or in register, or we're storing all
173 registers, update the register window spill area. */
175 if (regno
< 0 || (L0_REGNUM
<= regno
&& regno
<= I7_REGNUM
))
177 sp
= extract_address (®isters
[REGISTER_BYTE (SP_REGNUM
)],
178 REGISTER_RAW_SIZE (CORE_ADDR
));
179 write_memory (sp
, ®isters
[REGISTER_BYTE (L0_REGNUM
)],
180 16 * REGISTER_RAW_SIZE (L0_REGNUM
));
184 /* Store floating point registers if the target has them. */
186 if (in_fp_regs
&& target_has_fp
)
188 bcopy (®isters
[REGISTER_BYTE (FP0_REGNUM
)],
189 &sparc_fpreg_packet
[SPARC_R_FP0
], 32 * SPARC_FPREG_SIZE
);
190 bcopy (®isters
[REGISTER_BYTE (FPS_REGNUM
)],
191 &sparc_fpreg_packet
[SPARC_R_FSR
], 1 * SPARC_FPREG_SIZE
);
193 net_write_registers (sparc_fpreg_packet
, SPARC_FPREG_PLEN
,
198 /* Convert from an extended float to a double.
199 The extended float is stored as raw data pointed to by FROM.
200 Return the converted value as raw data in the double pointed to by TO. */
203 vx_convert_to_virtual (regno
, from
, to
)
208 if (REGISTER_CONVERTIBLE (regno
))
211 ieee_extended_to_double (&ext_format_sparc
, from
, to
);
213 bzero (to
, sizeof (double));
216 bcopy (from
, to
, REGISTER_VIRTUAL_SIZE (regno
));
219 /* The converse: convert from a double to an extended float.
220 The double is stored as raw data pointed to by FROM.
221 Return the converted value as raw data in the extended
222 float pointed to by TO. */
225 vx_convert_from_virtual (regno
, from
, to
)
230 if (REGISTER_CONVERTIBLE (regno
))
233 double_to_ieee_extended (&ext_format_sparc
, from
, to
);
235 bzero (to
, REGISTER_RAW_SIZE (FP0_REGNUM
));
238 bcopy (from
, to
, REGISTER_VIRTUAL_SIZE (regno
));