| /* OBSOLETE /* Remote debugging interface for AMD 290*0 Adapt Monitor Version 2.1d18. */ |
| /* OBSOLETE Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, */ |
| /* OBSOLETE 2001 Free Software Foundation, Inc. */ |
| /* OBSOLETE Contributed by David Wood at New York University (wood@lab.ultra.nyu.edu). */ |
| /* OBSOLETE Adapted from work done at Cygnus Support in remote-eb.c. */ |
| /* OBSOLETE */ |
| /* OBSOLETE This file is part of GDB. */ |
| /* OBSOLETE */ |
| /* OBSOLETE This program is free software; you can redistribute it and/or modify */ |
| /* OBSOLETE it under the terms of the GNU General Public License as published by */ |
| /* OBSOLETE the Free Software Foundation; either version 2 of the License, or */ |
| /* OBSOLETE (at your option) any later version. */ |
| /* OBSOLETE */ |
| /* OBSOLETE This program is distributed in the hope that it will be useful, */ |
| /* OBSOLETE but WITHOUT ANY WARRANTY; without even the implied warranty of */ |
| /* OBSOLETE MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ |
| /* OBSOLETE GNU General Public License for more details. */ |
| /* OBSOLETE */ |
| /* OBSOLETE You should have received a copy of the GNU General Public License */ |
| /* OBSOLETE along with this program; if not, write to the Free Software */ |
| /* OBSOLETE Foundation, Inc., 59 Temple Place - Suite 330, */ |
| /* OBSOLETE Boston, MA 02111-1307, USA. */ */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* This is like remote.c but is for an esoteric situation-- */ |
| /* OBSOLETE having a 29k board attached to an Adapt inline monitor. */ |
| /* OBSOLETE The monitor is connected via serial line to a unix machine */ |
| /* OBSOLETE running gdb. */ |
| /* OBSOLETE */ |
| /* OBSOLETE 3/91 - developed on Sun3 OS 4.1, by David Wood */ |
| /* OBSOLETE o - I can't get binary coff to load. */ |
| /* OBSOLETE o - I can't get 19200 baud rate to work. */ |
| /* OBSOLETE 7/91 o - Freeze mode tracing can be done on a 29050. */ */ |
| /* OBSOLETE */ |
| /* OBSOLETE */ |
| /* OBSOLETE */ |
| /* OBSOLETE #include "defs.h" */ |
| /* OBSOLETE #include "gdb_string.h" */ |
| /* OBSOLETE #include "inferior.h" */ |
| /* OBSOLETE #include "value.h" */ |
| /* OBSOLETE #include <ctype.h> */ |
| /* OBSOLETE #include <fcntl.h> */ |
| /* OBSOLETE #include <signal.h> */ |
| /* OBSOLETE #include <errno.h> */ |
| /* OBSOLETE #include "terminal.h" */ |
| /* OBSOLETE #include "target.h" */ |
| /* OBSOLETE #include "gdbcore.h" */ |
| /* OBSOLETE #include "regcache.h" */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* This processor is getting rusty but I am trying to keep it */ |
| /* OBSOLETE up to date at least with data structure changes. */ |
| /* OBSOLETE Activate this block to compile just this file. */ |
| /* OBSOLETE */ */ |
| /* OBSOLETE #define COMPILE_CHECK 0 */ |
| /* OBSOLETE #if COMPILE_CHECK */ |
| /* OBSOLETE #define Q_REGNUM 0 */ |
| /* OBSOLETE #define VAB_REGNUM 0 */ |
| /* OBSOLETE #define CPS_REGNUM 0 */ |
| /* OBSOLETE #define IPA_REGNUM 0 */ |
| /* OBSOLETE #define IPB_REGNUM 0 */ |
| /* OBSOLETE #define GR1_REGNUM 0 */ |
| /* OBSOLETE #define LR0_REGNUM 0 */ |
| /* OBSOLETE #define IPC_REGNUM 0 */ |
| /* OBSOLETE #define CR_REGNUM 0 */ |
| /* OBSOLETE #define BP_REGNUM 0 */ |
| /* OBSOLETE #define FC_REGNUM 0 */ |
| /* OBSOLETE #define INTE_REGNUM 0 */ |
| /* OBSOLETE #define EXO_REGNUM 0 */ |
| /* OBSOLETE #define GR96_REGNUM 0 */ |
| /* OBSOLETE #define NPC_REGNUM */ |
| /* OBSOLETE #define FPE_REGNUM 0 */ |
| /* OBSOLETE #define PC2_REGNUM 0 */ |
| /* OBSOLETE #define FPS_REGNUM 0 */ |
| /* OBSOLETE #define ALU_REGNUM 0 */ |
| /* OBSOLETE #define LRU_REGNUM 0 */ |
| /* OBSOLETE #define TERMINAL int */ |
| /* OBSOLETE #define RAW 1 */ |
| /* OBSOLETE #define ANYP 1 */ |
| /* OBSOLETE extern int a29k_freeze_mode; */ |
| /* OBSOLETE extern int processor_type; */ |
| /* OBSOLETE extern char *processor_name; */ |
| /* OBSOLETE #endif */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* External data declarations */ */ |
| /* OBSOLETE extern int stop_soon_quietly; /* for wait_for_inferior */ */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Forward data declarations */ */ |
| /* OBSOLETE extern struct target_ops adapt_ops; /* Forward declaration */ */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Forward function declarations */ */ |
| /* OBSOLETE static void adapt_fetch_registers (); */ |
| /* OBSOLETE static void adapt_store_registers (); */ |
| /* OBSOLETE static void adapt_close (); */ |
| /* OBSOLETE static int adapt_clear_breakpoints (); */ |
| /* OBSOLETE */ |
| /* OBSOLETE #define FREEZE_MODE (read_register(CPS_REGNUM) && 0x400) */ |
| /* OBSOLETE #define USE_SHADOW_PC ((processor_type == a29k_freeze_mode) && FREEZE_MODE) */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Can't seem to get binary coff working */ */ |
| /* OBSOLETE #define ASCII_COFF /* Adapt will be downloaded with ascii coff */ */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* FIXME: Replace with `set remotedebug'. */ */ |
| /* OBSOLETE #define LOG_FILE "adapt.log" */ |
| /* OBSOLETE #if defined (LOG_FILE) */ |
| /* OBSOLETE FILE *log_file = NULL; */ |
| /* OBSOLETE #endif */ |
| /* OBSOLETE */ |
| /* OBSOLETE static int timeout = 5; */ |
| /* OBSOLETE static char *dev_name; */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Descriptor for I/O to remote machine. Initialize it to -1 so that */ |
| /* OBSOLETE adapt_open knows that we don't have a file open when the program */ |
| /* OBSOLETE starts. */ */ |
| /* OBSOLETE int adapt_desc = -1; */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* stream which is fdopen'd from adapt_desc. Only valid when */ |
| /* OBSOLETE adapt_desc != -1. */ */ |
| /* OBSOLETE FILE *adapt_stream; */ |
| /* OBSOLETE */ |
| /* OBSOLETE #define ON 1 */ |
| /* OBSOLETE #define OFF 0 */ |
| /* OBSOLETE static void */ |
| /* OBSOLETE rawmode (int desc, int turnon) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE */ |
| /* OBSOLETE TERMINAL sg; */ |
| /* OBSOLETE */ |
| /* OBSOLETE if (desc < 0) */ |
| /* OBSOLETE return; */ |
| /* OBSOLETE */ |
| /* OBSOLETE ioctl (desc, TIOCGETP, &sg); */ |
| /* OBSOLETE */ |
| /* OBSOLETE if (turnon) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE #ifdef HAVE_TERMIO */ |
| /* OBSOLETE sg.c_lflag &= ~(ICANON); */ |
| /* OBSOLETE #else */ |
| /* OBSOLETE sg.sg_flags |= RAW; */ |
| /* OBSOLETE #endif */ |
| /* OBSOLETE } */ |
| /* OBSOLETE else */ |
| /* OBSOLETE { */ |
| /* OBSOLETE #ifdef HAVE_TERMIO */ |
| /* OBSOLETE sg.c_lflag |= ICANON; */ |
| /* OBSOLETE #else */ |
| /* OBSOLETE sg.sg_flags &= ~(RAW); */ |
| /* OBSOLETE #endif */ |
| /* OBSOLETE } */ |
| /* OBSOLETE ioctl (desc, TIOCSETP, &sg); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Suck up all the input from the adapt */ */ |
| /* OBSOLETE slurp_input (void) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE char buf[8]; */ |
| /* OBSOLETE */ |
| /* OBSOLETE #ifdef HAVE_TERMIO */ |
| /* OBSOLETE /* termio does the timeout for us. */ */ |
| /* OBSOLETE while (read (adapt_desc, buf, 8) > 0); */ |
| /* OBSOLETE #else */ |
| /* OBSOLETE alarm (timeout); */ |
| /* OBSOLETE while (read (adapt_desc, buf, 8) > 0); */ |
| /* OBSOLETE alarm (0); */ |
| /* OBSOLETE #endif */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Read a character from the remote system, doing all the fancy */ |
| /* OBSOLETE timeout stuff. */ */ |
| /* OBSOLETE static int */ |
| /* OBSOLETE readchar (void) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE char buf; */ |
| /* OBSOLETE */ |
| /* OBSOLETE buf = '\0'; */ |
| /* OBSOLETE #ifdef HAVE_TERMIO */ |
| /* OBSOLETE /* termio does the timeout for us. */ */ |
| /* OBSOLETE read (adapt_desc, &buf, 1); */ |
| /* OBSOLETE #else */ |
| /* OBSOLETE alarm (timeout); */ |
| /* OBSOLETE if (read (adapt_desc, &buf, 1) < 0) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE if (errno == EINTR) */ |
| /* OBSOLETE error ("Timeout reading from remote system."); */ |
| /* OBSOLETE else */ |
| /* OBSOLETE perror_with_name ("remote"); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE alarm (0); */ |
| /* OBSOLETE #endif */ |
| /* OBSOLETE */ |
| /* OBSOLETE if (buf == '\0') */ |
| /* OBSOLETE error ("Timeout reading from remote system."); */ |
| /* OBSOLETE #if defined (LOG_FILE) */ |
| /* OBSOLETE putc (buf & 0x7f, log_file); */ |
| /* OBSOLETE #endif */ |
| /* OBSOLETE return buf & 0x7f; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Keep discarding input from the remote system, until STRING is found. */ |
| /* OBSOLETE Let the user break out immediately. */ */ |
| /* OBSOLETE static void */ |
| /* OBSOLETE expect (char *string) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE char *p = string; */ |
| /* OBSOLETE */ |
| /* OBSOLETE fflush (adapt_stream); */ |
| /* OBSOLETE immediate_quit++; */ |
| /* OBSOLETE while (1) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE if (readchar () == *p) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE p++; */ |
| /* OBSOLETE if (*p == '\0') */ |
| /* OBSOLETE { */ |
| /* OBSOLETE immediate_quit--; */ |
| /* OBSOLETE return; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE } */ |
| /* OBSOLETE else */ |
| /* OBSOLETE p = string; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Keep discarding input until we see the adapt prompt. */ |
| /* OBSOLETE */ |
| /* OBSOLETE The convention for dealing with the prompt is that you */ |
| /* OBSOLETE o give your command */ |
| /* OBSOLETE o *then* wait for the prompt. */ |
| /* OBSOLETE */ |
| /* OBSOLETE Thus the last thing that a procedure does with the serial line */ |
| /* OBSOLETE will be an expect_prompt(). Exception: adapt_resume does not */ |
| /* OBSOLETE wait for the prompt, because the terminal is being handed over */ |
| /* OBSOLETE to the inferior. However, the next thing which happens after that */ |
| /* OBSOLETE is a adapt_wait which does wait for the prompt. */ |
| /* OBSOLETE Note that this includes abnormal exit, e.g. error(). This is */ |
| /* OBSOLETE necessary to prevent getting into states from which we can't */ |
| /* OBSOLETE recover. */ */ |
| /* OBSOLETE static void */ |
| /* OBSOLETE expect_prompt (void) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE #if defined (LOG_FILE) */ |
| /* OBSOLETE /* This is a convenient place to do this. The idea is to do it often */ |
| /* OBSOLETE enough that we never lose much data if we terminate abnormally. */ */ |
| /* OBSOLETE fflush (log_file); */ |
| /* OBSOLETE #endif */ |
| /* OBSOLETE fflush (adapt_stream); */ |
| /* OBSOLETE expect ("\n# "); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Get a hex digit from the remote system & return its value. */ |
| /* OBSOLETE If ignore_space is nonzero, ignore spaces (not newline, tab, etc). */ */ |
| /* OBSOLETE static int */ |
| /* OBSOLETE get_hex_digit (int ignore_space) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE int ch; */ |
| /* OBSOLETE while (1) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE ch = readchar (); */ |
| /* OBSOLETE if (ch >= '0' && ch <= '9') */ |
| /* OBSOLETE return ch - '0'; */ |
| /* OBSOLETE else if (ch >= 'A' && ch <= 'F') */ |
| /* OBSOLETE return ch - 'A' + 10; */ |
| /* OBSOLETE else if (ch >= 'a' && ch <= 'f') */ |
| /* OBSOLETE return ch - 'a' + 10; */ |
| /* OBSOLETE else if (ch == ' ' && ignore_space) */ |
| /* OBSOLETE ; */ |
| /* OBSOLETE else */ |
| /* OBSOLETE { */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE error ("Invalid hex digit from remote system."); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE } */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Get a byte from adapt_desc and put it in *BYT. Accept any number */ |
| /* OBSOLETE leading spaces. */ */ |
| /* OBSOLETE static void */ |
| /* OBSOLETE get_hex_byte (char *byt) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE int val; */ |
| /* OBSOLETE */ |
| /* OBSOLETE val = get_hex_digit (1) << 4; */ |
| /* OBSOLETE val |= get_hex_digit (0); */ |
| /* OBSOLETE *byt = val; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Read a 32-bit hex word from the adapt, preceded by a space */ */ |
| /* OBSOLETE static long */ |
| /* OBSOLETE get_hex_word (void) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE long val; */ |
| /* OBSOLETE int j; */ |
| /* OBSOLETE */ |
| /* OBSOLETE val = 0; */ |
| /* OBSOLETE for (j = 0; j < 8; j++) */ |
| /* OBSOLETE val = (val << 4) + get_hex_digit (j == 0); */ |
| /* OBSOLETE return val; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE /* Get N 32-bit hex words from remote, each preceded by a space */ |
| /* OBSOLETE and put them in registers starting at REGNO. */ */ |
| /* OBSOLETE static void */ |
| /* OBSOLETE get_hex_regs (int n, int regno) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE long val; */ |
| /* OBSOLETE while (n--) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE val = get_hex_word (); */ |
| /* OBSOLETE supply_register (regno++, (char *) &val); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE } */ |
| /* OBSOLETE /* Called when SIGALRM signal sent due to alarm() timeout. */ */ |
| /* OBSOLETE #ifndef HAVE_TERMIO */ |
| /* OBSOLETE */ |
| /* OBSOLETE volatile int n_alarms; */ |
| /* OBSOLETE */ |
| /* OBSOLETE void */ |
| /* OBSOLETE adapt_timer (void) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE #if 0 */ |
| /* OBSOLETE if (kiodebug) */ |
| /* OBSOLETE printf ("adapt_timer called\n"); */ |
| /* OBSOLETE #endif */ |
| /* OBSOLETE n_alarms++; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE #endif */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* malloc'd name of the program on the remote system. */ */ |
| /* OBSOLETE static char *prog_name = NULL; */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Number of SIGTRAPs we need to simulate. That is, the next */ |
| /* OBSOLETE NEED_ARTIFICIAL_TRAP calls to adapt_wait should just return */ |
| /* OBSOLETE SIGTRAP without actually waiting for anything. */ */ |
| /* OBSOLETE */ |
| /* OBSOLETE static int need_artificial_trap = 0; */ |
| /* OBSOLETE */ |
| /* OBSOLETE void */ |
| /* OBSOLETE adapt_kill (char *arg, int from_tty) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE fprintf (adapt_stream, "K"); */ |
| /* OBSOLETE fprintf (adapt_stream, "\r"); */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE /* */ |
| /* OBSOLETE * Download a file specified in 'args', to the adapt. */ |
| /* OBSOLETE * FIXME: Assumes the file to download is a binary coff file. */ |
| /* OBSOLETE */ */ |
| /* OBSOLETE static void */ |
| /* OBSOLETE adapt_load (char *args, int fromtty) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE FILE *fp; */ |
| /* OBSOLETE int n; */ |
| /* OBSOLETE char buffer[1024]; */ |
| /* OBSOLETE */ |
| /* OBSOLETE if (!adapt_stream) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE printf_filtered ("Adapt not open. Use 'target' command to open adapt\n"); */ |
| /* OBSOLETE return; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* OK, now read in the file. Y=read, C=COFF, T=dTe port */ |
| /* OBSOLETE 0=start address. */ */ |
| /* OBSOLETE */ |
| /* OBSOLETE #ifdef ASCII_COFF /* Ascii coff */ */ |
| /* OBSOLETE fprintf (adapt_stream, "YA T,0\r"); */ |
| /* OBSOLETE fflush (adapt_stream); /* Just in case */ */ |
| /* OBSOLETE /* FIXME: should check args for only 1 argument */ */ |
| /* OBSOLETE sprintf (buffer, "cat %s | btoa > /tmp/#adapt-btoa", args); */ |
| /* OBSOLETE system (buffer); */ |
| /* OBSOLETE fp = fopen ("/tmp/#adapt-btoa", "r"); */ |
| /* OBSOLETE rawmode (adapt_desc, OFF); */ |
| /* OBSOLETE while (n = fread (buffer, 1, 1024, fp)) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE do */ |
| /* OBSOLETE { */ |
| /* OBSOLETE n -= write (adapt_desc, buffer, n); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE while (n > 0); */ |
| /* OBSOLETE if (n < 0) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE perror ("writing ascii coff"); */ |
| /* OBSOLETE break; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE } */ |
| /* OBSOLETE fclose (fp); */ |
| /* OBSOLETE rawmode (adapt_desc, ON); */ |
| /* OBSOLETE system ("rm /tmp/#adapt-btoa"); */ |
| /* OBSOLETE #else /* Binary coff - can't get it to work . */ */ |
| /* OBSOLETE fprintf (adapt_stream, "YC T,0\r"); */ |
| /* OBSOLETE fflush (adapt_stream); /* Just in case */ */ |
| /* OBSOLETE if (!(fp = fopen (args, "r"))) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE printf_filtered ("Can't open %s\n", args); */ |
| /* OBSOLETE return; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE while (n = fread (buffer, 1, 512, fp)) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE do */ |
| /* OBSOLETE { */ |
| /* OBSOLETE n -= write (adapt_desc, buffer, n); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE while (n > 0); */ |
| /* OBSOLETE if (n < 0) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE perror ("writing ascii coff"); */ |
| /* OBSOLETE break; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE } */ |
| /* OBSOLETE fclose (fp); */ |
| /* OBSOLETE #endif */ |
| /* OBSOLETE expect_prompt (); /* Skip garbage that comes out */ */ |
| /* OBSOLETE fprintf (adapt_stream, "\r"); */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* This is called not only when we first attach, but also when the */ |
| /* OBSOLETE user types "run" after having attached. */ */ |
| /* OBSOLETE void */ |
| /* OBSOLETE adapt_create_inferior (char *execfile, char *args, char **env) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE int entry_pt; */ |
| /* OBSOLETE */ |
| /* OBSOLETE if (args && *args) */ |
| /* OBSOLETE error ("Can't pass arguments to remote adapt process."); */ |
| /* OBSOLETE */ |
| /* OBSOLETE if (execfile == 0 || exec_bfd == 0) */ |
| /* OBSOLETE error ("No executable file specified"); */ |
| /* OBSOLETE */ |
| /* OBSOLETE entry_pt = (int) bfd_get_start_address (exec_bfd); */ |
| /* OBSOLETE */ |
| /* OBSOLETE if (adapt_stream) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE adapt_kill (NULL, NULL); */ |
| /* OBSOLETE adapt_clear_breakpoints (); */ |
| /* OBSOLETE init_wait_for_inferior (); */ |
| /* OBSOLETE /* Clear the input because what the adapt sends back is different */ |
| /* OBSOLETE * depending on whether it was running or not. */ |
| /* OBSOLETE */ */ |
| /* OBSOLETE slurp_input (); /* After this there should be a prompt */ */ |
| /* OBSOLETE fprintf (adapt_stream, "\r"); */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE printf_filtered ("Do you want to download '%s' (y/n)? [y] : ", prog_name); */ |
| /* OBSOLETE { */ |
| /* OBSOLETE char buffer[10]; */ |
| /* OBSOLETE gets (buffer); */ |
| /* OBSOLETE if (*buffer != 'n') */ |
| /* OBSOLETE { */ |
| /* OBSOLETE adapt_load (prog_name, 0); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE #ifdef NOTDEF */ |
| /* OBSOLETE /* Set the PC and wait for a go/cont */ */ |
| /* OBSOLETE fprintf (adapt_stream, "G %x,N\r", entry_pt); */ |
| /* OBSOLETE printf_filtered ("Now use the 'continue' command to start.\n"); */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE #else */ |
| /* OBSOLETE insert_breakpoints (); /* Needed to get correct instruction in cache */ */ |
| /* OBSOLETE proceed (entry_pt, TARGET_SIGNAL_DEFAULT, 0); */ |
| /* OBSOLETE #endif */ |
| /* OBSOLETE */ |
| /* OBSOLETE } */ |
| /* OBSOLETE else */ |
| /* OBSOLETE { */ |
| /* OBSOLETE printf_filtered ("Adapt not open yet.\n"); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Translate baud rates from integers to damn B_codes. Unix should */ |
| /* OBSOLETE have outgrown this crap years ago, but even POSIX wouldn't buck it. */ */ |
| /* OBSOLETE */ |
| /* OBSOLETE #ifndef B19200 */ |
| /* OBSOLETE #define B19200 EXTA */ |
| /* OBSOLETE #endif */ |
| /* OBSOLETE #ifndef B38400 */ |
| /* OBSOLETE #define B38400 EXTB */ |
| /* OBSOLETE #endif */ |
| /* OBSOLETE */ |
| /* OBSOLETE static struct */ |
| /* OBSOLETE { */ |
| /* OBSOLETE int rate, damn_b; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE baudtab[] = */ |
| /* OBSOLETE { */ |
| /* OBSOLETE { */ |
| /* OBSOLETE 0, B0 */ |
| /* OBSOLETE } */ |
| /* OBSOLETE , */ |
| /* OBSOLETE { */ |
| /* OBSOLETE 50, B50 */ |
| /* OBSOLETE } */ |
| /* OBSOLETE , */ |
| /* OBSOLETE { */ |
| /* OBSOLETE 75, B75 */ |
| /* OBSOLETE } */ |
| /* OBSOLETE , */ |
| /* OBSOLETE { */ |
| /* OBSOLETE 110, B110 */ |
| /* OBSOLETE } */ |
| /* OBSOLETE , */ |
| /* OBSOLETE { */ |
| /* OBSOLETE 134, B134 */ |
| /* OBSOLETE } */ |
| /* OBSOLETE , */ |
| /* OBSOLETE { */ |
| /* OBSOLETE 150, B150 */ |
| /* OBSOLETE } */ |
| /* OBSOLETE , */ |
| /* OBSOLETE { */ |
| /* OBSOLETE 200, B200 */ |
| /* OBSOLETE } */ |
| /* OBSOLETE , */ |
| /* OBSOLETE { */ |
| /* OBSOLETE 300, B300 */ |
| /* OBSOLETE } */ |
| /* OBSOLETE , */ |
| /* OBSOLETE { */ |
| /* OBSOLETE 600, B600 */ |
| /* OBSOLETE } */ |
| /* OBSOLETE , */ |
| /* OBSOLETE { */ |
| /* OBSOLETE 1200, B1200 */ |
| /* OBSOLETE } */ |
| /* OBSOLETE , */ |
| /* OBSOLETE { */ |
| /* OBSOLETE 1800, B1800 */ |
| /* OBSOLETE } */ |
| /* OBSOLETE , */ |
| /* OBSOLETE { */ |
| /* OBSOLETE 2400, B2400 */ |
| /* OBSOLETE } */ |
| /* OBSOLETE , */ |
| /* OBSOLETE { */ |
| /* OBSOLETE 4800, B4800 */ |
| /* OBSOLETE } */ |
| /* OBSOLETE , */ |
| /* OBSOLETE { */ |
| /* OBSOLETE 9600, B9600 */ |
| /* OBSOLETE } */ |
| /* OBSOLETE , */ |
| /* OBSOLETE { */ |
| /* OBSOLETE 19200, B19200 */ |
| /* OBSOLETE } */ |
| /* OBSOLETE , */ |
| /* OBSOLETE { */ |
| /* OBSOLETE 38400, B38400 */ |
| /* OBSOLETE } */ |
| /* OBSOLETE , */ |
| /* OBSOLETE { */ |
| /* OBSOLETE -1, -1 */ |
| /* OBSOLETE } */ |
| /* OBSOLETE , */ |
| /* OBSOLETE }; */ |
| /* OBSOLETE */ |
| /* OBSOLETE static int */ |
| /* OBSOLETE damn_b (int rate) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE int i; */ |
| /* OBSOLETE */ |
| /* OBSOLETE for (i = 0; baudtab[i].rate != -1; i++) */ |
| /* OBSOLETE if (rate == baudtab[i].rate) */ |
| /* OBSOLETE return baudtab[i].damn_b; */ |
| /* OBSOLETE return B38400; /* Random */ */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Open a connection to a remote debugger. */ |
| /* OBSOLETE NAME is the filename used for communication, then a space, */ |
| /* OBSOLETE then the baud rate. */ |
| /* OBSOLETE */ */ |
| /* OBSOLETE */ |
| /* OBSOLETE static int baudrate = 9600; */ |
| /* OBSOLETE static void */ |
| /* OBSOLETE adapt_open (char *name, int from_tty) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE TERMINAL sg; */ |
| /* OBSOLETE unsigned int prl; */ |
| /* OBSOLETE char *p; */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Find the first whitespace character, it separates dev_name from */ |
| /* OBSOLETE prog_name. */ */ |
| /* OBSOLETE if (name == 0) */ |
| /* OBSOLETE goto erroid; */ |
| /* OBSOLETE */ |
| /* OBSOLETE for (p = name; */ |
| /* OBSOLETE *p != '\0' && !isspace (*p); p++) */ |
| /* OBSOLETE ; */ |
| /* OBSOLETE if (*p == '\0') */ |
| /* OBSOLETE erroid: */ |
| /* OBSOLETE error ("\ */ |
| /* OBSOLETE Please include the name of the device for the serial port,\n\ */ |
| /* OBSOLETE the baud rate, and the name of the program to run on the remote system."); */ |
| /* OBSOLETE dev_name = (char *) xmalloc (p - name + 1); */ |
| /* OBSOLETE strncpy (dev_name, name, p - name); */ |
| /* OBSOLETE dev_name[p - name] = '\0'; */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Skip over the whitespace after dev_name */ */ |
| /* OBSOLETE for (; isspace (*p); p++) */ |
| /* OBSOLETE /*EMPTY */ ; */ |
| /* OBSOLETE */ |
| /* OBSOLETE if (1 != sscanf (p, "%d ", &baudrate)) */ |
| /* OBSOLETE goto erroid; */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Skip the number and then the spaces */ */ |
| /* OBSOLETE for (; isdigit (*p); p++) */ |
| /* OBSOLETE /*EMPTY */ ; */ |
| /* OBSOLETE for (; isspace (*p); p++) */ |
| /* OBSOLETE /*EMPTY */ ; */ |
| /* OBSOLETE */ |
| /* OBSOLETE if (prog_name != NULL) */ |
| /* OBSOLETE xfree (prog_name); */ |
| /* OBSOLETE prog_name = savestring (p, strlen (p)); */ |
| /* OBSOLETE */ |
| /* OBSOLETE adapt_close (0); */ |
| /* OBSOLETE */ |
| /* OBSOLETE adapt_desc = open (dev_name, O_RDWR); */ |
| /* OBSOLETE if (adapt_desc < 0) */ |
| /* OBSOLETE perror_with_name (dev_name); */ |
| /* OBSOLETE ioctl (adapt_desc, TIOCGETP, &sg); */ |
| /* OBSOLETE #if ! defined(COMPILE_CHECK) */ |
| /* OBSOLETE #ifdef HAVE_TERMIO */ |
| /* OBSOLETE sg.c_cc[VMIN] = 0; /* read with timeout. */ */ |
| /* OBSOLETE sg.c_cc[VTIME] = timeout * 10; */ |
| /* OBSOLETE sg.c_lflag &= ~(ICANON | ECHO); */ |
| /* OBSOLETE sg.c_cflag = (sg.c_cflag & ~CBAUD) | damn_b (baudrate); */ |
| /* OBSOLETE #else */ |
| /* OBSOLETE sg.sg_ispeed = damn_b (baudrate); */ |
| /* OBSOLETE sg.sg_ospeed = damn_b (baudrate); */ |
| /* OBSOLETE sg.sg_flags |= RAW | ANYP; */ |
| /* OBSOLETE sg.sg_flags &= ~ECHO; */ |
| /* OBSOLETE #endif */ |
| /* OBSOLETE */ |
| /* OBSOLETE ioctl (adapt_desc, TIOCSETP, &sg); */ |
| /* OBSOLETE adapt_stream = fdopen (adapt_desc, "r+"); */ |
| /* OBSOLETE #endif /* compile_check */ */ |
| /* OBSOLETE push_target (&adapt_ops); */ |
| /* OBSOLETE */ |
| /* OBSOLETE #ifndef HAVE_TERMIO */ |
| /* OBSOLETE #ifndef NO_SIGINTERRUPT */ |
| /* OBSOLETE /* Cause SIGALRM's to make reads fail with EINTR instead of resuming */ |
| /* OBSOLETE the read. */ */ |
| /* OBSOLETE if (siginterrupt (SIGALRM, 1) != 0) */ |
| /* OBSOLETE perror ("adapt_open: error in siginterrupt"); */ |
| /* OBSOLETE #endif */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Set up read timeout timer. */ */ |
| /* OBSOLETE if ((void (*)) signal (SIGALRM, adapt_timer) == (void (*)) -1) */ |
| /* OBSOLETE perror ("adapt_open: error in signal"); */ |
| /* OBSOLETE #endif */ |
| /* OBSOLETE */ |
| /* OBSOLETE #if defined (LOG_FILE) */ |
| /* OBSOLETE log_file = fopen (LOG_FILE, "w"); */ |
| /* OBSOLETE if (log_file == NULL) */ |
| /* OBSOLETE perror_with_name (LOG_FILE); */ |
| /* OBSOLETE #endif */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Put this port into NORMAL mode, send the 'normal' character */ */ |
| /* OBSOLETE write (adapt_desc, "", 1); /* Control A */ */ |
| /* OBSOLETE write (adapt_desc, "\r", 1); */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Hello? Are you there? */ */ |
| /* OBSOLETE write (adapt_desc, "\r", 1); */ |
| /* OBSOLETE */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Clear any break points */ */ |
| /* OBSOLETE adapt_clear_breakpoints (); */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Print out some stuff, letting the user now what's going on */ */ |
| /* OBSOLETE printf_filtered ("Connected to an Adapt via %s.\n", dev_name); */ |
| /* OBSOLETE /* FIXME: can this restriction be removed? */ */ |
| /* OBSOLETE printf_filtered ("Remote debugging using virtual addresses works only\n"); */ |
| /* OBSOLETE printf_filtered ("\twhen virtual addresses map 1:1 to physical addresses.\n"); */ |
| /* OBSOLETE if (processor_type != a29k_freeze_mode) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE fprintf_filtered (gdb_stderr, */ |
| /* OBSOLETE "Freeze-mode debugging not available, and can only be done on an A29050.\n"); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Close out all files and local state before this target loses control. */ */ |
| /* OBSOLETE */ |
| /* OBSOLETE static void */ |
| /* OBSOLETE adapt_close (int quitting) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Clear any break points */ */ |
| /* OBSOLETE adapt_clear_breakpoints (); */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Put this port back into REMOTE mode */ */ |
| /* OBSOLETE if (adapt_stream) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE fflush (adapt_stream); */ |
| /* OBSOLETE sleep (1); /* Let any output make it all the way back */ */ |
| /* OBSOLETE write (adapt_desc, "R\r", 2); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Due to a bug in Unix, fclose closes not only the stdio stream, */ |
| /* OBSOLETE but also the file descriptor. So we don't actually close */ |
| /* OBSOLETE adapt_desc. */ */ |
| /* OBSOLETE if (adapt_stream) */ |
| /* OBSOLETE fclose (adapt_stream); /* This also closes adapt_desc */ */ |
| /* OBSOLETE if (adapt_desc >= 0) */ |
| /* OBSOLETE /* close (adapt_desc); */ */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Do not try to close adapt_desc again, later in the program. */ */ |
| /* OBSOLETE adapt_stream = NULL; */ |
| /* OBSOLETE adapt_desc = -1; */ |
| /* OBSOLETE */ |
| /* OBSOLETE #if defined (LOG_FILE) */ |
| /* OBSOLETE if (log_file) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE if (ferror (log_file)) */ |
| /* OBSOLETE printf_filtered ("Error writing log file.\n"); */ |
| /* OBSOLETE if (fclose (log_file) != 0) */ |
| /* OBSOLETE printf_filtered ("Error closing log file.\n"); */ |
| /* OBSOLETE log_file = NULL; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE #endif */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Attach to the target that is already loaded and possibly running */ */ |
| /* OBSOLETE static void */ |
| /* OBSOLETE adapt_attach (char *args, int from_tty) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE */ |
| /* OBSOLETE if (from_tty) */ |
| /* OBSOLETE printf_filtered ("Attaching to remote program %s.\n", prog_name); */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Send the adapt a kill. It is ok if it is not already running */ */ |
| /* OBSOLETE fprintf (adapt_stream, "K\r"); */ |
| /* OBSOLETE fflush (adapt_stream); */ |
| /* OBSOLETE expect_prompt (); /* Slurp the echo */ */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Terminate the open connection to the remote debugger. */ |
| /* OBSOLETE Use this when you want to detach and do something else */ |
| /* OBSOLETE with your gdb. */ */ |
| /* OBSOLETE void */ |
| /* OBSOLETE adapt_detach (char *args, int from_tty) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE */ |
| /* OBSOLETE if (adapt_stream) */ |
| /* OBSOLETE { /* Send it on its way (tell it to continue) */ */ |
| /* OBSOLETE adapt_clear_breakpoints (); */ |
| /* OBSOLETE fprintf (adapt_stream, "G\r"); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE pop_target (); /* calls adapt_close to do the real work */ */ |
| /* OBSOLETE if (from_tty) */ |
| /* OBSOLETE printf_filtered ("Ending remote %s debugging\n", target_shortname); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Tell the remote machine to resume. */ */ |
| /* OBSOLETE */ |
| /* OBSOLETE void */ |
| /* OBSOLETE adapt_resume (ptid_t ptid, int step, enum target_signal sig) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE if (step) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE write (adapt_desc, "t 1,s\r", 6); */ |
| /* OBSOLETE /* Wait for the echo. */ */ |
| /* OBSOLETE expect ("t 1,s\r\n"); */ |
| /* OBSOLETE /* Then comes a line containing the instruction we stepped to. */ */ |
| /* OBSOLETE expect ("@"); */ |
| /* OBSOLETE /* Then we get the prompt. */ */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Force the next adapt_wait to return a trap. Not doing anything */ |
| /* OBSOLETE about I/O from the target means that the user has to type */ |
| /* OBSOLETE "continue" to see any. FIXME, this should be fixed. */ */ |
| /* OBSOLETE need_artificial_trap = 1; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE else */ |
| /* OBSOLETE { */ |
| /* OBSOLETE write (adapt_desc, "G\r", 2); */ |
| /* OBSOLETE /* Swallow the echo. */ */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Wait until the remote machine stops, then return, */ |
| /* OBSOLETE storing status in STATUS just as `wait' would. */ */ |
| /* OBSOLETE */ |
| /* OBSOLETE ptid_t */ |
| /* OBSOLETE adapt_wait (ptid_t ptid, struct target_waitstatus *status) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE /* Strings to look for. '?' means match any single character. */ |
| /* OBSOLETE Note that with the algorithm we use, the initial character */ |
| /* OBSOLETE of the string cannot recur in the string, or we will not */ |
| /* OBSOLETE find some cases of the string in the input. */ */ |
| /* OBSOLETE */ |
| /* OBSOLETE static char bpt[] = "@"; */ |
| /* OBSOLETE /* It would be tempting to look for "\n[__exit + 0x8]\n" */ |
| /* OBSOLETE but that requires loading symbols with "yc i" and even if */ |
| /* OBSOLETE we did do that we don't know that the file has symbols. */ */ |
| /* OBSOLETE static char exitmsg[] = "@????????I JMPTI GR121,LR0"; */ |
| /* OBSOLETE char *bp = bpt; */ |
| /* OBSOLETE char *ep = exitmsg; */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Large enough for either sizeof (bpt) or sizeof (exitmsg) chars. */ */ |
| /* OBSOLETE char swallowed[50]; */ |
| /* OBSOLETE /* Current position in swallowed. */ */ |
| /* OBSOLETE char *swallowed_p = swallowed; */ |
| /* OBSOLETE */ |
| /* OBSOLETE int ch; */ |
| /* OBSOLETE int ch_handled; */ |
| /* OBSOLETE int old_timeout = timeout; */ |
| /* OBSOLETE int old_immediate_quit = immediate_quit; */ |
| /* OBSOLETE */ |
| /* OBSOLETE status->kind = TARGET_WAITKIND_EXITED; */ |
| /* OBSOLETE status->value.integer = 0; */ |
| /* OBSOLETE */ |
| /* OBSOLETE if (need_artificial_trap != 0) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE status->kind = TARGET_WAITKIND_STOPPED; */ |
| /* OBSOLETE status->value.sig = TARGET_SIGNAL_TRAP; */ |
| /* OBSOLETE need_artificial_trap--; */ |
| /* OBSOLETE return inferior_ptid; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE timeout = 0; /* Don't time out -- user program is running. */ */ |
| /* OBSOLETE immediate_quit = 1; /* Helps ability to QUIT */ */ |
| /* OBSOLETE while (1) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE QUIT; /* Let user quit and leave process running */ */ |
| /* OBSOLETE ch_handled = 0; */ |
| /* OBSOLETE ch = readchar (); */ |
| /* OBSOLETE if (ch == *bp) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE bp++; */ |
| /* OBSOLETE if (*bp == '\0') */ |
| /* OBSOLETE break; */ |
| /* OBSOLETE ch_handled = 1; */ |
| /* OBSOLETE */ |
| /* OBSOLETE *swallowed_p++ = ch; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE else */ |
| /* OBSOLETE bp = bpt; */ |
| /* OBSOLETE if (ch == *ep || *ep == '?') */ |
| /* OBSOLETE { */ |
| /* OBSOLETE ep++; */ |
| /* OBSOLETE if (*ep == '\0') */ |
| /* OBSOLETE break; */ |
| /* OBSOLETE */ |
| /* OBSOLETE if (!ch_handled) */ |
| /* OBSOLETE *swallowed_p++ = ch; */ |
| /* OBSOLETE ch_handled = 1; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE else */ |
| /* OBSOLETE ep = exitmsg; */ |
| /* OBSOLETE if (!ch_handled) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE char *p; */ |
| /* OBSOLETE /* Print out any characters which have been swallowed. */ */ |
| /* OBSOLETE for (p = swallowed; p < swallowed_p; ++p) */ |
| /* OBSOLETE putc (*p, stdout); */ |
| /* OBSOLETE swallowed_p = swallowed; */ |
| /* OBSOLETE putc (ch, stdout); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE } */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE if (*bp == '\0') */ |
| /* OBSOLETE { */ |
| /* OBSOLETE status->kind = TARGET_WAITKIND_STOPPED; */ |
| /* OBSOLETE status->value.sig = TARGET_SIGNAL_TRAP; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE else */ |
| /* OBSOLETE { */ |
| /* OBSOLETE status->kind = TARGET_WAITKIND_EXITED; */ |
| /* OBSOLETE status->value.integer = 0; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE timeout = old_timeout; */ |
| /* OBSOLETE immediate_quit = old_immediate_quit; */ |
| /* OBSOLETE return inferior_ptid; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Return the name of register number REGNO */ |
| /* OBSOLETE in the form input and output by adapt. */ |
| /* OBSOLETE */ |
| /* OBSOLETE Returns a pointer to a static buffer containing the answer. */ */ |
| /* OBSOLETE static char * */ |
| /* OBSOLETE get_reg_name (int regno) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE static char buf[80]; */ |
| /* OBSOLETE if (regno >= GR96_REGNUM && regno < GR96_REGNUM + 32) */ |
| /* OBSOLETE sprintf (buf, "GR%03d", regno - GR96_REGNUM + 96); */ |
| /* OBSOLETE #if defined(GR64_REGNUM) */ |
| /* OBSOLETE else if (regno >= GR64_REGNUM && regno < GR64_REGNUM + 32) */ |
| /* OBSOLETE sprintf (buf, "GR%03d", regno - GR64_REGNUM + 64); */ |
| /* OBSOLETE #endif */ |
| /* OBSOLETE else if (regno >= LR0_REGNUM && regno < LR0_REGNUM + 128) */ |
| /* OBSOLETE sprintf (buf, "LR%03d", regno - LR0_REGNUM); */ |
| /* OBSOLETE else if (regno == Q_REGNUM) */ |
| /* OBSOLETE strcpy (buf, "SR131"); */ |
| /* OBSOLETE else if (regno >= BP_REGNUM && regno <= CR_REGNUM) */ |
| /* OBSOLETE sprintf (buf, "SR%03d", regno - BP_REGNUM + 133); */ |
| /* OBSOLETE else if (regno == ALU_REGNUM) */ |
| /* OBSOLETE strcpy (buf, "SR132"); */ |
| /* OBSOLETE else if (regno >= IPC_REGNUM && regno <= IPB_REGNUM) */ |
| /* OBSOLETE sprintf (buf, "SR%03d", regno - IPC_REGNUM + 128); */ |
| /* OBSOLETE else if (regno >= VAB_REGNUM && regno <= LRU_REGNUM) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE /* When a 29050 is in freeze-mode, read shadow pcs instead */ */ |
| /* OBSOLETE if ((regno >= NPC_REGNUM && regno <= PC2_REGNUM) && USE_SHADOW_PC) */ |
| /* OBSOLETE sprintf (buf, "SR%03d", regno - NPC_REGNUM + 20); */ |
| /* OBSOLETE else */ |
| /* OBSOLETE sprintf (buf, "SR%03d", regno - VAB_REGNUM); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE else if (regno == GR1_REGNUM) */ |
| /* OBSOLETE strcpy (buf, "GR001"); */ |
| /* OBSOLETE return buf; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Read the remote registers. */ */ |
| /* OBSOLETE */ |
| /* OBSOLETE static void */ |
| /* OBSOLETE adapt_fetch_registers (void) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE int reg_index; */ |
| /* OBSOLETE int regnum_index; */ |
| /* OBSOLETE char tempbuf[10]; */ |
| /* OBSOLETE int sreg_buf[16]; */ |
| /* OBSOLETE int i, j; */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* */ |
| /* OBSOLETE * Global registers */ |
| /* OBSOLETE */ */ |
| /* OBSOLETE #if defined(GR64_REGNUM) */ |
| /* OBSOLETE write (adapt_desc, "dw gr64,gr95\r", 13); */ |
| /* OBSOLETE for (reg_index = 64, regnum_index = GR64_REGNUM; */ |
| /* OBSOLETE reg_index < 96; */ |
| /* OBSOLETE reg_index += 4, regnum_index += 4) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE sprintf (tempbuf, "GR%03d ", reg_index); */ |
| /* OBSOLETE expect (tempbuf); */ |
| /* OBSOLETE get_hex_regs (4, regnum_index); */ |
| /* OBSOLETE expect ("\n"); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE #endif */ |
| /* OBSOLETE write (adapt_desc, "dw gr96,gr127\r", 14); */ |
| /* OBSOLETE for (reg_index = 96, regnum_index = GR96_REGNUM; */ |
| /* OBSOLETE reg_index < 128; */ |
| /* OBSOLETE reg_index += 4, regnum_index += 4) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE sprintf (tempbuf, "GR%03d ", reg_index); */ |
| /* OBSOLETE expect (tempbuf); */ |
| /* OBSOLETE get_hex_regs (4, regnum_index); */ |
| /* OBSOLETE expect ("\n"); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* */ |
| /* OBSOLETE * Local registers */ |
| /* OBSOLETE */ */ |
| /* OBSOLETE for (i = 0; i < 128; i += 32) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE /* The PC has a tendency to hang if we get these */ |
| /* OBSOLETE all in one fell swoop ("dw lr0,lr127"). */ */ |
| /* OBSOLETE sprintf (tempbuf, "dw lr%d\r", i); */ |
| /* OBSOLETE write (adapt_desc, tempbuf, strlen (tempbuf)); */ |
| /* OBSOLETE for (reg_index = i, regnum_index = LR0_REGNUM + i; */ |
| /* OBSOLETE reg_index < i + 32; */ |
| /* OBSOLETE reg_index += 4, regnum_index += 4) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE sprintf (tempbuf, "LR%03d ", reg_index); */ |
| /* OBSOLETE expect (tempbuf); */ |
| /* OBSOLETE get_hex_regs (4, regnum_index); */ |
| /* OBSOLETE expect ("\n"); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* */ |
| /* OBSOLETE * Special registers */ |
| /* OBSOLETE */ */ |
| /* OBSOLETE sprintf (tempbuf, "dw sr0\r"); */ |
| /* OBSOLETE write (adapt_desc, tempbuf, strlen (tempbuf)); */ |
| /* OBSOLETE for (i = 0; i < 4; i++) */ |
| /* OBSOLETE { /* SR0 - SR14 */ */ |
| /* OBSOLETE sprintf (tempbuf, "SR%3d", i * 4); */ |
| /* OBSOLETE expect (tempbuf); */ |
| /* OBSOLETE for (j = 0; j < (i == 3 ? 3 : 4); j++) */ |
| /* OBSOLETE sreg_buf[i * 4 + j] = get_hex_word (); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE /* */ |
| /* OBSOLETE * Read the pcs individually if we are in freeze mode. */ |
| /* OBSOLETE * See get_reg_name(), it translates the register names for the pcs to */ |
| /* OBSOLETE * the names of the shadow pcs. */ |
| /* OBSOLETE */ */ |
| /* OBSOLETE if (USE_SHADOW_PC) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE sreg_buf[10] = read_register (NPC_REGNUM); /* pc0 */ */ |
| /* OBSOLETE sreg_buf[11] = read_register (PC_REGNUM); /* pc1 */ */ |
| /* OBSOLETE sreg_buf[12] = read_register (PC2_REGNUM); /* pc2 */ */ |
| /* OBSOLETE } */ |
| /* OBSOLETE for (i = 0; i < 14; i++) /* Supply vab -> lru */ */ |
| /* OBSOLETE supply_register (VAB_REGNUM + i, (char *) &sreg_buf[i]); */ |
| /* OBSOLETE sprintf (tempbuf, "dw sr128\r"); */ |
| /* OBSOLETE write (adapt_desc, tempbuf, strlen (tempbuf)); */ |
| /* OBSOLETE for (i = 0; i < 2; i++) */ |
| /* OBSOLETE { /* SR128 - SR135 */ */ |
| /* OBSOLETE sprintf (tempbuf, "SR%3d", 128 + i * 4); */ |
| /* OBSOLETE expect (tempbuf); */ |
| /* OBSOLETE for (j = 0; j < 4; j++) */ |
| /* OBSOLETE sreg_buf[i * 4 + j] = get_hex_word (); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE supply_register (IPC_REGNUM, (char *) &sreg_buf[0]); */ |
| /* OBSOLETE supply_register (IPA_REGNUM, (char *) &sreg_buf[1]); */ |
| /* OBSOLETE supply_register (IPB_REGNUM, (char *) &sreg_buf[2]); */ |
| /* OBSOLETE supply_register (Q_REGNUM, (char *) &sreg_buf[3]); */ |
| /* OBSOLETE /* Skip ALU */ */ |
| /* OBSOLETE supply_register (BP_REGNUM, (char *) &sreg_buf[5]); */ |
| /* OBSOLETE supply_register (FC_REGNUM, (char *) &sreg_buf[6]); */ |
| /* OBSOLETE supply_register (CR_REGNUM, (char *) &sreg_buf[7]); */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* There doesn't seem to be any way to get these. */ */ |
| /* OBSOLETE { */ |
| /* OBSOLETE int val = -1; */ |
| /* OBSOLETE supply_register (FPE_REGNUM, (char *) &val); */ |
| /* OBSOLETE supply_register (INTE_REGNUM, (char *) &val); */ |
| /* OBSOLETE supply_register (FPS_REGNUM, (char *) &val); */ |
| /* OBSOLETE supply_register (EXO_REGNUM, (char *) &val); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE write (adapt_desc, "dw gr1,gr1\r", 11); */ |
| /* OBSOLETE expect ("GR001 "); */ |
| /* OBSOLETE get_hex_regs (1, GR1_REGNUM); */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Fetch register REGNO, or all registers if REGNO is -1. */ |
| /* OBSOLETE */ */ |
| /* OBSOLETE static void */ |
| /* OBSOLETE adapt_fetch_register (int regno) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE if (regno == -1) */ |
| /* OBSOLETE adapt_fetch_registers (); */ |
| /* OBSOLETE else */ |
| /* OBSOLETE { */ |
| /* OBSOLETE char *name = get_reg_name (regno); */ |
| /* OBSOLETE fprintf (adapt_stream, "dw %s,%s\r", name, name); */ |
| /* OBSOLETE expect (name); */ |
| /* OBSOLETE expect (" "); */ |
| /* OBSOLETE get_hex_regs (1, regno); */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Store the remote registers from the contents of the block REGS. */ */ |
| /* OBSOLETE */ |
| /* OBSOLETE static void */ |
| /* OBSOLETE adapt_store_registers (void) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE int i, j; */ |
| /* OBSOLETE */ |
| /* OBSOLETE fprintf (adapt_stream, "s gr1,%x\r", read_register (GR1_REGNUM)); */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE */ |
| /* OBSOLETE #if defined(GR64_REGNUM) */ |
| /* OBSOLETE for (j = 0; j < 32; j += 16) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE fprintf (adapt_stream, "s gr%d,", j + 64); */ |
| /* OBSOLETE for (i = 0; i < 15; ++i) */ |
| /* OBSOLETE fprintf (adapt_stream, "%x,", read_register (GR64_REGNUM + j + i)); */ |
| /* OBSOLETE fprintf (adapt_stream, "%x\r", read_register (GR64_REGNUM + j + 15)); */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE #endif */ |
| /* OBSOLETE for (j = 0; j < 32; j += 16) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE fprintf (adapt_stream, "s gr%d,", j + 96); */ |
| /* OBSOLETE for (i = 0; i < 15; ++i) */ |
| /* OBSOLETE fprintf (adapt_stream, "%x,", read_register (GR96_REGNUM + j + i)); */ |
| /* OBSOLETE fprintf (adapt_stream, "%x\r", read_register (GR96_REGNUM + j + 15)); */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE for (j = 0; j < 128; j += 16) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE fprintf (adapt_stream, "s lr%d,", j); */ |
| /* OBSOLETE for (i = 0; i < 15; ++i) */ |
| /* OBSOLETE fprintf (adapt_stream, "%x,", read_register (LR0_REGNUM + j + i)); */ |
| /* OBSOLETE fprintf (adapt_stream, "%x\r", read_register (LR0_REGNUM + j + 15)); */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE fprintf (adapt_stream, "s sr128,%x,%x,%x\r", read_register (IPC_REGNUM), */ |
| /* OBSOLETE read_register (IPA_REGNUM), read_register (IPB_REGNUM)); */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE fprintf (adapt_stream, "s sr133,%x,%x,%x\r", read_register (BP_REGNUM), */ |
| /* OBSOLETE read_register (FC_REGNUM), read_register (CR_REGNUM)); */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE fprintf (adapt_stream, "s sr131,%x\r", read_register (Q_REGNUM)); */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE fprintf (adapt_stream, "s sr0,"); */ |
| /* OBSOLETE for (i = 0; i < 7; ++i) */ |
| /* OBSOLETE fprintf (adapt_stream, "%x,", read_register (VAB_REGNUM + i)); */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE fprintf (adapt_stream, "s sr7,"); */ |
| /* OBSOLETE for (i = 7; i < 14; ++i) */ |
| /* OBSOLETE fprintf (adapt_stream, "%x,", read_register (VAB_REGNUM + i)); */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Store register REGNO, or all if REGNO == -1. */ |
| /* OBSOLETE Return errno value. */ */ |
| /* OBSOLETE void */ |
| /* OBSOLETE adapt_store_register (int regno) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE /* printf("adapt_store_register() called.\n"); fflush(stdout); /* */ */ |
| /* OBSOLETE if (regno == -1) */ |
| /* OBSOLETE adapt_store_registers (); */ |
| /* OBSOLETE else */ |
| /* OBSOLETE { */ |
| /* OBSOLETE char *name = get_reg_name (regno); */ |
| /* OBSOLETE fprintf (adapt_stream, "s %s,%x\r", name, read_register (regno)); */ |
| /* OBSOLETE /* Setting GR1 changes the numbers of all the locals, so */ |
| /* OBSOLETE invalidate the register cache. Do this *after* calling */ |
| /* OBSOLETE read_register, because we want read_register to return the */ |
| /* OBSOLETE value that write_register has just stuffed into the registers */ |
| /* OBSOLETE array, not the value of the register fetched from the */ |
| /* OBSOLETE inferior. */ */ |
| /* OBSOLETE if (regno == GR1_REGNUM) */ |
| /* OBSOLETE registers_changed (); */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Get ready to modify the registers array. On machines which store */ |
| /* OBSOLETE individual registers, this doesn't need to do anything. On machines */ |
| /* OBSOLETE which store all the registers in one fell swoop, this makes sure */ |
| /* OBSOLETE that registers contains all the registers from the program being */ |
| /* OBSOLETE debugged. */ */ |
| /* OBSOLETE */ |
| /* OBSOLETE void */ |
| /* OBSOLETE adapt_prepare_to_store (void) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE /* Do nothing, since we can store individual regs */ */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE static CORE_ADDR */ |
| /* OBSOLETE translate_addr (CORE_ADDR addr) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE #if defined(KERNEL_DEBUGGING) */ |
| /* OBSOLETE /* Check for a virtual address in the kernel */ */ |
| /* OBSOLETE /* Assume physical address of ublock is in paddr_u register */ */ |
| /* OBSOLETE if (addr >= UVADDR) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE /* PADDR_U register holds the physical address of the ublock */ */ |
| /* OBSOLETE CORE_ADDR i = (CORE_ADDR) read_register (PADDR_U_REGNUM); */ |
| /* OBSOLETE return (i + addr - (CORE_ADDR) UVADDR); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE else */ |
| /* OBSOLETE { */ |
| /* OBSOLETE return (addr); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE #else */ |
| /* OBSOLETE return (addr); */ |
| /* OBSOLETE #endif */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* FIXME! Merge these two. */ */ |
| /* OBSOLETE int */ |
| /* OBSOLETE adapt_xfer_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len, int write, */ |
| /* OBSOLETE struct mem_attrib *attrib ATTRIBUTE_UNUSED, */ |
| /* OBSOLETE struct target_ops *target ATTRIBUTE_UNUSED) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE */ |
| /* OBSOLETE memaddr = translate_addr (memaddr); */ |
| /* OBSOLETE */ |
| /* OBSOLETE if (write) */ |
| /* OBSOLETE return adapt_write_inferior_memory (memaddr, myaddr, len); */ |
| /* OBSOLETE else */ |
| /* OBSOLETE return adapt_read_inferior_memory (memaddr, myaddr, len); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE void */ |
| /* OBSOLETE adapt_files_info (void) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE printf_filtered ("\tAttached to %s at %d baud and running program %s\n", */ |
| /* OBSOLETE dev_name, baudrate, prog_name); */ |
| /* OBSOLETE printf_filtered ("\ton an %s processor.\n", processor_name[processor_type]); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Copy LEN bytes of data from debugger memory at MYADDR */ |
| /* OBSOLETE to inferior's memory at MEMADDR. Returns errno value. */ |
| /* OBSOLETE * sb/sh instructions don't work on unaligned addresses, when TU=1. */ |
| /* OBSOLETE */ */ |
| /* OBSOLETE int */ |
| /* OBSOLETE adapt_write_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE int i; */ |
| /* OBSOLETE unsigned int cps; */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Turn TU bit off so we can do 'sb' commands */ */ |
| /* OBSOLETE cps = read_register (CPS_REGNUM); */ |
| /* OBSOLETE if (cps & 0x00000800) */ |
| /* OBSOLETE write_register (CPS_REGNUM, cps & ~(0x00000800)); */ |
| /* OBSOLETE */ |
| /* OBSOLETE for (i = 0; i < len; i++) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE if ((i % 16) == 0) */ |
| /* OBSOLETE fprintf (adapt_stream, "sb %x,", memaddr + i); */ |
| /* OBSOLETE if ((i % 16) == 15 || i == len - 1) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE fprintf (adapt_stream, "%x\r", ((unsigned char *) myaddr)[i]); */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE else */ |
| /* OBSOLETE fprintf (adapt_stream, "%x,", ((unsigned char *) myaddr)[i]); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE /* Restore the old value of cps if the TU bit was on */ */ |
| /* OBSOLETE if (cps & 0x00000800) */ |
| /* OBSOLETE write_register (CPS_REGNUM, cps); */ |
| /* OBSOLETE return len; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Read LEN bytes from inferior memory at MEMADDR. Put the result */ |
| /* OBSOLETE at debugger address MYADDR. Returns errno value. */ */ |
| /* OBSOLETE int */ |
| /* OBSOLETE adapt_read_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE int i; */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Number of bytes read so far. */ */ |
| /* OBSOLETE int count; */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Starting address of this pass. */ */ |
| /* OBSOLETE unsigned long startaddr; */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Number of bytes to read in this pass. */ */ |
| /* OBSOLETE int len_this_pass; */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Note that this code works correctly if startaddr is just less */ |
| /* OBSOLETE than UINT_MAX (well, really CORE_ADDR_MAX if there was such a */ |
| /* OBSOLETE thing). That is, something like */ |
| /* OBSOLETE adapt_read_bytes (CORE_ADDR_MAX - 4, foo, 4) */ |
| /* OBSOLETE works--it never adds len to memaddr and gets 0. */ */ |
| /* OBSOLETE /* However, something like */ |
| /* OBSOLETE adapt_read_bytes (CORE_ADDR_MAX - 3, foo, 4) */ |
| /* OBSOLETE doesn't need to work. Detect it and give up if there's an attempt */ |
| /* OBSOLETE to do that. */ */ |
| /* OBSOLETE */ |
| /* OBSOLETE if (((memaddr - 1) + len) < memaddr) */ |
| /* OBSOLETE return EIO; */ |
| /* OBSOLETE */ |
| /* OBSOLETE startaddr = memaddr; */ |
| /* OBSOLETE count = 0; */ |
| /* OBSOLETE while (count < len) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE len_this_pass = 16; */ |
| /* OBSOLETE if ((startaddr % 16) != 0) */ |
| /* OBSOLETE len_this_pass -= startaddr % 16; */ |
| /* OBSOLETE if (len_this_pass > (len - count)) */ |
| /* OBSOLETE len_this_pass = (len - count); */ |
| /* OBSOLETE */ |
| /* OBSOLETE fprintf (adapt_stream, "db %x,%x\r", startaddr, */ |
| /* OBSOLETE (startaddr - 1) + len_this_pass); */ |
| /* OBSOLETE */ |
| /* OBSOLETE #ifdef NOTDEF /* Why do this */ */ |
| /* OBSOLETE expect ("\n"); */ |
| /* OBSOLETE /* Look for 8 hex digits. */ */ |
| /* OBSOLETE i = 0; */ |
| /* OBSOLETE while (1) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE if (isxdigit (readchar ())) */ |
| /* OBSOLETE ++i; */ |
| /* OBSOLETE else */ |
| /* OBSOLETE { */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE error ("Hex digit expected from remote system."); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE if (i >= 8) */ |
| /* OBSOLETE break; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE #endif /* NOTDEF */ */ |
| /* OBSOLETE */ |
| /* OBSOLETE expect (" "); */ |
| /* OBSOLETE */ |
| /* OBSOLETE for (i = 0; i < len_this_pass; i++) */ |
| /* OBSOLETE get_hex_byte (&myaddr[count++]); */ |
| /* OBSOLETE */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE */ |
| /* OBSOLETE startaddr += len_this_pass; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE return count; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE #define MAX_BREAKS 8 */ |
| /* OBSOLETE static int num_brkpts = 0; */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Insert a breakpoint at ADDR. SAVE is normally the address of the */ |
| /* OBSOLETE pattern buffer where the instruction that the breakpoint overwrites */ |
| /* OBSOLETE is saved. It is unused here since the Adapt Monitor is responsible */ |
| /* OBSOLETE for saving/restoring the original instruction. */ */ |
| /* OBSOLETE */ |
| /* OBSOLETE static int */ |
| /* OBSOLETE adapt_insert_breakpoint (CORE_ADDR addr, char *save) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE if (num_brkpts < MAX_BREAKS) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE num_brkpts++; */ |
| /* OBSOLETE fprintf (adapt_stream, "B %x", addr); */ |
| /* OBSOLETE fprintf (adapt_stream, "\r"); */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE return (0); /* Success */ */ |
| /* OBSOLETE } */ |
| /* OBSOLETE else */ |
| /* OBSOLETE { */ |
| /* OBSOLETE fprintf_filtered (gdb_stderr, */ |
| /* OBSOLETE "Too many break points, break point not installed\n"); */ |
| /* OBSOLETE return (1); /* Failure */ */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Remove a breakpoint at ADDR. SAVE is normally the previously */ |
| /* OBSOLETE saved pattern, but is unused here as the Adapt Monitor is */ |
| /* OBSOLETE responsible for saving/restoring instructions. */ */ |
| /* OBSOLETE */ |
| /* OBSOLETE static int */ |
| /* OBSOLETE adapt_remove_breakpoint (CORE_ADDR addr, char *save) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE if (num_brkpts > 0) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE num_brkpts--; */ |
| /* OBSOLETE fprintf (adapt_stream, "BR %x", addr); */ |
| /* OBSOLETE fprintf (adapt_stream, "\r"); */ |
| /* OBSOLETE fflush (adapt_stream); */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE return (0); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Clear the adapts notion of what the break points are */ */ |
| /* OBSOLETE static int */ |
| /* OBSOLETE adapt_clear_breakpoints (void) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE if (adapt_stream) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE fprintf (adapt_stream, "BR"); /* Clear all break points */ */ |
| /* OBSOLETE fprintf (adapt_stream, "\r"); */ |
| /* OBSOLETE fflush (adapt_stream); */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE num_brkpts = 0; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE static void */ |
| /* OBSOLETE adapt_mourn (void) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE adapt_clear_breakpoints (); */ |
| /* OBSOLETE pop_target (); /* Pop back to no-child state */ */ |
| /* OBSOLETE generic_mourn_inferior (); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Display everthing we read in from the adapt until we match/see the */ |
| /* OBSOLETE * specified string */ |
| /* OBSOLETE */ */ |
| /* OBSOLETE static int */ |
| /* OBSOLETE display_until (char *str) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE int i = 0, j, c; */ |
| /* OBSOLETE */ |
| /* OBSOLETE while (c = readchar ()) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE if (c == str[i]) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE i++; */ |
| /* OBSOLETE if (i == strlen (str)) */ |
| /* OBSOLETE return; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE else */ |
| /* OBSOLETE { */ |
| /* OBSOLETE if (i) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE for (j = 0; j < i; j++) /* Put everthing we matched */ */ |
| /* OBSOLETE putchar (str[j]); */ |
| /* OBSOLETE i = 0; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE putchar (c); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Put a command string, in args, out to the adapt. The adapt is assumed to */ |
| /* OBSOLETE be in raw mode, all writing/reading done through adapt_desc. */ |
| /* OBSOLETE Ouput from the adapt is placed on the users terminal until the */ |
| /* OBSOLETE prompt from the adapt is seen. */ |
| /* OBSOLETE FIXME: Can't handle commands that take input. */ */ |
| /* OBSOLETE */ |
| /* OBSOLETE void */ |
| /* OBSOLETE adapt_com (char *args, int fromtty) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE if (!adapt_stream) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE printf_filtered ("Adapt not open. Use the 'target' command to open.\n"); */ |
| /* OBSOLETE return; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Clear all input so only command relative output is displayed */ */ |
| /* OBSOLETE slurp_input (); */ |
| /* OBSOLETE */ |
| /* OBSOLETE switch (islower (args[0]) ? toupper (args[0]) : args[0]) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE default: */ |
| /* OBSOLETE printf_filtered ("Unknown/Unimplemented adapt command '%s'\n", args); */ |
| /* OBSOLETE break; */ |
| /* OBSOLETE case 'G': /* Go, begin execution */ */ |
| /* OBSOLETE write (adapt_desc, args, strlen (args)); */ |
| /* OBSOLETE write (adapt_desc, "\r", 1); */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE break; */ |
| /* OBSOLETE case 'B': /* Break points, B or BR */ */ |
| /* OBSOLETE case 'C': /* Check current 29k status (running/halted) */ */ |
| /* OBSOLETE case 'D': /* Display data/registers */ */ |
| /* OBSOLETE case 'I': /* Input from i/o space */ */ |
| /* OBSOLETE case 'J': /* Jam an instruction */ */ |
| /* OBSOLETE case 'K': /* Kill, stop execution */ */ |
| /* OBSOLETE case 'L': /* Disassemble */ */ |
| /* OBSOLETE case 'O': /* Output to i/o space */ */ |
| /* OBSOLETE case 'T': /* Trace */ */ |
| /* OBSOLETE case 'P': /* Pulse an input line */ */ |
| /* OBSOLETE case 'X': /* Examine special purpose registers */ */ |
| /* OBSOLETE case 'Z': /* Display trace buffer */ */ |
| /* OBSOLETE write (adapt_desc, args, strlen (args)); */ |
| /* OBSOLETE write (adapt_desc, "\r", 1); */ |
| /* OBSOLETE expect (args); /* Don't display the command */ */ |
| /* OBSOLETE display_until ("# "); */ |
| /* OBSOLETE break; */ |
| /* OBSOLETE /* Begin commands that take input in the form 'c x,y[,z...]' */ */ |
| /* OBSOLETE case 'S': /* Set memory or register */ */ |
| /* OBSOLETE if (strchr (args, ',')) */ |
| /* OBSOLETE { /* Assume it is properly formatted */ */ |
| /* OBSOLETE write (adapt_desc, args, strlen (args)); */ |
| /* OBSOLETE write (adapt_desc, "\r", 1); */ |
| /* OBSOLETE expect_prompt (); */ |
| /* OBSOLETE } */ |
| /* OBSOLETE break; */ |
| /* OBSOLETE } */ |
| /* OBSOLETE } */ |
| /* OBSOLETE */ |
| /* OBSOLETE /* Define the target subroutine names */ */ |
| /* OBSOLETE */ |
| /* OBSOLETE struct target_ops adapt_ops; */ |
| /* OBSOLETE */ |
| /* OBSOLETE static void */ |
| /* OBSOLETE init_adapt_ops (void) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE adapt_ops.to_shortname = "adapt"; */ |
| /* OBSOLETE adapt_ops.to_longname = "Remote AMD `Adapt' target"; */ |
| /* OBSOLETE adapt_ops.to_doc = "Remote debug an AMD 290*0 using an `Adapt' monitor via RS232"; */ |
| /* OBSOLETE adapt_ops.to_open = adapt_open; */ |
| /* OBSOLETE adapt_ops.to_close = adapt_close; */ |
| /* OBSOLETE adapt_ops.to_attach = adapt_attach; */ |
| /* OBSOLETE adapt_ops.to_post_attach = NULL; */ |
| /* OBSOLETE adapt_ops.to_require_attach = NULL; */ |
| /* OBSOLETE adapt_ops.to_detach = adapt_detach; */ |
| /* OBSOLETE adapt_ops.to_require_detach = NULL; */ |
| /* OBSOLETE adapt_ops.to_resume = adapt_resume; */ |
| /* OBSOLETE adapt_ops.to_wait = adapt_wait; */ |
| /* OBSOLETE adapt_ops.to_post_wait = NULL; */ |
| /* OBSOLETE adapt_ops.to_fetch_registers = adapt_fetch_register; */ |
| /* OBSOLETE adapt_ops.to_store_registers = adapt_store_register; */ |
| /* OBSOLETE adapt_ops.to_prepare_to_store = adapt_prepare_to_store; */ |
| /* OBSOLETE adapt_ops.to_xfer_memory = adapt_xfer_inferior_memory; */ |
| /* OBSOLETE adapt_ops.to_files_info = adapt_files_info; */ |
| /* OBSOLETE adapt_ops.to_insert_breakpoint = adapt_insert_breakpoint; */ |
| /* OBSOLETE adapt_ops.to_remove_breakpoint = adapt_remove_breakpoint; */ |
| /* OBSOLETE adapt_ops.to_terminal_init = 0; */ |
| /* OBSOLETE adapt_ops.to_terminal_inferior = 0; */ |
| /* OBSOLETE adapt_ops.to_terminal_ours_for_output = 0; */ |
| /* OBSOLETE adapt_ops.to_terminal_ours = 0; */ |
| /* OBSOLETE adapt_ops.to_terminal_info = 0; */ |
| /* OBSOLETE adapt_ops.to_kill = adapt_kill; */ |
| /* OBSOLETE adapt_ops.to_load = adapt_load; */ |
| /* OBSOLETE adapt_ops.to_lookup_symbol = 0; */ |
| /* OBSOLETE adapt_ops.to_create_inferior = adapt_create_inferior; */ |
| /* OBSOLETE adapt_ops.to_post_startup_inferior = NULL; */ |
| /* OBSOLETE adapt_ops.to_acknowledge_created_inferior = NULL; */ |
| /* OBSOLETE adapt_ops.to_clone_and_follow_inferior = NULL; */ |
| /* OBSOLETE adapt_ops.to_post_follow_inferior_by_clone = NULL; */ |
| /* OBSOLETE adapt_ops.to_insert_fork_catchpoint = NULL; */ |
| /* OBSOLETE adapt_ops.to_remove_fork_catchpoint = NULL; */ |
| /* OBSOLETE adapt_ops.to_insert_vfork_catchpoint = NULL; */ |
| /* OBSOLETE adapt_ops.to_remove_vfork_catchpoint = NULL; */ |
| /* OBSOLETE adapt_ops.to_has_forked = NULL; */ |
| /* OBSOLETE adapt_ops.to_has_vforked = NULL; */ |
| /* OBSOLETE adapt_ops.to_can_follow_vfork_prior_to_exec = NULL; */ |
| /* OBSOLETE adapt_ops.to_post_follow_vfork = NULL; */ |
| /* OBSOLETE adapt_ops.to_insert_exec_catchpoint = NULL; */ |
| /* OBSOLETE adapt_ops.to_remove_exec_catchpoint = NULL; */ |
| /* OBSOLETE adapt_ops.to_has_execd = NULL; */ |
| /* OBSOLETE adapt_ops.to_reported_exec_events_per_exec_call = NULL; */ |
| /* OBSOLETE adapt_ops.to_has_exited = NULL; */ |
| /* OBSOLETE adapt_ops.to_mourn_inferior = adapt_mourn; */ |
| /* OBSOLETE adapt_ops.to_can_run = 0; */ |
| /* OBSOLETE adapt_ops.to_notice_signals = 0; */ |
| /* OBSOLETE adapt_ops.to_thread_alive = 0; */ |
| /* OBSOLETE adapt_ops.to_stop = 0; /* process_stratum; */ */ |
| /* OBSOLETE adapt_ops.to_pid_to_exec_file = NULL; */ |
| /* OBSOLETE adapt_ops.to_stratum = 0; */ |
| /* OBSOLETE adapt_ops.DONT_USE = 0; */ |
| /* OBSOLETE adapt_ops.to_has_all_memory = 1; */ |
| /* OBSOLETE adapt_ops.to_has_memory = 1; */ |
| /* OBSOLETE adapt_ops.to_has_stack = 1; */ |
| /* OBSOLETE adapt_ops.to_has_registers = 1; */ |
| /* OBSOLETE adapt_ops.to_has_execution = 0; */ |
| /* OBSOLETE adapt_ops.to_sections = 0; */ |
| /* OBSOLETE adapt_ops.to_sections_end = 0; */ |
| /* OBSOLETE adapt_ops.to_magic = OPS_MAGIC; */ |
| /* OBSOLETE } /* init_adapt_ops */ */ |
| /* OBSOLETE */ |
| /* OBSOLETE void */ |
| /* OBSOLETE _initialize_remote_adapt (void) */ |
| /* OBSOLETE { */ |
| /* OBSOLETE init_adapt_ops (); */ |
| /* OBSOLETE add_target (&adapt_ops); */ |
| /* OBSOLETE add_com ("adapt <command>", class_obscure, adapt_com, */ |
| /* OBSOLETE "Send a command to the AMD Adapt remote monitor."); */ |
| /* OBSOLETE } */ |