1 /* Remote debugging interface for MONITOR boot monitor, for GDB.
2 Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
3 Contributed by Cygnus Support. Written by Rob Savoye for Cygnus.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
21 /* This file was derived from remote-eb.c, which did a similar job, but for
22 an AMD-29K running EBMON. That file was in turn derived from remote.c
23 as mentioned in the following comment (left in for comic relief):
25 "This is like remote.c but is for an esoteric situation--
26 having an a29k board in a PC hooked up to a unix machine with
27 a serial line, and running ctty com1 on the PC, through which
28 the unix machine can run ebmon. Not to mention that the PC
29 has PC/NFS, so it can access the same executables that gdb can,
30 over the net in real time."
32 In reality, this module talks to a debug monitor called 'MONITOR', which
33 We communicate with MONITOR via either a direct serial line, or a TCP
34 (or possibly TELNET) stream to a terminal multiplexor,
35 which in turn talks to the target board.
37 This is based on remote-st2000.c. I left in the above note here for histerical
48 #include <sys/types.h>
52 #include "remote-utils.h"
55 # define TERMINAL struct termios
57 # define TERMINAL struct sgttyb
60 struct monitor_ops *current_monitor;
61 extern struct target_ops rom68k_ops; /* Forward declaration */
62 extern struct target_ops mon68_ops; /* Forward declaration */
63 extern struct target_ops monitor_bug_ops; /* Forward declaration */
64 extern struct monitor_ops rom68k_cmds; /* Forward declaration */
65 extern struct monitor_ops mon68_cmds; /* Forward declaration */
66 extern struct monitor_ops bug_cmds; /* Forward declaration */
67 extern struct cmd_list_element *setlist;
68 extern struct cmd_list_element *unsetlist;
69 struct cmd_list_element *showlist;
71 static void monitor_close();
72 static void monitor_fetch_register();
73 static void monitor_store_register();
74 static int kiodebug; /* flag set by "set remotedebug" */
75 static int hashmark; /* flag set by "set hash" */
77 #define LOG_FILE "monitor.log"
78 #if defined (LOG_FILE)
82 static int timeout = 24;
84 /* Descriptor for I/O to remote machine. Initialize it to NULL so that
85 monitor_open knows that we don't have a file open when the program starts.
87 static serial_t monitor_desc = NULL;
89 /* Send data to monitor. Works just like printf. */
92 printf_monitor(va_alist)
102 pattern = va_arg(args, char *);
104 vsprintf(buf, pattern, args);
106 if (SERIAL_WRITE(monitor_desc, buf, strlen(buf)))
107 fprintf(stderr, "SERIAL_WRITE failed: %s\n", safe_strerror(errno));
110 /* Read a character from the remote system, doing all the fancy
118 c = SERIAL_READCHAR(monitor_desc, timeout);
125 putc(c & 0x7f, log_file);
131 if (c == SERIAL_TIMEOUT)
134 return c; /* Polls shouldn't generate timeout errors */
136 error("Timeout reading from remote system.");
139 perror_with_name("remote-monitor");
142 /* Scan input from the remote system, until STRING is found. If DISCARD is
143 non-zero, then discard non-matching input, else print it out.
144 Let the user break out immediately. */
146 expect(string, discard)
154 printf ("Expecting \"%s\"\n", string);
159 c = readchar(timeout);
168 printf ("\nMatched\n");
176 fwrite(string, 1, (p - 1) - string, stdout);
185 /* Keep discarding input until we see the MONITOR prompt.
187 The convention for dealing with the prompt is that you
189 o *then* wait for the prompt.
191 Thus the last thing that a procedure does with the serial line
192 will be an expect_prompt(). Exception: monitor_resume does not
193 wait for the prompt, because the terminal is being handed over
194 to the inferior. However, the next thing which happens after that
195 is a monitor_wait which does wait for the prompt.
196 Note that this includes abnormal exit, e.g. error(). This is
197 necessary to prevent getting into states from which we can't
200 expect_prompt(discard)
203 #if defined (LOG_FILE)
204 /* This is a convenient place to do this. The idea is to do it often
205 enough that we never lose much data if we terminate abnormally. */
208 expect (PROMPT, discard);
211 /* Get a hex digit from the remote system & return its value.
212 If ignore_space is nonzero, ignore spaces (not newline, tab, etc). */
214 get_hex_digit(ignore_space)
220 ch = readchar(timeout);
221 if (ch >= '0' && ch <= '9')
223 else if (ch >= 'A' && ch <= 'F')
224 return ch - 'A' + 10;
225 else if (ch >= 'a' && ch <= 'f')
226 return ch - 'a' + 10;
227 else if (ch == ' ' && ignore_space)
232 error("Invalid hex digit from remote system.");
237 /* Get a byte from monitor and put it in *BYT. Accept any number
245 val = get_hex_digit (1) << 4;
246 val |= get_hex_digit (0);
250 /* Get N 32-bit words from remote, each preceded by a space,
251 and put them in registers starting at REGNO. */
253 get_hex_regs (n, regno)
260 for (i = 0; i < n; i++)
265 for (j = 0; j < 8; j++)
266 val = (val << 4) + get_hex_digit (j == 0);
267 supply_register (regno++, (char *) &val);
271 /* This is called not only when we first attach, but also when the
272 user types "run" after having attached. */
274 monitor_create_inferior (execfile, args, env)
282 error("Can't pass arguments to remote MONITOR process");
284 if (execfile == 0 || exec_bfd == 0)
285 error("No exec file specified");
287 entry_pt = (int) bfd_get_start_address (exec_bfd);
289 #ifdef CREATE_INFERIOR_HOOK
290 CREATE_INFERIOR_HOOK (0); /* No process-ID */
293 fputs ("\nIn Create_inferior()", log_file);
296 /* The "process" (board) is already stopped awaiting our commands, and
297 the program is already downloaded. We just set its PC and go. */
299 clear_proceed_status ();
301 /* Tell wait_for_inferior that we've started a new process. */
302 init_wait_for_inferior ();
304 /* Set up the "saved terminal modes" of the inferior
305 based on what modes we are starting it with. */
306 target_terminal_init ();
308 /* Install inferior's terminal modes. */
309 target_terminal_inferior ();
311 /* insert_step_breakpoint (); FIXME, do we need this? */
312 proceed ((CORE_ADDR)entry_pt, -1, 0); /* Let 'er rip... */
315 /* Open a connection to a remote debugger.
316 NAME is the filename used for communication. */
318 static int baudrate = 9600;
319 static char dev_name[100];
322 general_open(args, name, from_tty)
328 error ("Use `target %s DEVICE-NAME' to use a serial port, or \n\
329 `target %s HOST-NAME:PORT-NUMBER' to use a network connection.", name, name);
331 target_preopen(from_tty);
335 monitor_desc = SERIAL_OPEN(dev_name);
337 if (monitor_desc == NULL)
338 perror_with_name(dev_name);
340 /* The baud rate was specified when GDB was started. */
341 if (SERIAL_SETBAUDRATE (monitor_desc, sr_get_baud_rate()))
343 SERIAL_CLOSE (monitor_desc);
344 perror_with_name (name);
347 SERIAL_RAW(monitor_desc);
349 #if defined (LOG_FILE)
350 log_file = fopen (LOG_FILE, "w");
351 if (log_file == NULL)
352 perror_with_name (LOG_FILE);
355 /* Hello? Are you there? */
356 printf_monitor("\r"); /* CR wakes up monitor */
361 printf("Remote %s connected to %s\n", target_shortname,
366 rom68k_open(args, from_tty)
370 push_target(&rom68k_ops);
371 push_monitor (&rom68k_cmds);
373 general_open (args, "rom68k", from_tty);
377 mon68_open(args, from_tty)
381 push_target(&mon68_ops);
382 push_monitor (&mon68_cmds);
384 general_open (args, "mon68", from_tty);
388 bug_open(args, from_tty)
392 push_target(&monitor_bug_ops);
393 push_monitor (&bug_cmds);
395 general_open (args, "bug", from_tty);
399 * _close -- Close out all files and local state before this target loses control.
403 monitor_close (quitting)
406 SERIAL_CLOSE(monitor_desc);
409 #if defined (LOG_FILE)
411 if (ferror(log_file))
412 fprintf(stderr, "Error writing log file.\n");
413 if (fclose(log_file) != 0)
414 fprintf(stderr, "Error closing log file.\n");
419 /* Terminate the open connection to the remote debugger.
420 Use this when you want to detach and do something else
423 monitor_detach (from_tty)
426 pop_target(); /* calls monitor_close to do the real work */
428 printf ("Ending remote %s debugging\n", target_shortname);
432 * _resume -- Tell the remote machine to resume.
435 monitor_resume (pid, step, sig)
439 fprintf (log_file, "\nIn Resume (step=%d, sig=%d)\n", step, sig);
444 printf_monitor (STEP_CMD);
445 /* wait for the echo. */
446 expect (STEP_CMD, 1);
450 printf_monitor (GO_CMD);
451 /* swallow the echo. */
457 * _wait -- Wait until the remote machine stops, then return,
458 * storing status in status just as `wait' would.
462 monitor_wait (status)
465 int old_timeout = timeout;
467 fputs ("\nIn wait ()", log_file);
470 WSETEXIT ((*status), 0);
472 timeout = 0; /* Don't time out -- user program is running. */
474 expect_prompt(0); /* Wait for prompt, outputting extraneous text */
476 WSETSTOP ((*status), SIGTRAP);
478 timeout = old_timeout;
483 /* Return the name of register number regno in the form input and output by
484 monitor. Currently, register_names just happens to contain exactly what
485 monitor wants. Lets take advantage of that just as long as possible! */
499 for (p = reg_names[regno]; *p; p++)
506 /* read the remote registers into the block regs. */
509 monitor_fetch_registers ()
513 /* yeah yeah, i know this is horribly inefficient. but it isn't done
514 very often... i'll clean it up later. */
516 for (regno = 0; regno <= PC_REGNUM; regno++)
517 monitor_fetch_register(regno);
520 /* Fetch register REGNO, or all registers if REGNO is -1.
521 Returns errno value. */
523 monitor_fetch_register (regno)
529 fprintf (log_file, "\nIn Fetch Register (reg=%s)\n", get_reg_name (regno));
535 monitor_fetch_registers ();
539 char *name = get_reg_name (regno);
540 printf_monitor (GET_REG, name);
542 expect (REG_DELIM, 1);
543 if (strcasecmp (name, "SR") == 0)
546 for (j = 0; j < 4; j++)
547 val = (val << 4) + get_hex_digit (j == 0);
548 supply_register (regno, (char *) &val);
552 get_hex_regs (1, regno);
557 printf_monitor (CMD_END);
564 /* Store the remote registers from the contents of the block REGS. */
567 monitor_store_registers ()
571 for (regno = 0; regno <= PC_REGNUM; regno++)
572 monitor_store_register(regno);
574 registers_changed ();
577 /* Store register REGNO, or all if REGNO == 0.
578 return errno value. */
580 monitor_store_register (regno)
584 fprintf (log_file, "\nIn Store_register (regno=%d)\n", regno);
587 monitor_store_registers ();
591 printf ("Setting register %s to 0x%x\n", get_reg_name (regno), read_register (regno));
593 printf_monitor (SET_REG, get_reg_name (regno),
594 read_register (regno));
600 /* Get ready to modify the registers array. On machines which store
601 individual registers, this doesn't need to do anything. On machines
602 which store all the registers in one fell swoop, this makes sure
603 that registers contains all the registers from the program being
607 monitor_prepare_to_store ()
609 /* Do nothing, since we can store individual regs */
613 monitor_files_info ()
615 printf ("\tAttached to %s at %d baud.\n",
619 /* Copy LEN bytes of data from debugger memory at MYADDR
620 to inferior's memory at MEMADDR. Returns length moved. */
622 monitor_write_inferior_memory (memaddr, myaddr, len)
624 unsigned char *myaddr;
631 fprintf (log_file, "\nIn Write_inferior_memory (memaddr=%x, len=%d)\n", memaddr, len);
633 for (i = 0; i < len; i++)
635 printf_monitor (MEM_SET_CMD, memaddr + i);
636 expect (sprintf (buf, MEM_PROMPT, memaddr + i), 1);
638 printf_monitor ("%x", myaddr[i]);
640 printf ("\nSet 0x%x to 0x%x\n", memaddr + i, myaddr[i]);
643 /*** expect (sprintf (buf, MEM_PROMPT, memaddr + i +1), 1);
644 expect (CMD_DELIM); ***/
645 printf_monitor (CMD_END);
652 /* Read LEN bytes from inferior memory at MEMADDR. Put the result
653 at debugger address MYADDR. Returns length moved. */
655 monitor_read_inferior_memory(memaddr, myaddr, len)
663 /* Number of bytes read so far. */
666 /* Starting address of this pass. */
667 unsigned long startaddr;
669 /* Number of bytes to read in this pass. */
673 fprintf (log_file, "\nIn Read_inferior_memory (memaddr=%x, len=%d)\n", memaddr, len);
676 /* Note that this code works correctly if startaddr is just less
677 than UINT_MAX (well, really CORE_ADDR_MAX if there was such a
678 thing). That is, something like
679 monitor_read_bytes (CORE_ADDR_MAX - 4, foo, 4)
680 works--it never adds len To memaddr and gets 0. */
681 /* However, something like
682 monitor_read_bytes (CORE_ADDR_MAX - 3, foo, 4)
683 doesn't need to work. Detect it and give up if there's an attempt
685 if (((memaddr - 1) + len) < memaddr) {
695 if ((startaddr % 16) != 0)
696 len_this_pass -= startaddr % 16;
697 if (len_this_pass > (len - count))
698 len_this_pass = (len - count);
700 printf ("\nDisplay %d bytes at %x\n", len_this_pass, startaddr);
702 for (i = 0; i < len_this_pass; i++)
704 printf_monitor (MEM_DIS_CMD, startaddr);
705 expect (sprintf(buf, MEM_PROMPT, startaddr), 1);
706 get_hex_byte (&myaddr[count++]);
708 printf ("\nRead a 0x%x from 0x%x\n", myaddr[count-1], startaddr);
712 printf_monitor (CMD_END);
721 /* FIXME-someday! merge these two. */
723 monitor_xfer_inferior_memory (memaddr, myaddr, len, write, target)
728 struct target_ops *target; /* ignored */
731 return monitor_write_inferior_memory (memaddr, myaddr, len);
733 return monitor_read_inferior_memory (memaddr, myaddr, len);
737 monitor_kill (args, from_tty)
741 return; /* ignore attempts to kill target system */
744 /* Clean up when a program exits.
745 The program actually lives on in the remote processor's RAM, and may be
746 run again without a download. Don't leave it full of breakpoint
750 monitor_mourn_inferior ()
752 remove_breakpoints ();
753 generic_mourn_inferior (); /* Do all the proper things now */
756 #define MAX_MONITOR_BREAKPOINTS 16
758 extern int memory_breakpoint_size;
759 static CORE_ADDR breakaddr[MAX_MONITOR_BREAKPOINTS] = {0};
762 monitor_insert_breakpoint (addr, shadow)
769 fprintf (log_file, "\nIn Insert_breakpoint (addr=%x)\n", addr);
771 for (i = 0; i <= MAX_MONITOR_BREAKPOINTS; i++)
772 if (breakaddr[i] == 0)
776 printf ("Breakpoint at %x\n", addr);
777 monitor_read_inferior_memory(addr, shadow, memory_breakpoint_size);
778 printf_monitor(SET_BREAK_CMD, addr);
783 fprintf(stderr, "Too many breakpoints (> 16) for monitor\n");
788 * _remove_breakpoint -- Tell the monitor to remove a breakpoint
791 monitor_remove_breakpoint (addr, shadow)
798 fprintf (log_file, "\nIn Remove_breakpoint (addr=%x)\n", addr);
800 for (i = 0; i < MAX_MONITOR_BREAKPOINTS; i++)
801 if (breakaddr[i] == addr)
804 /* some monitors remove breakpoints based on the address */
805 if (strcasecmp (target_shortname, "bug") == 0)
806 printf_monitor(CLR_BREAK_CMD, addr);
808 printf_monitor(CLR_BREAK_CMD, i);
813 fprintf(stderr, "Can't find breakpoint associated with 0x%x\n", addr);
817 /* Load a file. This is usually an srecord, which is ascii. No
818 protocol, just sent line by line. */
820 #define DOWNLOAD_LINE_SIZE 100
826 char buf[DOWNLOAD_LINE_SIZE];
830 printf ("Loading %s to monitor\n", arg);
832 download = fopen (arg, "r");
833 if (download == NULL)
835 error (sprintf (buf, "%s Does not exist", arg));
839 printf_monitor (LOAD_CMD);
840 /* expect ("Waiting for S-records from host... ", 1); */
842 while (!feof (download))
844 bytes_read = fread (buf, sizeof (char), DOWNLOAD_LINE_SIZE, download);
851 if (SERIAL_WRITE(monitor_desc, buf, bytes_read)) {
852 fprintf(stderr, "SERIAL_WRITE failed: (while downloading) %s\n", safe_strerror(errno));
856 while (i++ <=200000) {} ; /* Ugly HACK, probably needs flow control */
857 if (bytes_read < DOWNLOAD_LINE_SIZE)
859 if (!feof (download))
860 error ("Only read %d bytes\n", bytes_read);
869 if (!feof (download))
870 error ("Never got EOF while downloading");
874 /* Put a command string, in args, out to MONITOR. Output from MONITOR is placed
875 on the users terminal until the prompt is seen. */
878 monitor_command (args, fromtty)
883 fprintf (log_file, "\nIn command (args=%s)\n", args);
885 if (monitor_desc == NULL)
886 error("monitor target not open.");
889 error("Missing command.");
891 printf_monitor("%s\r", args);
897 /* Connect the user directly to MONITOR. This command acts just like the
898 'cu' or 'tip' command. Use <CR>~. or <CR>~^D to break out. */
900 static struct ttystate ttystate;
904 { printf("\r\n[Exiting connect mode]\r\n");
905 /*SERIAL_RESTORE(0, &ttystate);*/
909 connect_command (args, fromtty)
920 if (monitor_desc == NULL)
921 error("monitor target not open.");
924 fprintf("This command takes no args. They have been ignored.\n");
926 printf("[Entering connect mode. Use ~. or ~^D to escape]\n");
928 serial_raw(0, &ttystate);
930 make_cleanup(cleanup_tty, 0);
939 FD_SET(monitor_desc, &readfds);
940 numfds = select(sizeof(readfds)*8, &readfds, 0, 0, 0);
945 perror_with_name("select");
947 if (FD_ISSET(0, &readfds))
948 { /* tty input, send to monitor */
951 perror_with_name("connect");
953 printf_monitor("%c", c);
967 if (c == '.' || c == '\004')
974 if (FD_ISSET(monitor_desc, &readfds))
990 * Define the monitor command strings. Since these are passed directly
991 * through to a printf style function, we need can include formatting
992 * strings. We also need a CR or LF on the end.
994 struct monitor_ops rom68k_cmds = {
995 "go \r", /* execute or usually GO command */
996 "go \r", /* continue command */
997 "st \r", /* single step */
998 "db %x\r", /* set a breakpoint */
999 "cb %x\r", /* clear a breakpoint */
1000 "pm %x\r", /* set memory to a value */
1001 "pm %x\r", /* display memory */
1002 "-%08X ", /* prompt memory commands use */
1003 "pr %s %x\r", /* set a register */
1004 ": ", /* delimiter between registers */
1005 "pr %s\r", /* read a register */
1006 "dc \r", /* download command */
1007 "ROM68K :->", /* monitor command prompt */
1008 "=", /* end-of-command delimitor */
1009 ".\r" /* optional command terminator */
1012 struct monitor_ops bug_cmds = {
1013 "go \r", /* execute or usually GO command */
1014 "go \r", /* continue command */
1015 "gn \r", /* single step */
1016 "br %x\r", /* set a breakpoint */
1017 "nobr %x\r", /* clear a breakpoint */
1018 "mm %x\r", /* set memory to a value */
1019 "mm %x\r", /* display memory */
1020 "%08X", /* prompt memory commands use */
1021 "rs %s %x\r", /* set a register */
1022 "=", /* delimiter between registers */
1023 "rm %s\r", /* read a register */
1024 "lo 0\r", /* download command */
1025 "Bug>", /* monitor command prompt */
1026 "? ", /* end-of-command delimitor */
1027 ".\r" /* optional command terminator */
1030 /* Define the target subroutine names */
1031 struct monitor_ops mon68_cmds = {
1032 "", /* execute or usually GO command */
1033 "", /* continue command */
1034 "", /* single step */
1035 "", /* set a breakpoint */
1036 "", /* clear a breakpoint */
1037 "", /* set memory to a value */
1038 "", /* display memory */
1039 "", /* set a register */
1040 "", /* delimiter between registers */
1041 "", /* read a register */
1042 "", /* download command */
1043 ">", /* monitor command prompt */
1044 "", /* end-of-command delimitor */
1045 "" /* optional command terminator */
1048 struct target_ops rom68k_ops = {
1050 "Integrated System's ROM68K remote debug monitor",
1051 "Use a remote computer running the ROM68K debug monitor.\n\
1052 Specify the serial device it is connected to (e.g. /dev/ttya).",
1059 monitor_fetch_register,
1060 monitor_store_register,
1061 monitor_prepare_to_store,
1062 monitor_xfer_inferior_memory,
1064 monitor_insert_breakpoint,
1065 monitor_remove_breakpoint, /* Breakpoints */
1070 0, /* Terminal handling */
1072 monitor_load, /* load */
1073 0, /* lookup_symbol */
1074 monitor_create_inferior,
1075 monitor_mourn_inferior,
1077 0, /* notice_signals */
1084 1, /* all mem, mem, stack, regs, exec */
1086 0, /* Section pointers */
1087 OPS_MAGIC, /* Always the last thing */
1090 struct target_ops monitor_bug_ops = {
1092 "Motorola's BUG remote serial debug monitor",
1093 "Use a remote computer running Motorola's BUG debug monitor.\n\
1094 Specify the serial device it is connected to (e.g. /dev/ttya).",
1101 monitor_fetch_register,
1102 monitor_store_register,
1103 monitor_prepare_to_store,
1104 monitor_xfer_inferior_memory,
1106 monitor_insert_breakpoint,
1107 monitor_remove_breakpoint, /* Breakpoints */
1112 0, /* Terminal handling */
1114 monitor_load, /* load */
1115 0, /* lookup_symbol */
1116 monitor_create_inferior,
1117 monitor_mourn_inferior,
1119 0, /* notice_signals */
1126 1, /* all mem, mem, stack, regs, exec */
1128 0, /* Section pointers */
1129 OPS_MAGIC, /* Always the last thing */
1132 struct target_ops mon68_ops = {
1134 "Intermetric's MON68 remote serial debug monitor",
1135 "Use a remote computer running the MON68 debug monitor.\n\
1136 Specify the serial device it is connected to (e.g. /dev/ttya).",
1143 monitor_fetch_register,
1144 monitor_store_register,
1145 monitor_prepare_to_store,
1146 monitor_xfer_inferior_memory,
1148 monitor_insert_breakpoint,
1149 monitor_remove_breakpoint, /* Breakpoints */
1154 0, /* Terminal handling */
1156 monitor_load, /* load */
1157 0, /* lookup_symbol */
1158 monitor_create_inferior,
1159 monitor_mourn_inferior,
1161 0, /* notice_signals */
1168 1, /* all mem, mem, stack, regs, exec */
1170 0, /* Section pointers */
1171 OPS_MAGIC, /* Always the last thing */
1175 _initialize_remote_monitors ()
1178 add_set_cmd ("remotedebug", no_class, var_boolean,
1180 "Set debugging of I/O to a serial based Monitor.\n\
1181 When enabled, debugging info is displayed.",
1185 add_set_cmd ("hash", no_class, var_boolean,
1187 "Set display of activity while downloading a file.\n\
1188 When enabled, a period \'.\' is displayed.",
1192 /* generic monitor command */
1193 add_com ("monitor <command>", class_obscure, monitor_command,
1194 "Send a command to the debug monitor.");
1196 add_com ("connect", class_obscure, connect_command,
1197 "Connect the terminal directly up to a serial based command monitor.\n\
1198 Use <CR>~. or <CR>~^D to break out.");
1201 add_target (&rom68k_ops);
1202 /* add_target (&mon68_ops); */
1203 add_target (&monitor_bug_ops);