Protoization.
[deliverable/binutils-gdb.git] / gdb / remote-vx29k.c
CommitLineData
c906108c
SS
1/* Am29k-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"
03f2053f 29#include "gdb_wait.h"
c906108c
SS
30#include "target.h"
31#include "gdbcore.h"
32#include "command.h"
33#include "symtab.h"
34#include "symfile.h" /* for struct complaint */
35
36#include "gdb_string.h"
37#include <errno.h>
38#include <signal.h>
39#include <fcntl.h>
40#include <sys/types.h>
41#include <sys/time.h>
42#include <sys/socket.h>
43
c5aa993b 44#ifdef _AIX /* IBM claims "void *malloc()" not char * */
c906108c
SS
45#define malloc bogon_malloc
46#endif
47
48#include <rpc/rpc.h>
49#include <sys/time.h> /* UTek's <rpc/rpc.h> doesn't #incl this */
50#include <netdb.h>
51#include "vx-share/ptrace.h"
52#include "vx-share/xdr_ptrace.h"
53#include "vx-share/xdr_ld.h"
54#include "vx-share/xdr_rdb.h"
55#include "vx-share/dbgRpcLib.h"
56
57/* get rid of value.h if possible */
58#include <value.h>
59#include <symtab.h>
60
61/* Flag set if target has fpu */
62
63extern int target_has_fp;
64
65/* Generic register read/write routines in remote-vx.c. */
66
67extern void net_read_registers ();
68extern void net_write_registers ();
69
70/* Read a register or registers from the VxWorks target.
71 REGNO is the register to read, or -1 for all; currently,
72 it is ignored. FIXME look at regno to improve efficiency. */
73
74void
fba45db2 75vx_read_register (int regno)
c906108c
SS
76{
77 char am29k_greg_packet[AM29K_GREG_PLEN];
78 char am29k_fpreg_packet[AM29K_FPREG_PLEN];
79
80 /* Get general-purpose registers. When copying values into
81 registers [], don't assume that a location in registers []
82 is properly aligned for the target data type. */
83
84 net_read_registers (am29k_greg_packet, AM29K_GREG_PLEN, PTRACE_GETREGS);
85
86 /* Now copy the register values into registers[].
87 Note that this code depends on the ordering of the REGNUMs
88 as defined in "tm-29k.h". */
89
90 bcopy (&am29k_greg_packet[AM29K_R_GR96],
91 &registers[REGISTER_BYTE (GR96_REGNUM)], 160 * AM29K_GREG_SIZE);
92 bcopy (&am29k_greg_packet[AM29K_R_VAB],
93 &registers[REGISTER_BYTE (VAB_REGNUM)], 15 * AM29K_GREG_SIZE);
94 registers[REGISTER_BYTE (INTE_REGNUM)] = am29k_greg_packet[AM29K_R_INTE];
95 bcopy (&am29k_greg_packet[AM29K_R_RSP],
96 &registers[REGISTER_BYTE (GR1_REGNUM)], 5 * AM29K_GREG_SIZE);
97
98 /* PAD For now, don't care about exop register */
99
100 memset (&registers[REGISTER_BYTE (EXO_REGNUM)], '\0', AM29K_GREG_SIZE);
101
102 /* If the target has floating point registers, fetch them.
103 Otherwise, zero the floating point register values in
104 registers[] for good measure, even though we might not
105 need to. */
106
107 if (target_has_fp)
108 {
109 net_read_registers (am29k_fpreg_packet, AM29K_FPREG_PLEN,
c5aa993b 110 PTRACE_GETFPREGS);
c906108c
SS
111 registers[REGISTER_BYTE (FPE_REGNUM)] = am29k_fpreg_packet[AM29K_R_FPE];
112 registers[REGISTER_BYTE (FPS_REGNUM)] = am29k_fpreg_packet[AM29K_R_FPS];
113
114 /* PAD For now, don't care about registers (?) AI0 to q */
115
116 memset (&registers[REGISTER_BYTE (161)], '\0', 21 * AM29K_FPREG_SIZE);
117 }
118 else
c5aa993b 119 {
c906108c
SS
120 memset (&registers[REGISTER_BYTE (FPE_REGNUM)], '\0', AM29K_FPREG_SIZE);
121 memset (&registers[REGISTER_BYTE (FPS_REGNUM)], '\0', AM29K_FPREG_SIZE);
122
123 /* PAD For now, don't care about registers (?) AI0 to q */
124
125 memset (&registers[REGISTER_BYTE (161)], '\0', 21 * AM29K_FPREG_SIZE);
126 }
127
128 /* Mark the register cache valid. */
129
130 registers_fetched ();
131}
132
133/* Store a register or registers into the VxWorks target.
134 REGNO is the register to store, or -1 for all; currently,
135 it is ignored. FIXME look at regno to improve efficiency. */
136
137void
fba45db2 138vx_write_register (int regno)
c906108c
SS
139{
140 char am29k_greg_packet[AM29K_GREG_PLEN];
141 char am29k_fpreg_packet[AM29K_FPREG_PLEN];
142
143 /* Store general purpose registers. When copying values from
144 registers [], don't assume that a location in registers []
145 is properly aligned for the target data type. */
146
147 bcopy (&registers[REGISTER_BYTE (GR96_REGNUM)],
148 &am29k_greg_packet[AM29K_R_GR96], 160 * AM29K_GREG_SIZE);
149 bcopy (&registers[REGISTER_BYTE (VAB_REGNUM)],
150 &am29k_greg_packet[AM29K_R_VAB], 15 * AM29K_GREG_SIZE);
151 am29k_greg_packet[AM29K_R_INTE] = registers[REGISTER_BYTE (INTE_REGNUM)];
152 bcopy (&registers[REGISTER_BYTE (GR1_REGNUM)],
153 &am29k_greg_packet[AM29K_R_RSP], 5 * AM29K_GREG_SIZE);
154
155 net_write_registers (am29k_greg_packet, AM29K_GREG_PLEN, PTRACE_SETREGS);
156
157 /* Store floating point registers if the target has them. */
158
159 if (target_has_fp)
160 {
161 am29k_fpreg_packet[AM29K_R_FPE] = registers[REGISTER_BYTE (FPE_REGNUM)];
162 am29k_fpreg_packet[AM29K_R_FPS] = registers[REGISTER_BYTE (FPS_REGNUM)];
163
164 net_write_registers (am29k_fpreg_packet, AM29K_FPREG_PLEN,
c5aa993b 165 PTRACE_SETFPREGS);
c906108c
SS
166 }
167}
168
169/* VxWorks zeroes fp when the task is initialized; we use this
170 to terminate the frame chain. Chain means here the nominal address of
171 a frame, that is, the return address (lr0) address in the stack. To
172 obtain the frame pointer (lr1) contents, we must add 4 bytes.
173 Note : may be we should modify init_frame_info() to get the frame pointer
c5aa993b
JM
174 and store it into the frame_info struct rather than reading its
175 contents when FRAME_CHAIN_VALID is invoked. */
c906108c
SS
176
177int
178vx29k_frame_chain_valid (chain, thisframe)
179 CORE_ADDR chain;
c5aa993b 180 struct frame_info *thisframe; /* not used here */
c906108c 181{
c5aa993b 182 int fp_contents;
c906108c 183
c5aa993b
JM
184 read_memory ((CORE_ADDR) (chain + 4), (char *) &fp_contents, 4);
185 return (fp_contents != 0);
c906108c 186}
This page took 0.084911 seconds and 4 git commands to generate.