1 /* 68k-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, Boston, MA 02111-1307, USA. */ 21 22 #include <stdio.h> 23 #include "defs.h" 24 25 #include "vx-share/regPacket.h" 26 #include "frame.h" 27 #include "inferior.h" 28 #include "wait.h" 29 #include "target.h" 30 #include "gdbcore.h" 31 #include "command.h" 32 #include "symtab.h" 33 #include "symfile.h" /* for struct complaint */ 34 35 #include "gdb_string.h" 36 #include <errno.h> 37 #include <signal.h> 38 #include <fcntl.h> 39 #include <sys/types.h> 40 #include <sys/time.h> 41 #include <sys/socket.h> 42 43 #ifdef _AIX /* IBM claims "void *malloc()" not char * */ 44 #define malloc bogon_malloc 45 #endif 46 47 #include <rpc/rpc.h> 48 49 #ifdef _AIX 50 #undef malloc 51 #endif 52 53 #include <sys/time.h> /* UTek's <rpc/rpc.h> doesn't #incl this */ 54 #include <netdb.h> 55 #include "vx-share/ptrace.h" 56 #include "vx-share/xdr_ptrace.h" 57 #include "vx-share/xdr_ld.h" 58 #include "vx-share/xdr_rdb.h" 59 #include "vx-share/dbgRpcLib.h" 60 61 /* get rid of value.h if possible */ 62 #include <value.h> 63 #include <symtab.h> 64 65 /* Flag set if target has fpu */ 66 67 extern int target_has_fp; 68 69 /* Generic register read/write routines in remote-vx.c. */ 70 71 extern void net_read_registers (); 72 extern void net_write_registers (); 73 74 /* Read a register or registers from the VxWorks target. 75 REGNO is the register to read, or -1 for all; currently, 76 it is ignored. FIXME look at regno to improve efficiency. */ 77 78 void 79 vx_read_register (regno) 80 int regno; 81 { 82 char mc68k_greg_packet[MC68K_GREG_PLEN]; 83 char mc68k_fpreg_packet[MC68K_FPREG_PLEN]; 84 85 /* Get general-purpose registers. */ 86 87 net_read_registers (mc68k_greg_packet, MC68K_GREG_PLEN, PTRACE_GETREGS); 88 89 bcopy (&mc68k_greg_packet[MC68K_R_D0], registers, 16 * MC68K_GREG_SIZE); 90 bcopy (&mc68k_greg_packet[MC68K_R_SR], ®isters[REGISTER_BYTE (PS_REGNUM)], 91 MC68K_GREG_SIZE); 92 bcopy (&mc68k_greg_packet[MC68K_R_PC], ®isters[REGISTER_BYTE (PC_REGNUM)], 93 MC68K_GREG_SIZE); 94 95 /* Get floating-point registers, if the target system has them. 96 Otherwise, zero them. */ 97 98 if (target_has_fp) 99 { 100 net_read_registers (mc68k_fpreg_packet, MC68K_FPREG_PLEN, 101 PTRACE_GETFPREGS); 102 103 bcopy (&mc68k_fpreg_packet[MC68K_R_FP0], 104 ®isters[REGISTER_BYTE (FP0_REGNUM)], 105 MC68K_FPREG_SIZE * 8); 106 bcopy (&mc68k_fpreg_packet[MC68K_R_FPCR], 107 ®isters[REGISTER_BYTE (FPC_REGNUM)], 108 MC68K_FPREG_PLEN - (MC68K_FPREG_SIZE * 8)); 109 } 110 else 111 { 112 bzero (®isters[REGISTER_BYTE (FP0_REGNUM)], 113 MC68K_FPREG_SIZE * 8); 114 bzero (®isters[REGISTER_BYTE (FPC_REGNUM)], 115 MC68K_FPREG_PLEN - (MC68K_FPREG_SIZE * 8)); 116 } 117 118 /* Mark the register cache valid. */ 119 120 registers_fetched (); 121 } 122 123 /* Store a register or registers into the VxWorks target. 124 REGNO is the register to store, or -1 for all; currently, 125 it is ignored. FIXME look at regno to improve efficiency. */ 126 127 void 128 vx_write_register (regno) 129 int regno; 130 { 131 char mc68k_greg_packet[MC68K_GREG_PLEN]; 132 char mc68k_fpreg_packet[MC68K_FPREG_PLEN]; 133 134 /* Store general-purpose registers. */ 135 136 bcopy (registers, &mc68k_greg_packet[MC68K_R_D0], 16 * MC68K_GREG_SIZE); 137 bcopy (®isters[REGISTER_BYTE (PS_REGNUM)], 138 &mc68k_greg_packet[MC68K_R_SR], MC68K_GREG_SIZE); 139 bcopy (®isters[REGISTER_BYTE (PC_REGNUM)], 140 &mc68k_greg_packet[MC68K_R_PC], MC68K_GREG_SIZE); 141 142 net_write_registers (mc68k_greg_packet, MC68K_GREG_PLEN, PTRACE_SETREGS); 143 144 /* Store floating point registers if the target has them. */ 145 146 if (target_has_fp) 147 { 148 bcopy (®isters[REGISTER_BYTE (FP0_REGNUM)], 149 &mc68k_fpreg_packet[MC68K_R_FP0], 150 MC68K_FPREG_SIZE * 8); 151 bcopy (®isters[REGISTER_BYTE (FPC_REGNUM)], 152 &mc68k_fpreg_packet[MC68K_R_FPCR], 153 MC68K_FPREG_PLEN - (MC68K_FPREG_SIZE * 8)); 154 155 net_write_registers (mc68k_fpreg_packet, MC68K_FPREG_PLEN, 156 PTRACE_SETFPREGS); 157 } 158 } 159