1 /* MIPS-dependent portions of the RPC protocol 2 used with a VxWorks target 3 4 Contributed by Wind River Systems. 5 6 This file is part of GDB. 7 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. 12 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. 17 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. */ 22 23 #include <stdio.h> 24 #include "defs.h" 25 26 #include "vx-share/regPacket.h" 27 #include "frame.h" 28 #include "inferior.h" 29 #include "target.h" 30 #include "gdbcore.h" 31 #include "command.h" 32 #include "symtab.h" 33 #include "symfile.h" 34 #include "regcache.h" 35 36 #include "gdb_string.h" 37 #include <errno.h> 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 57 extern int target_has_fp; 58 59 /* Generic register read/write routines in remote-vx.c. */ 60 61 extern void net_read_registers (); 62 extern 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 68 void 69 vx_read_register (int regno) 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 : 80 81 Register(s) Offset(s) 82 gp 0-31 0x00 83 hi 0x80 84 lo 0x84 85 sr 0x88 86 pc 0x8c 87 88 into a stucture like this: 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 102 structure is 0x124 (292) bytes in length */ 103 104 /* Copy the general registers. */ 105 106 memcpy (&deprecated_registers[0], &mips_greg_packet[MIPS_R_GP0], 107 32 * MIPS_GREG_SIZE); 108 109 /* Copy SR, LO, HI, and PC. */ 110 111 memcpy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (PS_REGNUM)], 112 &mips_greg_packet[MIPS_R_SR], 113 MIPS_GREG_SIZE); 114 memcpy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (mips_regnum (current_gdbarch)->lo)], 115 &mips_greg_packet[MIPS_R_LO], 116 MIPS_GREG_SIZE); 117 memcpy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (mips_regnum (current_gdbarch)->hi)], 118 &mips_greg_packet[MIPS_R_HI], 119 MIPS_GREG_SIZE); 120 memcpy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (mips_regnum (current_gdbarch)->pc)], 121 &mips_greg_packet[MIPS_R_PC], 122 MIPS_GREG_SIZE); 123 124 /* If the target has floating point registers, fetch them. 125 Otherwise, zero the floating point register values in 126 registers[] for good measure, even though we might not 127 need to. */ 128 129 if (target_has_fp) 130 { 131 net_read_registers (mips_fpreg_packet, MIPS_FPREG_PLEN, 132 PTRACE_GETFPREGS); 133 134 /* Copy the floating point registers. */ 135 136 memcpy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (FP0_REGNUM)], 137 &mips_fpreg_packet[MIPS_R_FP0], 138 register_size (current_gdbarch, FP0_REGNUM) * 32); 139 140 /* Copy the floating point control/status register (fpcsr). */ 141 142 memcpy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (mips_regnum (current_gdbarch)->fp_control_status)], 143 &mips_fpreg_packet[MIPS_R_FPCSR], 144 register_size (current_gdbarch, mips_regnum (current_gdbarch)->fp_control_status)); 145 } 146 else 147 { 148 memset (&deprecated_registers[DEPRECATED_REGISTER_BYTE (FP0_REGNUM)], 149 0, register_size (current_gdbarch, FP0_REGNUM) * 32); 150 memset (&deprecated_registers[DEPRECATED_REGISTER_BYTE (mips_regnum (current_gdbarch)->fp_control_status)], 151 0, register_size (current_gdbarch, mips_regnum (current_gdbarch)->fp_control_status)); 152 } 153 154 /* Mark the register cache valid. */ 155 156 deprecated_registers_fetched (); 157 } 158 159 /* Store a register or registers into the VxWorks target. 160 REGNO is the register to store, or -1 for all; currently, 161 it is ignored. FIXME look at regno to improve efficiency. */ 162 163 vx_write_register (int regno) 164 { 165 char mips_greg_packet[MIPS_GREG_PLEN]; 166 char mips_fpreg_packet[MIPS_FPREG_PLEN]; 167 168 /* Store general registers. */ 169 170 memcpy (&mips_greg_packet[MIPS_R_GP0], &deprecated_registers[0], 171 32 * MIPS_GREG_SIZE); 172 173 /* Copy SR, LO, HI, and PC. */ 174 175 memcpy (&mips_greg_packet[MIPS_R_SR], 176 &deprecated_registers[DEPRECATED_REGISTER_BYTE (PS_REGNUM)], 177 MIPS_GREG_SIZE); 178 memcpy (&mips_greg_packet[MIPS_R_LO], 179 &deprecated_registers[DEPRECATED_REGISTER_BYTE (mips_regnum (current_gdbarch)->lo)], 180 MIPS_GREG_SIZE); 181 memcpy (&mips_greg_packet[MIPS_R_HI], 182 &deprecated_registers[DEPRECATED_REGISTER_BYTE (mips_regnum (current_gdbarch)->hi)], 183 MIPS_GREG_SIZE); 184 memcpy (&mips_greg_packet[MIPS_R_PC], 185 &deprecated_registers[DEPRECATED_REGISTER_BYTE (mips_regnum (current_gdbarch)->pc)], 186 MIPS_GREG_SIZE); 187 188 net_write_registers (mips_greg_packet, MIPS_GREG_PLEN, PTRACE_SETREGS); 189 190 /* Store floating point registers if the target has them. */ 191 192 if (target_has_fp) 193 { 194 /* Copy the floating point data registers. */ 195 196 memcpy (&mips_fpreg_packet[MIPS_R_FP0], 197 &deprecated_registers[DEPRECATED_REGISTER_BYTE (FP0_REGNUM)], 198 register_size (current_gdbarch, FP0_REGNUM) * 32); 199 200 /* Copy the floating point control/status register (fpcsr). */ 201 202 memcpy (&mips_fpreg_packet[MIPS_R_FPCSR], 203 &deprecated_registers[DEPRECATED_REGISTER_BYTE (mips_regnum (current_gdbarch)->fp_control_status)], 204 register_size (current_gdbarch, mips_regnum (current_gdbarch)->fp_control_status)); 205 206 net_write_registers (mips_fpreg_packet, MIPS_FPREG_PLEN, 207 PTRACE_SETFPREGS); 208 } 209 } 210