home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fresh Fish 7
/
FreshFishVol7.bin
/
bbs
/
gnu
/
gdb-4.12-src.lha
/
GNU
/
src
/
amiga
/
gdb-4.12
/
gdb
/
remote-nindy.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-02-03
|
21KB
|
761 lines
/* Memory-access and commands for remote NINDY process, for GDB.
Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
Contributed by Intel Corporation. Modified from remote.c by Chris Benenati.
GDB is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY. No author or distributor accepts responsibility to anyone
for the consequences of using it or for whether it serves any
particular purpose or works at all, unless he says so in writing.
Refer to the GDB General Public License for full details.
Everyone is granted permission to copy, modify and redistribute GDB,
but only under the conditions described in the GDB General Public
License. A copy of this license is supposed to have been given to you
along with GDB so you can know your rights and responsibilities. It
should be in a file named COPYING. Among other things, the copyright
notice and this notice must be preserved on all copies.
In other words, go ahead and share GDB, but don't try to stop
anyone else from sharing it farther. Help stamp out software hoarding!
*/
/*
Except for the data cache routines, this file bears little resemblence
to remote.c. A new (although similar) protocol has been specified, and
portions of the code are entirely dependent on having an i80960 with a
NINDY ROM monitor at the other end of the line.
*/
/*****************************************************************************
*
* REMOTE COMMUNICATION PROTOCOL BETWEEN GDB960 AND THE NINDY ROM MONITOR.
*
*
* MODES OF OPERATION
* ----- -- ---------
*
* As far as NINDY is concerned, GDB is always in one of two modes: command
* mode or passthrough mode.
*
* In command mode (the default) pre-defined packets containing requests
* are sent by GDB to NINDY. NINDY never talks except in reponse to a request.
*
* Once the the user program is started, GDB enters passthrough mode, to give
* the user program access to the terminal. GDB remains in this mode until
* NINDY indicates that the program has stopped.
*
*
* PASSTHROUGH MODE
* ----------- ----
*
* GDB writes all input received from the keyboard directly to NINDY, and writes
* all characters received from NINDY directly to the monitor.
*
* Keyboard input is neither buffered nor echoed to the monitor.
*
* GDB remains in passthrough mode until NINDY sends a single ^P character,
* to indicate that the user process has stopped.
*
* Note:
* GDB assumes NINDY performs a 'flushreg' when the user program stops.
*
*
* COMMAND MODE
* ------- ----
*
* All info (except for message ack and nak) is transferred between gdb
* and the remote processor in messages of the following format:
*
* <info>#<checksum>
*
* where
* # is a literal character
*
* <info> ASCII information; all numeric information is in the
* form of hex digits ('0'-'9' and lowercase 'a'-'f').
*
* <checksum>
* is a pair of ASCII hex digits representing an 8-bit
* checksum formed by adding together each of the
* characters in <info>.
*
* The receiver of a message always sends a single character to the sender
* to indicate that the checksum was good ('+') or bad ('-'); the sender
* re-transmits the entire message over until a '+' is received.
*
* In response to a command NINDY always sends back either data or
* a result code of the form "Xnn", where "nn" are hex digits and "X00"
* means no errors. (Exceptions: the "s" and "c" commands don't respond.)
*
* SEE THE HEADER OF THE FILE "gdb.c" IN THE NINDY MONITOR SOURCE CODE FOR A
* FULL DESCRIPTION OF LEGAL COMMANDS.
*
* SEE THE FILE "stop.h" IN THE NINDY MONITOR SOURCE CODE FOR A LIST
* OF STOP CODES.
*
***************************************************************************/
#include "defs.h"
#include <signal.h>
#include <sys/types.h>
#include <setjmp.h>
#include "frame.h"
#include "inferior.h"
#include "bfd.h"
#include "symfile.h"
#include "target.h"
#include "gdbcore.h"
#include "command.h"
#include "ieee-float.h"
#include "wait.h"
#include <sys/file.h>
#include <ctype.h>
#include "serial.h"
#include "nindy-share/env.h"
#include "nindy-share/stop.h"
#include "dcache.h"
#include "remote-utils.h"
static DCACHE *nindy_dcache;
extern int unlink();
extern char *getenv();
extern char *mktemp();
extern void generic_mourn_inferior ();
extern struct target_ops nindy_ops;
extern GDB_FILE *instream;
extern struct ext_format ext_format_i960; /* i960-tdep.c */
extern char ninStopWhy ();
extern int ninMemGet ();
extern int ninMemPut ();
int nindy_initial_brk; /* nonzero if want to send an initial BREAK to nindy */
int nindy_old_protocol; /* nonzero if want to use old protocol */
char *nindy_ttyname; /* name of tty to talk to nindy on, or null */
#define DLE '\020' /* Character NINDY sends to indicate user program has
* halted. */
#define TRUE 1
#define FALSE 0
/* From nindy-share/nindy.c. */
extern serial_t nindy_serial;
static int have_regs = 0; /* 1 iff regs read since i960 last halted */
static int regs_changed = 0; /* 1 iff regs were modified since last read */
extern char *exists();
static void
nindy_fetch_registers PARAMS ((int));
static void
nindy_store_registers PARAMS ((int));
static char *savename;
static void
nindy_close (quitting)
int quitting;
{
if (nindy_serial != NULL)
SERIAL_CLOSE (nindy_serial);
nindy_serial = NULL;
if (savename)
free (savename);
savename = 0;
}
/* Open a connection to a remote debugger.
FIXME, there should be "set" commands for the options that are
now specified with gdb command-line options (old_protocol,
and initial_brk). */
void
nindy_open (name, from_tty)
char *name; /* "/dev/ttyXX", "ttyXX", or "XX": tty to be opened */
int from_tty;
{
char baudrate[1024];
if (!name)
error_no_arg ("serial port device name");
target_preopen (from_tty);
nindy_close (0);
have_regs = regs_changed = 0;
nindy_dcache = dcache_init(ninMemGet, ninMemPut);
/* Allow user to interrupt the following -- we could hang if there's
no NINDY at the other end of the remote tty. */
immediate_quit++;
sprintf(baudrate, "%d", sr_get_baud_rate());
ninConnect(name, baudrate,
nindy_initial_brk, !from_tty, nindy_old_protocol);
immediate_quit--;
if (nindy_serial == NULL)
{
perror_with_name (name);
}
savename = savestring (name, strlen (name));
push_target (&nindy_ops);
target_fetch_registers(-1);
}
/* User-initiated quit of nindy operations. */
static void
nindy_detach (name, from_tty)
char *name;
int from_tty;
{
if (name)
error ("Too many arguments");
pop_target ();
}
static void
nindy_files_info ()
{
printf_unfiltered("\tAttached to %s at %d bps%s%s.\n", savename,
sr_get_baud_rate(),
nindy_old_protocol? " in old protocol": "",
nindy_initial_brk? " with initial break": "");
}
/* Return the number of characters in the buffer before
the first DLE character. */
static
int
non_dle( buf, n )
char *buf; /* Character buffer; NOT '\0'-terminated */
int n; /* Number of characters in buffer */
{
int i;
for ( i = 0; i < n; i++ ){
if ( buf[i] == DLE ){
break;
}
}
return i;
}
/* Tell the remote machine to resume. */
void
nindy_resume (pid, step, siggnal)
int pid, step;
enum target_signal siggnal;
{
if (siggnal != TARGET_SIGNAL_0 && siggnal != stop_signal)
warning ("Can't send signals to remote NINDY targets.");
dcache_flush(nindy_dcache);
if ( regs_changed ){
nindy_store_registers (-1);
regs_changed = 0;
}
have_regs = 0;
ninGo( step );
}
/* FIXME, we can probably use the normal terminal_inferior stuff here.
We have to do terminal_inferior and then set up the passthrough
settings initially. Thereafter, terminal_ours and terminal_inferior
will automatically swap the settings around for us. */
struct clean_up_tty_args {
serial_ttystate state;
serial_t serial;
};
static void
clean_up_tty (ptrarg)
PTR ptrarg;
{
struct clean_up_tty_args *args = (struct clean_up_tty_args *) ptrarg;
SERIAL_SET_TTY_STATE (args->serial, args->state);
free (args->state);
warning ("\n\n\
You may need to reset the 80960 and/or reload you