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, 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 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 67extern int target_has_fp; 68 69/* Generic register read/write routines in remote-vx.c. */ 70 71extern void net_read_registers (); 72extern 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 78void 79vx_read_register (int regno) 80{ 81 char mc68k_greg_packet[MC68K_GREG_PLEN]; 82 char mc68k_fpreg_packet[MC68K_FPREG_PLEN]; 83 84 /* Get general-purpose registers. */ 85 86 net_read_registers (mc68k_greg_packet, MC68K_GREG_PLEN, PTRACE_GETREGS); 87 88 bcopy (&mc68k_greg_packet[MC68K_R_D0], deprecated_registers, 89 16 * MC68K_GREG_SIZE); 90 bcopy (&mc68k_greg_packet[MC68K_R_SR], 91 &deprecated_registers[DEPRECATED_REGISTER_BYTE (PS_REGNUM)], 92 MC68K_GREG_SIZE); 93 bcopy (&mc68k_greg_packet[MC68K_R_PC], 94 &deprecated_registers[DEPRECATED_REGISTER_BYTE (PC_REGNUM)], 95 MC68K_GREG_SIZE); 96 97 /* Get floating-point registers, if the target system has them. 98 Otherwise, zero them. */ 99 100 if (target_has_fp) 101 { 102 net_read_registers (mc68k_fpreg_packet, MC68K_FPREG_PLEN, 103 PTRACE_GETFPREGS); 104 105 bcopy (&mc68k_fpreg_packet[MC68K_R_FP0], 106 &deprecated_registers[DEPRECATED_REGISTER_BYTE (FP0_REGNUM)], 107 MC68K_FPREG_SIZE * 8); 108 bcopy (&mc68k_fpreg_packet[MC68K_R_FPCR], 109 &deprecated_registers[DEPRECATED_REGISTER_BYTE (FPC_REGNUM)], 110 MC68K_FPREG_PLEN - (MC68K_FPREG_SIZE * 8)); 111 } 112 else 113 { 114 memset (&deprecated_registers[DEPRECATED_REGISTER_BYTE (FP0_REGNUM)], 115 0, MC68K_FPREG_SIZE * 8); 116 memset (&deprecated_registers[DEPRECATED_REGISTER_BYTE (FPC_REGNUM)], 117 0, MC68K_FPREG_PLEN - (MC68K_FPREG_SIZE * 8)); 118 } 119 120 /* Mark the register cache valid. */ 121 122 deprecated_registers_fetched (); 123} 124 125/* Store a register or registers into the VxWorks target. 126 REGNO is the register to store, or -1 for all; currently, 127 it is ignored. FIXME look at regno to improve efficiency. */ 128 129void 130vx_write_register (int regno) 131{ 132 char mc68k_greg_packet[MC68K_GREG_PLEN]; 133 char mc68k_fpreg_packet[MC68K_FPREG_PLEN]; 134 135 /* Store general-purpose registers. */ 136 137 bcopy (deprecated_registers, &mc68k_greg_packet[MC68K_R_D0], 138 16 * MC68K_GREG_SIZE); 139 bcopy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (PS_REGNUM)], 140 &mc68k_greg_packet[MC68K_R_SR], MC68K_GREG_SIZE); 141 bcopy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (PC_REGNUM)], 142 &mc68k_greg_packet[MC68K_R_PC], MC68K_GREG_SIZE); 143 144 net_write_registers (mc68k_greg_packet, MC68K_GREG_PLEN, PTRACE_SETREGS); 145 146 /* Store floating point registers if the target has them. */ 147 148 if (target_has_fp) 149 { 150 bcopy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (FP0_REGNUM)], 151 &mc68k_fpreg_packet[MC68K_R_FP0], 152 MC68K_FPREG_SIZE * 8); 153 bcopy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (FPC_REGNUM)], 154 &mc68k_fpreg_packet[MC68K_R_FPCR], 155 MC68K_FPREG_PLEN - (MC68K_FPREG_SIZE * 8)); 156 157 net_write_registers (mc68k_fpreg_packet, MC68K_FPREG_PLEN, 158 PTRACE_SETFPREGS); 159 } 160} 161