Create new file regcache.h. Update all uses.
[deliverable/binutils-gdb.git] / gdb / remote-vxsparc.c
CommitLineData
c906108c
SS
1/* sparc-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"
33#include "symfile.h" /* for struct complaint */
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
c5aa993b 43#ifdef _AIX /* IBM claims "void *malloc()" not char * */
c906108c
SS
44#define malloc bogon_malloc
45#endif
46
47#include <rpc/rpc.h>
48#include <sys/time.h> /* UTek's <rpc/rpc.h> doesn't #incl this */
49#include <netdb.h>
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"
55
56/* get rid of value.h if possible */
57#include <value.h>
58#include <symtab.h>
59
60/* Flag set if target has fpu */
61
62extern int target_has_fp;
63
64/* sparc floating point format descriptor, from "sparc-tdep.c." */
65
66extern struct ext_format ext_format_sparc;
67
68/* Generic register read/write routines in remote-vx.c. */
69
70extern void net_read_registers ();
71extern void net_write_registers ();
72
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. */
76
77void
fba45db2 78vx_read_register (int regno)
c906108c
SS
79{
80 char sparc_greg_packet[SPARC_GREG_PLEN];
81 char sparc_fpreg_packet[SPARC_FPREG_PLEN];
82 CORE_ADDR sp;
83
84 /* Get general-purpose registers. When copying values into
85 registers [], don't assume that a location in registers []
86 is properly aligned for the target data type. */
87
88 net_read_registers (sparc_greg_packet, SPARC_GREG_PLEN, PTRACE_GETREGS);
89
90 /* Now copy the register values into registers[].
91 Note that this code depends on the ordering of the REGNUMs
92 as defined in "tm-sparc.h". */
93
94 bcopy (&sparc_greg_packet[SPARC_R_G0],
95 &registers[REGISTER_BYTE (G0_REGNUM)], 32 * SPARC_GREG_SIZE);
96 bcopy (&sparc_greg_packet[SPARC_R_Y],
97 &registers[REGISTER_BYTE (Y_REGNUM)], 6 * SPARC_GREG_SIZE);
98
99 /* Now write the local and in registers to the register window
100 spill area in the frame. VxWorks does not do this for the
101 active frame automatically; it greatly simplifies debugging
102 (FRAME_FIND_SAVED_REGS, in particular, depends on this). */
103
c5aa993b
JM
104 sp = extract_address (&registers[REGISTER_BYTE (SP_REGNUM)],
105 REGISTER_RAW_SIZE (CORE_ADDR));
c906108c
SS
106 write_memory (sp, &registers[REGISTER_BYTE (L0_REGNUM)],
107 16 * REGISTER_RAW_SIZE (L0_REGNUM));
108
109 /* If the target has floating point registers, fetch them.
110 Otherwise, zero the floating point register values in
111 registers[] for good measure, even though we might not
112 need to. */
113
114 if (target_has_fp)
115 {
116 net_read_registers (sparc_fpreg_packet, SPARC_FPREG_PLEN,
c5aa993b
JM
117 PTRACE_GETFPREGS);
118 bcopy (&sparc_fpreg_packet[SPARC_R_FP0],
119 &registers[REGISTER_BYTE (FP0_REGNUM)], 32 * SPARC_FPREG_SIZE);
c906108c
SS
120 bcopy (&sparc_fpreg_packet[SPARC_R_FSR],
121 &registers[REGISTER_BYTE (FPS_REGNUM)], 1 * SPARC_FPREG_SIZE);
122 }
123 else
c5aa993b 124 {
c906108c
SS
125 bzero (&registers[REGISTER_BYTE (FP0_REGNUM)], 32 * SPARC_FPREG_SIZE);
126 bzero (&registers[REGISTER_BYTE (FPS_REGNUM)], 1 * SPARC_FPREG_SIZE);
127 }
128
129 /* Mark the register cache valid. */
130
131 registers_fetched ();
132}
133
134/* Store a register or registers into the VxWorks target.
135 REGNO is the register to store, or -1 for all; currently,
136 it is ignored. FIXME look at regno to improve efficiency. */
137
138void
fba45db2 139vx_write_register (int regno)
c906108c
SS
140{
141 char sparc_greg_packet[SPARC_GREG_PLEN];
142 char sparc_fpreg_packet[SPARC_FPREG_PLEN];
143 int in_gp_regs;
144 int in_fp_regs;
145 CORE_ADDR sp;
146
147 /* Store general purpose registers. When copying values from
148 registers [], don't assume that a location in registers []
149 is properly aligned for the target data type. */
150
151 in_gp_regs = 1;
152 in_fp_regs = 1;
153 if (regno >= 0)
154 {
155 if ((G0_REGNUM <= regno && regno <= I7_REGNUM)
c5aa993b 156 || (Y_REGNUM <= regno && regno <= NPC_REGNUM))
c906108c
SS
157 in_fp_regs = 0;
158 else
159 in_gp_regs = 0;
160 }
161 if (in_gp_regs)
162 {
163 bcopy (&registers[REGISTER_BYTE (G0_REGNUM)],
164 &sparc_greg_packet[SPARC_R_G0], 32 * SPARC_GREG_SIZE);
165 bcopy (&registers[REGISTER_BYTE (Y_REGNUM)],
166 &sparc_greg_packet[SPARC_R_Y], 6 * SPARC_GREG_SIZE);
167
168 net_write_registers (sparc_greg_packet, SPARC_GREG_PLEN, PTRACE_SETREGS);
169
170 /* If this is a local or in register, or we're storing all
171 registers, update the register window spill area. */
172
173 if (regno < 0 || (L0_REGNUM <= regno && regno <= I7_REGNUM))
c5aa993b
JM
174 {
175 sp = extract_address (&registers[REGISTER_BYTE (SP_REGNUM)],
176 REGISTER_RAW_SIZE (CORE_ADDR));
c906108c
SS
177 write_memory (sp, &registers[REGISTER_BYTE (L0_REGNUM)],
178 16 * REGISTER_RAW_SIZE (L0_REGNUM));
179 }
180 }
181
182 /* Store floating point registers if the target has them. */
183
184 if (in_fp_regs && target_has_fp)
185 {
c5aa993b 186 bcopy (&registers[REGISTER_BYTE (FP0_REGNUM)],
c906108c 187 &sparc_fpreg_packet[SPARC_R_FP0], 32 * SPARC_FPREG_SIZE);
c5aa993b 188 bcopy (&registers[REGISTER_BYTE (FPS_REGNUM)],
c906108c
SS
189 &sparc_fpreg_packet[SPARC_R_FSR], 1 * SPARC_FPREG_SIZE);
190
191 net_write_registers (sparc_fpreg_packet, SPARC_FPREG_PLEN,
c5aa993b 192 PTRACE_SETFPREGS);
c906108c
SS
193 }
194}
This page took 0.155647 seconds and 4 git commands to generate.