1130812Smarcel/* 68k-dependent portions of the RPC protocol 2130812Smarcel used with a VxWorks target 3130812Smarcel 4130812Smarcel Contributed by Wind River Systems. 5130812Smarcel 6130812Smarcel This file is part of GDB. 7130812Smarcel 8130812Smarcel This program is free software; you can redistribute it and/or modify 9130812Smarcel it under the terms of the GNU General Public License as published by 10130812Smarcel the Free Software Foundation; either version 2 of the License, or 11130812Smarcel (at your option) any later version. 12130812Smarcel 13130812Smarcel This program is distributed in the hope that it will be useful, 14130812Smarcel but WITHOUT ANY WARRANTY; without even the implied warranty of 15130812Smarcel MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16130812Smarcel GNU General Public License for more details. 17130812Smarcel 18130812Smarcel You should have received a copy of the GNU General Public License 19130812Smarcel along with this program; if not, write to the Free Software 20130812Smarcel Foundation, Inc., 59 Temple Place - Suite 330, 21130812Smarcel Boston, MA 02111-1307, USA. */ 22130812Smarcel 23130812Smarcel#include <stdio.h> 24130812Smarcel#include "defs.h" 25130812Smarcel 26130812Smarcel#include "vx-share/regPacket.h" 27130812Smarcel#include "frame.h" 28130812Smarcel#include "inferior.h" 29130812Smarcel#include "target.h" 30130812Smarcel#include "gdbcore.h" 31130812Smarcel#include "command.h" 32130812Smarcel#include "symtab.h" 33130812Smarcel#include "symfile.h" 34130812Smarcel#include "regcache.h" 35130812Smarcel 36130812Smarcel#include "gdb_string.h" 37130812Smarcel#include <errno.h> 38130812Smarcel#include <fcntl.h> 39130812Smarcel#include <sys/types.h> 40130812Smarcel#include <sys/time.h> 41130812Smarcel#include <sys/socket.h> 42130812Smarcel 43130812Smarcel#ifdef _AIX /* IBM claims "void *malloc()" not char * */ 44130812Smarcel#define malloc bogon_malloc 45130812Smarcel#endif 46130812Smarcel 47130812Smarcel#include <rpc/rpc.h> 48130812Smarcel 49130812Smarcel#ifdef _AIX 50130812Smarcel#undef malloc 51130812Smarcel#endif 52130812Smarcel 53130812Smarcel#include <sys/time.h> /* UTek's <rpc/rpc.h> doesn't #incl this */ 54130812Smarcel#include <netdb.h> 55130812Smarcel#include "vx-share/ptrace.h" 56130812Smarcel#include "vx-share/xdr_ptrace.h" 57130812Smarcel#include "vx-share/xdr_ld.h" 58130812Smarcel#include "vx-share/xdr_rdb.h" 59130812Smarcel#include "vx-share/dbgRpcLib.h" 60130812Smarcel 61130812Smarcel/* get rid of value.h if possible */ 62130812Smarcel#include <value.h> 63130812Smarcel#include <symtab.h> 64130812Smarcel 65130812Smarcel/* Flag set if target has fpu */ 66130812Smarcel 67130812Smarcelextern int target_has_fp; 68130812Smarcel 69130812Smarcel/* Generic register read/write routines in remote-vx.c. */ 70130812Smarcel 71130812Smarcelextern void net_read_registers (); 72130812Smarcelextern void net_write_registers (); 73130812Smarcel 74130812Smarcel/* Read a register or registers from the VxWorks target. 75130812Smarcel REGNO is the register to read, or -1 for all; currently, 76130812Smarcel it is ignored. FIXME look at regno to improve efficiency. */ 77130812Smarcel 78130812Smarcelvoid 79130812Smarcelvx_read_register (int regno) 80130812Smarcel{ 81130812Smarcel char mc68k_greg_packet[MC68K_GREG_PLEN]; 82130812Smarcel char mc68k_fpreg_packet[MC68K_FPREG_PLEN]; 83130812Smarcel 84130812Smarcel /* Get general-purpose registers. */ 85130812Smarcel 86130812Smarcel net_read_registers (mc68k_greg_packet, MC68K_GREG_PLEN, PTRACE_GETREGS); 87130812Smarcel 88130812Smarcel bcopy (&mc68k_greg_packet[MC68K_R_D0], deprecated_registers, 89130812Smarcel 16 * MC68K_GREG_SIZE); 90130812Smarcel bcopy (&mc68k_greg_packet[MC68K_R_SR], 91130812Smarcel &deprecated_registers[DEPRECATED_REGISTER_BYTE (PS_REGNUM)], 92130812Smarcel MC68K_GREG_SIZE); 93130812Smarcel bcopy (&mc68k_greg_packet[MC68K_R_PC], 94130812Smarcel &deprecated_registers[DEPRECATED_REGISTER_BYTE (PC_REGNUM)], 95130812Smarcel MC68K_GREG_SIZE); 96130812Smarcel 97130812Smarcel /* Get floating-point registers, if the target system has them. 98130812Smarcel Otherwise, zero them. */ 99130812Smarcel 100130812Smarcel if (target_has_fp) 101130812Smarcel { 102130812Smarcel net_read_registers (mc68k_fpreg_packet, MC68K_FPREG_PLEN, 103130812Smarcel PTRACE_GETFPREGS); 104130812Smarcel 105130812Smarcel bcopy (&mc68k_fpreg_packet[MC68K_R_FP0], 106130812Smarcel &deprecated_registers[DEPRECATED_REGISTER_BYTE (FP0_REGNUM)], 107130812Smarcel MC68K_FPREG_SIZE * 8); 108130812Smarcel bcopy (&mc68k_fpreg_packet[MC68K_R_FPCR], 109130812Smarcel &deprecated_registers[DEPRECATED_REGISTER_BYTE (FPC_REGNUM)], 110130812Smarcel MC68K_FPREG_PLEN - (MC68K_FPREG_SIZE * 8)); 111130812Smarcel } 112130812Smarcel else 113130812Smarcel { 114130812Smarcel memset (&deprecated_registers[DEPRECATED_REGISTER_BYTE (FP0_REGNUM)], 115130812Smarcel 0, MC68K_FPREG_SIZE * 8); 116130812Smarcel memset (&deprecated_registers[DEPRECATED_REGISTER_BYTE (FPC_REGNUM)], 117130812Smarcel 0, MC68K_FPREG_PLEN - (MC68K_FPREG_SIZE * 8)); 118130812Smarcel } 119130812Smarcel 120130812Smarcel /* Mark the register cache valid. */ 121130812Smarcel 122130812Smarcel deprecated_registers_fetched (); 123130812Smarcel} 124130812Smarcel 125130812Smarcel/* Store a register or registers into the VxWorks target. 126130812Smarcel REGNO is the register to store, or -1 for all; currently, 127130812Smarcel it is ignored. FIXME look at regno to improve efficiency. */ 128130812Smarcel 129130812Smarcelvoid 130130812Smarcelvx_write_register (int regno) 131130812Smarcel{ 132130812Smarcel char mc68k_greg_packet[MC68K_GREG_PLEN]; 133130812Smarcel char mc68k_fpreg_packet[MC68K_FPREG_PLEN]; 134130812Smarcel 135130812Smarcel /* Store general-purpose registers. */ 136130812Smarcel 137130812Smarcel bcopy (deprecated_registers, &mc68k_greg_packet[MC68K_R_D0], 138130812Smarcel 16 * MC68K_GREG_SIZE); 139130812Smarcel bcopy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (PS_REGNUM)], 140130812Smarcel &mc68k_greg_packet[MC68K_R_SR], MC68K_GREG_SIZE); 141130812Smarcel bcopy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (PC_REGNUM)], 142130812Smarcel &mc68k_greg_packet[MC68K_R_PC], MC68K_GREG_SIZE); 143130812Smarcel 144130812Smarcel net_write_registers (mc68k_greg_packet, MC68K_GREG_PLEN, PTRACE_SETREGS); 145130812Smarcel 146130812Smarcel /* Store floating point registers if the target has them. */ 147130812Smarcel 148130812Smarcel if (target_has_fp) 149130812Smarcel { 150130812Smarcel bcopy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (FP0_REGNUM)], 151130812Smarcel &mc68k_fpreg_packet[MC68K_R_FP0], 152130812Smarcel MC68K_FPREG_SIZE * 8); 153130812Smarcel bcopy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (FPC_REGNUM)], 154130812Smarcel &mc68k_fpreg_packet[MC68K_R_FPCR], 155130812Smarcel MC68K_FPREG_PLEN - (MC68K_FPREG_SIZE * 8)); 156130812Smarcel 157130812Smarcel net_write_registers (mc68k_fpreg_packet, MC68K_FPREG_PLEN, 158130812Smarcel PTRACE_SETFPREGS); 159130812Smarcel } 160130812Smarcel} 161