2 changed files with 321 additions and 0 deletions
@ -0,0 +1,158 @@ |
|||
/* 68k-dependent portions of the RPC protocol
|
|||
used with a VxWorks target |
|||
|
|||
Contributed by Wind River Systems. |
|||
|
|||
This file is part of GDB. |
|||
|
|||
This program is free software; you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation; either version 2 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
This program is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with this program; if not, write to the Free Software |
|||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ |
|||
|
|||
#include <stdio.h> |
|||
#include "defs.h" |
|||
|
|||
#include "vx-share/regPacket.h" |
|||
#include "frame.h" |
|||
#include "inferior.h" |
|||
#include "wait.h" |
|||
#include "target.h" |
|||
#include "gdbcore.h" |
|||
#include "command.h" |
|||
#include "symtab.h" |
|||
#include "symfile.h" /* for struct complaint */ |
|||
|
|||
#include <string.h> |
|||
#include <errno.h> |
|||
#include <signal.h> |
|||
#include <fcntl.h> |
|||
#include <sys/types.h> |
|||
#include <sys/time.h> |
|||
#include <sys/socket.h> |
|||
|
|||
#ifdef _AIX /* IBM claims "void *malloc()" not char * */ |
|||
#define malloc bogon_malloc |
|||
#endif |
|||
|
|||
#include <rpc/rpc.h> |
|||
|
|||
#ifdef _AIX |
|||
#undef malloc |
|||
#endif |
|||
|
|||
#include <sys/time.h> /* UTek's <rpc/rpc.h> doesn't #incl this */ |
|||
#include <netdb.h> |
|||
#include "vx-share/ptrace.h" |
|||
#include "vx-share/xdr_ptrace.h" |
|||
#include "vx-share/xdr_ld.h" |
|||
#include "vx-share/xdr_rdb.h" |
|||
#include "vx-share/dbgRpcLib.h" |
|||
|
|||
/* get rid of value.h if possible */ |
|||
#include <value.h> |
|||
#include <symtab.h> |
|||
|
|||
/* Flag set if target has fpu */ |
|||
|
|||
extern int target_has_fp; |
|||
|
|||
/* Generic register read/write routines in remote-vx.c. */ |
|||
|
|||
extern void net_read_registers (); |
|||
extern void net_write_registers (); |
|||
|
|||
/* Read a register or registers from the VxWorks target.
|
|||
REGNO is the register to read, or -1 for all; currently, |
|||
it is ignored. FIXME look at regno to improve efficiency. */ |
|||
|
|||
void |
|||
vx_read_register (regno) |
|||
int regno; |
|||
{ |
|||
char mc68k_greg_packet[MC68K_GREG_PLEN]; |
|||
char mc68k_fpreg_packet[MC68K_FPREG_PLEN]; |
|||
|
|||
/* Get general-purpose registers. */ |
|||
|
|||
net_read_registers (mc68k_greg_packet, MC68K_GREG_PLEN, PTRACE_GETREGS); |
|||
|
|||
bcopy (&mc68k_greg_packet[MC68K_R_D0], registers, 16 * MC68K_GREG_SIZE); |
|||
bcopy (&mc68k_greg_packet[MC68K_R_SR], ®isters[REGISTER_BYTE (PS_REGNUM)], |
|||
MC68K_GREG_SIZE); |
|||
bcopy (&mc68k_greg_packet[MC68K_R_PC], ®isters[REGISTER_BYTE (PC_REGNUM)], |
|||
MC68K_GREG_SIZE); |
|||
|
|||
/* Get floating-point registers, if the target system has them.
|
|||
Otherwise, zero them. */ |
|||
|
|||
if (target_has_fp) |
|||
{ |
|||
net_read_registers (mc68k_fpreg_packet, MC68K_FPREG_PLEN, |
|||
PTRACE_GETFPREGS); |
|||
|
|||
bcopy (&mc68k_fpreg_packet[MC68K_R_FP0], |
|||
®isters[REGISTER_BYTE (FP0_REGNUM)], |
|||
MC68K_FPREG_SIZE * 8); |
|||
bcopy (&mc68k_fpreg_packet[MC68K_R_FPCR], |
|||
®isters[REGISTER_BYTE (FPC_REGNUM)], |
|||
MC68K_FPREG_PLEN - (MC68K_FPREG_SIZE * 8)); |
|||
} |
|||
else |
|||
{ |
|||
bzero (®isters[REGISTER_BYTE (FP0_REGNUM)], |
|||
MC68K_FPREG_SIZE * 8); |
|||
bzero (®isters[REGISTER_BYTE (FPC_REGNUM)], |
|||
MC68K_FPREG_PLEN - (MC68K_FPREG_SIZE * 8)); |
|||
} |
|||
|
|||
/* Mark the register cache valid. */ |
|||
|
|||
registers_fetched (); |
|||
} |
|||
|
|||
/* Store a register or registers into the VxWorks target.
|
|||
REGNO is the register to store, or -1 for all; currently, |
|||
it is ignored. FIXME look at regno to improve efficiency. */ |
|||
|
|||
void |
|||
vx_write_register (regno) |
|||
int regno; |
|||
{ |
|||
char mc68k_greg_packet[MC68K_GREG_PLEN]; |
|||
char mc68k_fpreg_packet[MC68K_FPREG_PLEN]; |
|||
|
|||
/* Store general-purpose registers. */ |
|||
|
|||
bcopy (registers, &mc68k_greg_packet[MC68K_R_D0], 16 * MC68K_GREG_SIZE); |
|||
bcopy (®isters[REGISTER_BYTE (PS_REGNUM)], |
|||
&mc68k_greg_packet[MC68K_R_SR], MC68K_GREG_SIZE); |
|||
bcopy (®isters[REGISTER_BYTE (PC_REGNUM)], |
|||
&mc68k_greg_packet[MC68K_R_PC], MC68K_GREG_SIZE); |
|||
|
|||
net_write_registers (mc68k_greg_packet, MC68K_GREG_PLEN, PTRACE_SETREGS); |
|||
|
|||
/* Store floating point registers if the target has them. */ |
|||
|
|||
if (target_has_fp) |
|||
{ |
|||
bcopy (®isters[REGISTER_BYTE (FP0_REGNUM)], |
|||
&mc68k_fpreg_packet[MC68K_R_FP0], |
|||
MC68K_FPREG_SIZE * 8); |
|||
bcopy (®isters[REGISTER_BYTE (FPC_REGNUM)], |
|||
&mc68k_fpreg_packet[MC68K_R_FPCR], |
|||
MC68K_FPREG_PLEN - (MC68K_FPREG_SIZE * 8)); |
|||
|
|||
net_write_registers (mc68k_fpreg_packet, MC68K_FPREG_PLEN, |
|||
PTRACE_SETFPREGS); |
|||
} |
|||
} |
|||
@ -0,0 +1,163 @@ |
|||
/* i80960-dependent portions of the RPC protocol
|
|||
used with a VxWorks target |
|||
|
|||
Contributed by Wind River Systems. |
|||
|
|||
This file is part of GDB. |
|||
|
|||
This program is free software; you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation; either version 2 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
This program is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with this program; if not, write to the Free Software |
|||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ |
|||
|
|||
#include <stdio.h> |
|||
#include "defs.h" |
|||
|
|||
#include "vx-share/regPacket.h" |
|||
#include "frame.h" |
|||
#include "inferior.h" |
|||
#include "wait.h" |
|||
#include "target.h" |
|||
#include "gdbcore.h" |
|||
#include "command.h" |
|||
#include "symtab.h" |
|||
#include "symfile.h" /* for struct complaint */ |
|||
|
|||
#include <string.h> |
|||
#include <errno.h> |
|||
#include <signal.h> |
|||
#include <fcntl.h> |
|||
#include <sys/types.h> |
|||
#include <sys/time.h> |
|||
#include <sys/socket.h> |
|||
|
|||
#ifdef _AIX /* IBM claims "void *malloc()" not char * */ |
|||
#define malloc bogon_malloc |
|||
#endif |
|||
|
|||
#include <rpc/rpc.h> |
|||
#include <sys/time.h> /* UTek's <rpc/rpc.h> doesn't #incl this */ |
|||
#include <netdb.h> |
|||
#include "vx-share/ptrace.h" |
|||
#include "vx-share/xdr_ptrace.h" |
|||
#include "vx-share/xdr_ld.h" |
|||
#include "vx-share/xdr_rdb.h" |
|||
#include "vx-share/dbgRpcLib.h" |
|||
|
|||
/* get rid of value.h if possible */ |
|||
#include <value.h> |
|||
#include <symtab.h> |
|||
|
|||
/* Flag set if target has fpu */ |
|||
|
|||
extern int target_has_fp; |
|||
|
|||
/* 960 floating point format descriptor, from "i960-tdep.c." */ |
|||
|
|||
extern struct ext_format ext_format_i960; |
|||
|
|||
/* Generic register read/write routines in remote-vx.c. */ |
|||
|
|||
extern void net_read_registers (); |
|||
extern void net_write_registers (); |
|||
|
|||
/* Read a register or registers from the VxWorks target.
|
|||
REGNO is the register to read, or -1 for all; currently, |
|||
it is ignored. FIXME look at regno to improve efficiency. */ |
|||
|
|||
void |
|||
vx_read_register (regno) |
|||
int regno; |
|||
{ |
|||
char i960_greg_packet[I960_GREG_PLEN]; |
|||
char i960_fpreg_packet[I960_FPREG_PLEN]; |
|||
|
|||
/* Get general-purpose registers. When copying values into
|
|||
registers [], don't assume that a location in registers [] |
|||
is properly aligned for the target data type. */ |
|||
|
|||
net_read_registers (i960_greg_packet, I960_GREG_PLEN, PTRACE_GETREGS); |
|||
|
|||
bcopy (&i960_greg_packet[I960_R_R0], |
|||
®isters[REGISTER_BYTE (R0_REGNUM)], 16 * I960_GREG_SIZE); |
|||
bcopy (&i960_greg_packet[I960_R_G0], |
|||
®isters[REGISTER_BYTE (G0_REGNUM)], 16 * I960_GREG_SIZE); |
|||
bcopy (&i960_greg_packet[I960_R_PCW], |
|||
®isters[REGISTER_BYTE (PCW_REGNUM)], sizeof (int)); |
|||
bcopy (&i960_greg_packet[I960_R_ACW], |
|||
®isters[REGISTER_BYTE (ACW_REGNUM)], sizeof (int)); |
|||
bcopy (&i960_greg_packet[I960_R_TCW], |
|||
®isters[REGISTER_BYTE (TCW_REGNUM)], sizeof (int)); |
|||
|
|||
/* If the target has floating point registers, fetch them.
|
|||
Otherwise, zero the floating point register values in |
|||
registers[] for good measure, even though we might not |
|||
need to. */ |
|||
|
|||
if (target_has_fp) |
|||
{ |
|||
net_read_registers (i960_fpreg_packet, I960_FPREG_PLEN, |
|||
PTRACE_GETFPREGS); |
|||
bcopy (&i960_fpreg_packet[I960_R_FP0], |
|||
®isters[REGISTER_BYTE (FP0_REGNUM)], |
|||
REGISTER_RAW_SIZE (FP0_REGNUM) * 4); |
|||
} |
|||
else |
|||
bzero (®isters[REGISTER_BYTE (FP0_REGNUM)], |
|||
REGISTER_RAW_SIZE (FP0_REGNUM) * 4); |
|||
|
|||
/* Mark the register cache valid. */ |
|||
|
|||
registers_fetched (); |
|||
} |
|||
|
|||
/* Store a register or registers into the VxWorks target.
|
|||
REGNO is the register to store, or -1 for all; currently, |
|||
it is ignored. FIXME look at regno to improve efficiency. */ |
|||
|
|||
void |
|||
vx_write_register (regno) |
|||
int regno; |
|||
{ |
|||
char i960_greg_packet[I960_GREG_PLEN]; |
|||
char i960_fpreg_packet[I960_FPREG_PLEN]; |
|||
|
|||
/* Store floating-point registers. When copying values from
|
|||
registers [], don't assume that a location in registers [] |
|||
is properly aligned for the target data type. */ |
|||
|
|||
bcopy (®isters[REGISTER_BYTE (R0_REGNUM)], |
|||
&i960_greg_packet[I960_R_R0], 16 * I960_GREG_SIZE); |
|||
bcopy (®isters[REGISTER_BYTE (G0_REGNUM)], |
|||
&i960_greg_packet[I960_R_G0], 16 * I960_GREG_SIZE); |
|||
bcopy (®isters[REGISTER_BYTE (PCW_REGNUM)], |
|||
&i960_greg_packet[I960_R_PCW], sizeof (int)); |
|||
bcopy (®isters[REGISTER_BYTE (ACW_REGNUM)], |
|||
&i960_greg_packet[I960_R_ACW], sizeof (int)); |
|||
bcopy (®isters[REGISTER_BYTE (TCW_REGNUM)], |
|||
&i960_greg_packet[I960_R_TCW], sizeof (int)); |
|||
|
|||
net_write_registers (i960_greg_packet, I960_GREG_PLEN, PTRACE_SETREGS); |
|||
|
|||
/* Store floating point registers if the target has them. */ |
|||
|
|||
if (target_has_fp) |
|||
{ |
|||
bcopy (®isters[REGISTER_BYTE (FP0_REGNUM)], |
|||
&i960_fpreg_packet[I960_R_FP0], |
|||
REGISTER_RAW_SIZE (FP0_REGNUM) * 4); |
|||
|
|||
net_write_registers (i960_fpreg_packet, I960_FPREG_PLEN, |
|||
PTRACE_SETFPREGS); |
|||
} |
|||
} |
|||
|
|||
Loading…
Reference in new issue