extern void symbol_file_command ();
extern int stop_soon_quietly; /* for wait_for_inferior */
+extern void host_convert_to_virtual ();
+extern void host_convert_from_virtual ();
static int net_ptrace_clnt_call (); /* Forward decl */
static enum clnt_stat net_clnt_call (); /* Forward decl */
/* returns 0 if successful, errno otherwise */
-int
+static int
vx_insert_breakpoint (addr)
int addr;
{
/* returns 0 if successful, errno otherwise */
-int
+static int
vx_remove_breakpoint (addr)
int addr;
{
Returns process id. Errors reported with error().
On VxWorks, we ignore exec_file. */
-void
+static void
vx_create_inferior (exec_file, args, env)
char *exec_file;
char *args;
to the debugged task.
Returns -1 if remote wait failed, task status otherwise. */
-int
+static int
net_wait (pEvent)
RDB_EVENT *pEvent;
{
/* Suspend the remote task.
Returns -1 if suspend fails on target system, 0 otherwise. */
-int
+static int
net_quit ()
{
int pid;
/* Read a register or registers from the remote system. */
-int
+static void
vx_read_register (regno)
int regno;
{
int status;
Rptrace ptrace_in;
Ptrace_return ptrace_out;
- struct regs inferior_registers;
- struct fp_status inferior_fp_registers;
+ C_bytes in_data;
+ C_bytes out_data;
extern char registers[];
bzero ((char *) &ptrace_in, sizeof (ptrace_in));
registers_fetched ();
ptrace_in.pid = inferior_pid;
- ptrace_out.info.more_data = (caddr_t) &inferior_registers;
+ ptrace_out.info.more_data = (caddr_t) &out_data;
+ out_data.len = 18 * REGISTER_RAW_SIZE (0); /* FIXME 68k hack */
+ out_data.bytes = (caddr_t) registers;
+
status = net_ptrace_clnt_call (PTRACE_GETREGS, &ptrace_in, &ptrace_out);
if (status)
error (rpcerr);
if (ptrace_out.status == -1)
{
errno = ptrace_out.errno;
- return -1;
+ perror_with_name ("net_ptrace_clnt_call(PTRACE_GETREGS)");
}
#ifdef I80960
if (ptrace_out.status == -1)
{
errno = ptrace_out.errno;
- return -1;
+ perror_with_name ("net_ptrace_clnt_call(PTRACE_GETFPREGS)");
}
bcopy (&inferior_fp_registers, ®isters[REGISTER_BYTE (FP0_REGNUM)],
#else /* not 960, thus must be 68000: FIXME! */
- bcopy (&inferior_registers, registers, 16 * 4);
- *(int *)®isters[REGISTER_BYTE (PS_REGNUM)] = inferior_registers.r_ps;
- *(int *)®isters[REGISTER_BYTE (PC_REGNUM)] = inferior_registers.r_pc;
-
if (target_has_fp)
{
ptrace_in.pid = inferior_pid;
- ptrace_out.info.more_data = (caddr_t) &inferior_fp_registers;
+ ptrace_out.info.more_data = (caddr_t) &out_data;
+ out_data.len = 8 * REGISTER_RAW_SIZE (FP0_REGNUM) /* FIXME */
+ + (3 * sizeof (REGISTER_TYPE));
+ out_data.bytes = (caddr_t) ®isters[REGISTER_BYTE (FP0_REGNUM)];
+
status = net_ptrace_clnt_call (PTRACE_GETFPREGS, &ptrace_in, &ptrace_out);
if (status)
error (rpcerr);
if (ptrace_out.status == -1)
{
errno = ptrace_out.errno;
- return -1;
+ perror_with_name ("net_ptrace_clnt_call(PTRACE_GETFPREGS)");
}
-
- bcopy (&inferior_fp_registers, ®isters[REGISTER_BYTE (FP0_REGNUM)],
- sizeof inferior_fp_registers.fps_regs);
- bcopy (&inferior_fp_registers.fps_control,
- ®isters[REGISTER_BYTE (FPC_REGNUM)],
- sizeof inferior_fp_registers - sizeof inferior_fp_registers.fps_regs);
}
else
{
bzero (®isters[REGISTER_BYTE (FP0_REGNUM)],
- sizeof inferior_fp_registers.fps_regs);
+ 8 * REGISTER_RAW_SIZE (FP0_REGNUM));
bzero (®isters[REGISTER_BYTE (FPC_REGNUM)],
- sizeof inferior_fp_registers - sizeof inferior_fp_registers.fps_regs);
+ 3 * sizeof (REGISTER_TYPE));
}
#endif /* various architectures */
-
- return 0;
}
/* Prepare to store registers. Since we will store all of them,
read out their current values now. */
-void
+static void
vx_prepare_to_store ()
{
vx_read_register (-1);
Otherwise, REGNO specifies which register (so we can save time). */
/* FIXME, look at REGNO to save time here */
+static void
vx_write_register (regno)
int regno;
{
- struct regs inferior_registers;
- struct fp_status inferior_fp_registers;
+ C_bytes in_data;
+ C_bytes out_data;
extern char registers[];
int status;
Rptrace ptrace_in;
bzero ((char *) &ptrace_in, sizeof (ptrace_in));
bzero ((char *) &ptrace_out, sizeof (ptrace_out));
+ ptrace_in.pid = inferior_pid;
+ ptrace_in.info.ttype = DATA;
+ ptrace_in.info.more_data = (caddr_t) &in_data;
+
+ in_data.bytes = registers;
+
#ifdef I80960
+ /* FIXME */
bcopy (®isters[REGISTER_BYTE (R0_REGNUM)],
(char *) inferior_registers.r_lreg, 16 * sizeof (int));
bcopy (®isters[REGISTER_BYTE (G0_REGNUM)],
#else /* not 960 -- assume 68k -- FIXME */
- bcopy (registers, &inferior_registers, 16 * 4);
- inferior_registers.r_ps = *(int *)®isters[REGISTER_BYTE (PS_REGNUM)];
- inferior_registers.r_pc = *(int *)®isters[REGISTER_BYTE (PC_REGNUM)];
+ in_data.len = 18 * sizeof (REGISTER_TYPE);
#endif /* Different register sets */
- ptrace_in.pid = inferior_pid;
- ptrace_in.info.ttype = REGS;
- ptrace_in.info.more_data = (caddr_t) &inferior_registers;
-
/* XXX change second param to be a proc number */
status = net_ptrace_clnt_call (PTRACE_SETREGS, &ptrace_in, &ptrace_out);
if (status)
if (ptrace_out.status == -1)
{
errno = ptrace_out.errno;
- return -1;
+ perror_with_name ("net_ptrace_clnt_call(PTRACE_SETREGS)");
}
/* Store floating point registers if the target has them. */
if (target_has_fp)
{
+ ptrace_in.pid = inferior_pid;
+ ptrace_in.info.ttype = DATA;
+ ptrace_in.info.more_data = (caddr_t) &in_data;
+
+
#ifdef I80960
bcopy (®isters[REGISTER_BYTE (FP0_REGNUM)], &inferior_fp_registers,
#else /* not 960 -- assume 68k -- FIXME */
- bcopy (®isters[REGISTER_BYTE (FP0_REGNUM)], &inferior_fp_registers,
- sizeof inferior_fp_registers.fps_regs);
- bcopy (®isters[REGISTER_BYTE (FPC_REGNUM)],
- &inferior_fp_registers.fps_control,
- sizeof inferior_fp_registers - sizeof inferior_fp_registers.fps_regs);
+ in_data.bytes = ®isters[REGISTER_BYTE (FP0_REGNUM)];
+ in_data.len = (8 * REGISTER_RAW_SIZE (FP0_REGNUM)
+ + (3 * sizeof (REGISTER_TYPE)));
#endif /* Different register sets */
- ptrace_in.pid = inferior_pid;
- ptrace_in.info.ttype = FPREGS;
- ptrace_in.info.more_data = (caddr_t) &inferior_fp_registers;
-
status = net_ptrace_clnt_call (PTRACE_SETFPREGS, &ptrace_in, &ptrace_out);
if (status)
error (rpcerr);
if (ptrace_out.status == -1)
{
errno = ptrace_out.errno;
- return -1;
+ perror_with_name ("net_ptrace_clnt_call(PTRACE_SETFPREGS)");
}
}
- return 0;
}
/* Copy LEN bytes to or from remote inferior's memory starting at MEMADDR
handle the current address but can handle one N bytes further, but
vxworks doesn't give us that information. */
-int
+static int
vx_xfer_memory (memaddr, myaddr, len, write, target)
CORE_ADDR memaddr;
char *myaddr;
return len; /* Moved *all* the bytes */
}
-void
+static void
vx_files_info ()
{
printf ("\tAttached to host `%s'", vx_host);
printf (".\n");
}
-void
+static void
vx_run_files_info ()
{
printf ("\tRunning %s VxWorks process %s",
printf(".\n");
}
-void
+static void
vx_resume (step, siggnal)
int step;
int siggnal;
}
}
-void
+static void
vx_mourn_inferior ()
{
pop_target (); /* Pop back to no-child state */
\f
/* This function allows the addition of incrementally linked object files. */
-void
+static void
vx_load_command (arg_string, from_tty)
char* arg_string;
int from_tty;
NULL, memory for the buffer will be allocated by XDR.
Returns -1 if rpc failed, 0 otherwise. */
-int
+static int
net_get_boot_file (pBootFile)
char **pBootFile;
{
There's no way to check if the returned loadTable is correct.
VxWorks doesn't check it. */
-int
+static int
net_get_symbols (pLoadTable)
ldtabl *pLoadTable; /* return pointer to ldtabl here */
{
struct complaint cant_contact_target =
{"Lost contact with VxWorks target", 0, 0};
-int
+static int
vx_lookup_symbol (name, pAddr)
char *name; /* symbol name */
CORE_ADDR *pAddr;
Returns 1 if target has floating point processor, 0 otherwise.
Calls error() if rpc fails. */
-int
+static int
net_check_for_fp ()
{
enum clnt_stat status;
/* Establish an RPC connection with the VxWorks target system.
Calls error () if unable to establish connection. */
-void
+static void
net_connect (host)
char *host;
{
/* Clean up from the VxWorks process target as it goes away. */
-void
+static void
vx_proc_close (quitting)
int quitting;
{
vx_running = 0;
}
\f
-/* Cross-net conversion of floats to and from extended form.
- (This is needed because different target machines have different
- extended floating point formats.) */
-
-/* Convert from an extended float to a double.
-
- The extended float is stored as raw data pointed to by FROM.
- Return the converted value as raw data in the double pointed to by TO.
-*/
-
-static void
-vx_convert_to_virtual (regno, from, to)
- int regno;
- char *from;
- char *to;
-{
- enum clnt_stat status;
-
- if (REGISTER_CONVERTIBLE (regno))
- {
- if (!target_has_fp) {
- *(double *)to = 0.0; /* Skip the trouble if no float anyway */
- return;
- }
-
- status = net_clnt_call (VX_CONV_FROM_68881, xdr_ext_fp, from,
- xdr_double, to);
-
- if (status == RPC_SUCCESS)
- return;
- else
- error (rpcerr);
- }
- else
- bcopy (from, to, REGISTER_VIRTUAL_SIZE (regno));
-}
-
-
-/* The converse: convert from a double to an extended float.
-
- The double is stored as raw data pointed to by FROM.
- Return the converted value as raw data in the extended
- float pointed to by TO.
-*/
-
-static void
-vx_convert_from_virtual (regno, from, to)
- int regno;
- char *from;
- char *to;
-{
- enum clnt_stat status;
-
- if (REGISTER_CONVERTIBLE (regno))
- {
- if (!target_has_fp) {
- bzero (to, REGISTER_RAW_SIZE (FP0_REGNUM)); /* Shrug */
- return;
- }
-
- status = net_clnt_call (VX_CONV_TO_68881, xdr_double, from,
- xdr_ext_fp, to);
- if (status == RPC_SUCCESS)
- return;
- else
- error (rpcerr);
- }
- else
- bcopy (from, to, REGISTER_VIRTUAL_SIZE (regno));
-}
-\f
/* Make an RPC call to the VxWorks target.
Returns RPC status. */
/* Clean up before losing control. */
-void
+static void
vx_close (quitting)
int quitting;
{
vx_open, vx_close, vx_attach, 0, /* vx_detach, */
0, 0, /* resume, wait */
0, 0, /* read_reg, write_reg */
- 0, vx_convert_to_virtual, vx_convert_from_virtual, /* prep_to_store, */
+ 0, host_convert_to_virtual, host_convert_from_virtual, /* prep_to_store, */
vx_xfer_memory, vx_files_info,
0, 0, /* insert_breakpoint, remove_breakpoint */
0, 0, 0, 0, 0, /* terminal stuff */
vx_proc_open, vx_proc_close, 0, vx_detach, /* vx_attach */
vx_resume, vx_wait,
vx_read_register, vx_write_register,
- vx_prepare_to_store, vx_convert_to_virtual, vx_convert_from_virtual,
+ vx_prepare_to_store, host_convert_to_virtual, host_convert_from_virtual,
vx_xfer_memory, vx_run_files_info,
vx_insert_breakpoint, vx_remove_breakpoint,
0, 0, 0, 0, 0, /* terminal stuff */
/*
modification history
--------------------
+01b,25may91,maf now uses counted bytes struct to transfer registers.
+ removed xdr_regs_ptr (), xdr_fp_status_ptr (), and
+ xdr_fpa_regs_ptr ().
01a,05jun90,llk extracted from xdr_ptrace.h, version 01c.
*/
/********************************************************************
*
-* xdr_regs_ptr -
-*
-* xdr routine to get regs* branch of discriminated union ptrace_info
-*
-*/
-
-LOCAL bool_t xdr_regs_ptr(xdrs,objp)
- XDR *xdrs;
- struct regs **objp;
- {
- return (xdr_pointer(xdrs, (char **) objp, sizeof(struct regs), xdr_regs));
- } /* xdr_regs_ptr */
-
-/********************************************************************
-*
-* xdr_fp_status_ptr -
-*
-* xdr routine for fp_status * branch of discrimanated union
-*
-*/
-
-LOCAL bool_t xdr_fp_status_ptr(xdrs,objp)
- XDR *xdrs;
- struct fp_status **objp;
- {
- return(xdr_pointer(xdrs, (char **) objp, sizeof(struct fp_status),
- xdr_fp_status));
- } /* xdr_fp_status_ptr */
-
-#ifndef I80960
-/********************************************************************
-*
-* xdr_fpa_regs_ptr -
+* xdr_c_bytes -
*
-* xdr routine for fpa_regs* branch of ptrace_info
+* xdr routine for counted bytes
*
*/
-
-LOCAL bool_t xdr_fpa_regs_ptr(xdrs,objp)
+bool_t xdr_c_bytes(xdrs,objp)
XDR *xdrs;
- struct fpa_regs **objp;
+ C_bytes *objp;
{
- if (! xdr_pointer(xdrs, (char **) objp, sizeof(struct fpa_regs),
- xdr_fpa_regs))
- return(FALSE);
- else
- return(TRUE);
- } /* xdr_fpa_regs_ptr */
-#endif
+ return(xdr_bytes(xdrs, &objp->bytes, (u_int *) &objp->len, MAX_LEN));
+ } /* xdr_c_bytes */
/********************************************************************
*
{
static struct xdr_discrim choices[] =
{
- { (int) REGS, xdr_regs_ptr },
- { (int) FPREGS, xdr_fp_status_ptr },
-#ifndef I80960
- { (int) FPAREGS, xdr_fpa_regs_ptr },
-#endif
{ (int) DATA, xdr_c_bytes_ptr },
{ __dontcare__, NULL }
};
return(TRUE);
} /* xdr_ptrace_return */
-
-/********************************************************************
-*
-* xdr_c_bytes -
-*
-* xdr routine for counted bytes
-*
-*/
-bool_t xdr_c_bytes(xdrs,objp)
- XDR *xdrs;
- C_bytes *objp;
- {
- return(xdr_bytes(xdrs, &objp->bytes, (u_int *) &objp->len, MAX_LEN));
- } /* xdr_c_bytes */
-