1 /* Remote debugging interface for boot monitors, 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();
75 static int sr_get_debug(); /* flag set by "set remotedebug" */
77 static int hashmark; /* flag set by "set hash" */
79 /* FIXME: Replace with sr_get_debug (). */
80 #define LOG_FILE "monitor.log"
81 #if defined (LOG_FILE)
85 static int timeout = 24;
87 /* Descriptor for I/O to remote machine. Initialize it to NULL so that
88 monitor_open knows that we don't have a file open when the program starts.
90 static serial_t monitor_desc = NULL;
92 /* Send data to monitor. Works just like printf. */
95 printf_monitor(va_alist)
105 pattern = va_arg(args, char *);
107 vsprintf(buf, pattern, args);
109 if (SERIAL_WRITE(monitor_desc, buf, strlen(buf)))
110 fprintf(stderr, "SERIAL_WRITE failed: %s\n", safe_strerror(errno));
113 /* Read a character from the remote system, doing all the fancy
121 c = SERIAL_READCHAR(monitor_desc, timeout);
128 putc(c & 0x7f, log_file);
134 if (c == SERIAL_TIMEOUT)
137 return c; /* Polls shouldn't generate timeout errors */
139 error("Timeout reading from remote system.");
142 perror_with_name("remote-monitor");
145 /* Scan input from the remote system, until STRING is found. If DISCARD is
146 non-zero, then discard non-matching input, else print it out.
147 Let the user break out immediately. */
149 expect(string, discard)
157 printf ("Expecting \"%s\"\n", string);
162 c = readchar(timeout);
171 printf ("\nMatched\n");
179 fwrite(string, 1, (p - 1) - string, stdout);
188 /* Keep discarding input until we see the MONITOR prompt.
190 The convention for dealing with the prompt is that you
192 o *then* wait for the prompt.
194 Thus the last thing that a procedure does with the serial line
195 will be an expect_prompt(). Exception: monitor_resume does not
196 wait for the prompt, because the terminal is being handed over
197 to the inferior. However, the next thing which happens after that
198 is a monitor_wait which does wait for the prompt.
199 Note that this includes abnormal exit, e.g. error(). This is
200 necessary to prevent getting into states from which we can't
203 expect_prompt(discard)
206 #if defined (LOG_FILE)
207 /* This is a convenient place to do this. The idea is to do it often
208 enough that we never lose much data if we terminate abnormally. */
211 expect (PROMPT, discard);
214 /* Get a hex digit from the remote system & return its value.
215 If ignore_space is nonzero, ignore spaces (not newline, tab, etc). */
217 get_hex_digit(ignore_space)
223 ch = readchar(timeout);
224 if (ch >= '0' && ch <= '9')
226 else if (ch >= 'A' && ch <= 'F')
227 return ch - 'A' + 10;
228 else if (ch >= 'a' && ch <= 'f')
229 return ch - 'a' + 10;
230 else if (ch == ' ' && ignore_space)
235 error("Invalid hex digit from remote system.");
240 /* Get a byte from monitor and put it in *BYT. Accept any number
248 val = get_hex_digit (1) << 4;
249 val |= get_hex_digit (0);
253 /* Get N 32-bit words from remote, each preceded by a space,
254 and put them in registers starting at REGNO. */
256 get_hex_regs (n, regno)
263 for (i = 0; i < n; i++)
268 for (j = 0; j < 8; j++)
269 val = (val << 4) + get_hex_digit (j == 0);
270 supply_register (regno++, (char *) &val);
274 /* This is called not only when we first attach, but also when the
275 user types "run" after having attached. */
277 monitor_create_inferior (execfile, args, env)
285 error("Can't pass arguments to remote MONITOR process");
287 if (execfile == 0 || exec_bfd == 0)
288 error("No exec file specified");
290 entry_pt = (int) bfd_get_start_address (exec_bfd);
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? */
314 proceed ((CORE_ADDR)entry_pt, TARGET_SIGNAL_DEFAULT, 0);
317 /* Open a connection to a remote debugger.
318 NAME is the filename used for communication. */
320 static int baudrate = 9600;
321 static char dev_name[100];
324 general_open(args, name, from_tty)
330 error ("Use `target %s DEVICE-NAME' to use a serial port, or \n\
331 `target %s HOST-NAME:PORT-NUMBER' to use a network connection.", name, name);
333 target_preopen(from_tty);
338 strcpy(dev_name, args);
339 monitor_desc = SERIAL_OPEN(dev_name);
341 if (monitor_desc == NULL)
342 perror_with_name(dev_name);
344 /* The baud rate was specified when GDB was started. */
345 if (SERIAL_SETBAUDRATE (monitor_desc, sr_get_baud_rate()))
347 SERIAL_CLOSE (monitor_desc);
348 perror_with_name (name);
351 SERIAL_RAW(monitor_desc);
353 #if defined (LOG_FILE)
354 log_file = fopen (LOG_FILE, "w");
355 if (log_file == NULL)
356 perror_with_name (LOG_FILE);
359 /* Hello? Are you there? */
360 printf_monitor("\r"); /* CR wakes up monitor */
365 printf("Remote %s connected to %s\n", target_shortname,
370 rom68k_open(args, from_tty)
374 push_target(&rom68k_ops);
375 push_monitor (&rom68k_cmds);
377 general_open (args, "rom68k", from_tty);
381 mon68_open(args, from_tty)
385 push_target(&mon68_ops);
386 push_monitor (&mon68_cmds);
388 general_open (args, "mon68", from_tty);
392 bug_open(args, from_tty)
396 push_target(&monitor_bug_ops);
397 push_monitor (&bug_cmds);
399 general_open (args, "bug", from_tty);
403 * _close -- Close out all files and local state before this target loses control.
407 monitor_close (quitting)
410 SERIAL_CLOSE(monitor_desc);
413 #if defined (LOG_FILE)
415 if (ferror(log_file))
416 fprintf(stderr, "Error writing log file.\n");
417 if (fclose(log_file) != 0)
418 fprintf(stderr, "Error closing log file.\n");
423 /* Terminate the open connection to the remote debugger.
424 Use this when you want to detach and do something else
427 monitor_detach (from_tty)
430 pop_target(); /* calls monitor_close to do the real work */
432 printf ("Ending remote %s debugging\n", target_shortname);
436 * _resume -- Tell the remote machine to resume.
439 monitor_resume (pid, step, sig)
441 enum target_signal sig;
444 fprintf (log_file, "\nIn Resume (step=%d, sig=%d)\n", step, sig);
449 printf_monitor (STEP_CMD);
450 /* wait for the echo. */
451 expect (STEP_CMD, 1);
455 printf_monitor (GO_CMD);
456 /* swallow the echo. */
462 * _wait -- Wait until the remote machine stops, then return,
463 * storing status in status just as `wait' would.
467 monitor_wait (pid, status)
469 struct target_waitstatus *status;
471 int old_timeout = timeout;
473 fputs ("\nIn wait ()", log_file);
476 status->kind = TARGET_WAITKIND_EXITED;
477 status->value.integer = 0;
479 timeout = 0; /* Don't time out -- user program is running. */
481 expect_prompt(0); /* Wait for prompt, outputting extraneous text */
483 status->kind = TARGET_WAITKIND_STOPPED;
484 status->value.sig = TARGET_SIGNAL_TRAP;
486 timeout = old_timeout;
491 /* Return the name of register number regno in the form input and output by
492 monitor. Currently, register_names just happens to contain exactly what
493 monitor wants. Lets take advantage of that just as long as possible! */
507 for (p = reg_names[regno]; *p; p++)
514 /* read the remote registers into the block regs. */
517 monitor_fetch_registers ()
521 /* yeah yeah, i know this is horribly inefficient. but it isn't done
522 very often... i'll clean it up later. */
524 for (regno = 0; regno <= PC_REGNUM; regno++)
525 monitor_fetch_register(regno);
528 /* Fetch register REGNO, or all registers if REGNO is -1.
529 Returns errno value. */
531 monitor_fetch_register (regno)
537 fprintf (log_file, "\nIn Fetch Register (reg=%s)\n", get_reg_name (regno));
543 monitor_fetch_registers ();
547 char *name = get_reg_name (regno);
548 printf_monitor (GET_REG, name);
550 expect (REG_DELIM, 1);
551 if (strcasecmp (name, "SR") == 0)
554 for (j = 0; j < 4; j++)
555 val = (val << 4) + get_hex_digit (j == 0);
556 supply_register (regno, (char *) &val);
560 get_hex_regs (1, regno);
565 printf_monitor (CMD_END);
572 /* Store the remote registers from the contents of the block REGS. */
575 monitor_store_registers ()
579 for (regno = 0; regno <= PC_REGNUM; regno++)
580 monitor_store_register(regno);
582 registers_changed ();
585 /* Store register REGNO, or all if REGNO == 0.
586 return errno value. */
588 monitor_store_register (regno)
592 fprintf (log_file, "\nIn Store_register (regno=%d)\n", regno);
595 monitor_store_registers ();
599 printf ("Setting register %s to 0x%x\n", get_reg_name (regno), read_register (regno));
601 printf_monitor (SET_REG, get_reg_name (regno),
602 read_register (regno));
608 /* Get ready to modify the registers array. On machines which store
609 individual registers, this doesn't need to do anything. On machines
610 which store all the registers in one fell swoop, this makes sure
611 that registers contains all the registers from the program being
615 monitor_prepare_to_store ()
617 /* Do nothing, since we can store individual regs */
621 monitor_files_info ()
623 printf ("\tAttached to %s at %d baud.\n",
627 /* Copy LEN bytes of data from debugger memory at MYADDR
628 to inferior's memory at MEMADDR. Returns length moved. */
630 monitor_write_inferior_memory (memaddr, myaddr, len)
632 unsigned char *myaddr;
639 fprintf (log_file, "\nIn Write_inferior_memory (memaddr=%x, len=%d)\n", memaddr, len);
641 for (i = 0; i < len; i++)
643 printf_monitor (MEM_SET_CMD, memaddr + i);
644 expect (sprintf (buf, MEM_PROMPT, memaddr + i), 1);
646 printf_monitor ("%x", myaddr[i]);
648 printf ("\nSet 0x%x to 0x%x\n", memaddr + i, myaddr[i]);
651 /*** expect (sprintf (buf, MEM_PROMPT, memaddr + i +1), 1);
652 expect (CMD_DELIM); ***/
653 printf_monitor (CMD_END);
660 /* Read LEN bytes from inferior memory at MEMADDR. Put the result
661 at debugger address MYADDR. Returns length moved. */
663 monitor_read_inferior_memory(memaddr, myaddr, len)
671 /* Number of bytes read so far. */
674 /* Starting address of this pass. */
675 unsigned long startaddr;
677 /* Number of bytes to read in this pass. */
681 fprintf (log_file, "\nIn Read_inferior_memory (memaddr=%x, len=%d)\n", memaddr, len);
684 /* Note that this code works correctly if startaddr is just less
685 than UINT_MAX (well, really CORE_ADDR_MAX if there was such a
686 thing). That is, something like
687 monitor_read_bytes (CORE_ADDR_MAX - 4, foo, 4)
688 works--it never adds len To memaddr and gets 0. */
689 /* However, something like
690 monitor_read_bytes (CORE_ADDR_MAX - 3, foo, 4)
691 doesn't need to work. Detect it and give up if there's an attempt
693 if (((memaddr - 1) + len) < memaddr) {
703 if ((startaddr % 16) != 0)
704 len_this_pass -= startaddr % 16;
705 if (len_this_pass > (len - count))
706 len_this_pass = (len - count);
708 printf ("\nDisplay %d bytes at %x\n", len_this_pass, startaddr);
710 for (i = 0; i < len_this_pass; i++)
712 printf_monitor (MEM_DIS_CMD, startaddr);
713 expect (sprintf(buf, MEM_PROMPT, startaddr), 1);
714 get_hex_byte (&myaddr[count++]);
716 printf ("\nRead a 0x%x from 0x%x\n", myaddr[count-1], startaddr);
720 printf_monitor (CMD_END);
729 /* FIXME-someday! merge these two. */
731 monitor_xfer_inferior_memory (memaddr, myaddr, len, write, target)
736 struct target_ops *target; /* ignored */
739 return monitor_write_inferior_memory (memaddr, myaddr, len);
741 return monitor_read_inferior_memory (memaddr, myaddr, len);
745 monitor_kill (args, from_tty)
749 return; /* ignore attempts to kill target system */
752 /* Clean up when a program exits.
753 The program actually lives on in the remote processor's RAM, and may be
754 run again without a download. Don't leave it full of breakpoint
758 monitor_mourn_inferior ()
760 remove_breakpoints ();
761 generic_mourn_inferior (); /* Do all the proper things now */
764 #define MAX_MONITOR_BREAKPOINTS 16
766 extern int memory_breakpoint_size;
767 static CORE_ADDR breakaddr[MAX_MONITOR_BREAKPOINTS] = {0};
770 monitor_insert_breakpoint (addr, shadow)
777 fprintf (log_file, "\nIn Insert_breakpoint (addr=%x)\n", addr);
779 for (i = 0; i <= MAX_MONITOR_BREAKPOINTS; i++)
780 if (breakaddr[i] == 0)
784 printf ("Breakpoint at %x\n", addr);
785 monitor_read_inferior_memory(addr, shadow, memory_breakpoint_size);
786 printf_monitor(SET_BREAK_CMD, addr);
791 fprintf(stderr, "Too many breakpoints (> 16) for monitor\n");
796 * _remove_breakpoint -- Tell the monitor to remove a breakpoint
799 monitor_remove_breakpoint (addr, shadow)
806 fprintf (log_file, "\nIn Remove_breakpoint (addr=%x)\n", addr);
808 for (i = 0; i < MAX_MONITOR_BREAKPOINTS; i++)
809 if (breakaddr[i] == addr)
812 /* some monitors remove breakpoints based on the address */
813 if (strcasecmp (target_shortname, "bug") == 0)
814 printf_monitor(CLR_BREAK_CMD, addr);
816 printf_monitor(CLR_BREAK_CMD, i);
821 fprintf(stderr, "Can't find breakpoint associated with 0x%x\n", addr);
825 /* Load a file. This is usually an srecord, which is ascii. No
826 protocol, just sent line by line. */
828 #define DOWNLOAD_LINE_SIZE 100
834 char buf[DOWNLOAD_LINE_SIZE];
838 printf ("Loading %s to monitor\n", arg);
840 download = fopen (arg, "r");
841 if (download == NULL)
843 error (sprintf (buf, "%s Does not exist", arg));
847 printf_monitor (LOAD_CMD);
848 /* expect ("Waiting for S-records from host... ", 1); */
850 while (!feof (download))
852 bytes_read = fread (buf, sizeof (char), DOWNLOAD_LINE_SIZE, download);
859 if (SERIAL_WRITE(monitor_desc, buf, bytes_read)) {
860 fprintf(stderr, "SERIAL_WRITE failed: (while downloading) %s\n", safe_strerror(errno));
864 while (i++ <=200000) {} ; /* Ugly HACK, probably needs flow control */
865 if (bytes_read < DOWNLOAD_LINE_SIZE)
867 if (!feof (download))
868 error ("Only read %d bytes\n", bytes_read);
877 if (!feof (download))
878 error ("Never got EOF while downloading");
882 /* Put a command string, in args, out to MONITOR. Output from MONITOR is placed
883 on the users terminal until the prompt is seen. */
886 monitor_command (args, fromtty)
891 fprintf (log_file, "\nIn command (args=%s)\n", args);
893 if (monitor_desc == NULL)
894 error("monitor target not open.");
897 error("Missing command.");
899 printf_monitor("%s\r", args);
905 /* Connect the user directly to MONITOR. This command acts just like the
906 'cu' or 'tip' command. Use <CR>~. or <CR>~^D to break out. */
908 static struct ttystate ttystate;
912 { printf("\r\n[Exiting connect mode]\r\n");
913 /*SERIAL_RESTORE(0, &ttystate);*/
917 connect_command (args, fromtty)
928 if (monitor_desc == NULL)
929 error("monitor target not open.");
932 fprintf("This command takes no args. They have been ignored.\n");
934 printf("[Entering connect mode. Use ~. or ~^D to escape]\n");
936 serial_raw(0, &ttystate);
938 make_cleanup(cleanup_tty, 0);
947 FD_SET(monitor_desc, &readfds);
948 numfds = select(sizeof(readfds)*8, &readfds, 0, 0, 0);
953 perror_with_name("select");
955 if (FD_ISSET(0, &readfds))
956 { /* tty input, send to monitor */
959 perror_with_name("connect");
961 printf_monitor("%c", c);
975 if (c == '.' || c == '\004')
982 if (FD_ISSET(monitor_desc, &readfds))
998 * Define the monitor command strings. Since these are passed directly
999 * through to a printf style function, we need can include formatting
1000 * strings. We also need a CR or LF on the end.
1002 struct monitor_ops rom68k_cmds = {
1003 "go \r", /* execute or usually GO command */
1004 "go \r", /* continue command */
1005 "st \r", /* single step */
1006 "db %x\r", /* set a breakpoint */
1007 "cb %x\r", /* clear a breakpoint */
1008 "pm %x\r", /* set memory to a value */
1009 "pm %x\r", /* display memory */
1010 "-%08X ", /* prompt memory commands use */
1011 "pr %s %x\r", /* set a register */
1012 ": ", /* delimiter between registers */
1013 "pr %s\r", /* read a register */
1014 "dc \r", /* download command */
1015 "ROM68K :->", /* monitor command prompt */
1016 "=", /* end-of-command delimitor */
1017 ".\r" /* optional command terminator */
1020 struct monitor_ops bug_cmds = {
1021 "go \r", /* execute or usually GO command */
1022 "go \r", /* continue command */
1023 "gn \r", /* single step */
1024 "br %x\r", /* set a breakpoint */
1025 "nobr %x\r", /* clear a breakpoint */
1026 "mm %x\r", /* set memory to a value */
1027 "mm %x\r", /* display memory */
1028 "%08X", /* prompt memory commands use */
1029 "rs %s %x\r", /* set a register */
1030 "=", /* delimiter between registers */
1031 "rm %s\r", /* read a register */
1032 "lo 0\r", /* download command */
1033 "Bug>", /* monitor command prompt */
1034 "? ", /* end-of-command delimitor */
1035 ".\r" /* optional command terminator */
1038 /* Define the target subroutine names */
1039 struct monitor_ops mon68_cmds = {
1040 "", /* execute or usually GO command */
1041 "", /* continue command */
1042 "", /* single step */
1043 "", /* set a breakpoint */
1044 "", /* clear a breakpoint */
1045 "", /* set memory to a value */
1046 "", /* display memory */
1047 "", /* set a register */
1048 "", /* delimiter between registers */
1049 "", /* read a register */
1050 "", /* download command */
1051 ">", /* monitor command prompt */
1052 "", /* end-of-command delimitor */
1053 "" /* optional command terminator */
1056 struct target_ops rom68k_ops = {
1058 "Integrated System's ROM68K remote debug monitor",
1059 "Use a remote computer running the ROM68K debug monitor.\n\
1060 Specify the serial device it is connected to (e.g. /dev/ttya).",
1067 monitor_fetch_register,
1068 monitor_store_register,
1069 monitor_prepare_to_store,
1070 monitor_xfer_inferior_memory,
1072 monitor_insert_breakpoint,
1073 monitor_remove_breakpoint, /* Breakpoints */
1078 0, /* Terminal handling */
1080 monitor_load, /* load */
1081 0, /* lookup_symbol */
1082 monitor_create_inferior,
1083 monitor_mourn_inferior,
1085 0, /* notice_signals */
1092 1, /* all mem, mem, stack, regs, exec */
1094 0, /* Section pointers */
1095 OPS_MAGIC, /* Always the last thing */
1098 struct target_ops monitor_bug_ops = {
1100 "Motorola's BUG remote serial debug monitor",
1101 "Use a remote computer running Motorola's BUG debug monitor.\n\
1102 Specify the serial device it is connected to (e.g. /dev/ttya).",
1109 monitor_fetch_register,
1110 monitor_store_register,
1111 monitor_prepare_to_store,
1112 monitor_xfer_inferior_memory,
1114 monitor_insert_breakpoint,
1115 monitor_remove_breakpoint, /* Breakpoints */
1120 0, /* Terminal handling */
1122 monitor_load, /* load */
1123 0, /* lookup_symbol */
1124 monitor_create_inferior,
1125 monitor_mourn_inferior,
1127 0, /* notice_signals */
1134 1, /* all mem, mem, stack, regs, exec */
1136 0, /* Section pointers */
1137 OPS_MAGIC, /* Always the last thing */
1140 struct target_ops mon68_ops = {
1142 "Intermetric's MON68 remote serial debug monitor",
1143 "Use a remote computer running the MON68 debug monitor.\n\
1144 Specify the serial device it is connected to (e.g. /dev/ttya).",
1151 monitor_fetch_register,
1152 monitor_store_register,
1153 monitor_prepare_to_store,
1154 monitor_xfer_inferior_memory,
1156 monitor_insert_breakpoint,
1157 monitor_remove_breakpoint, /* Breakpoints */
1162 0, /* Terminal handling */
1164 monitor_load, /* load */
1165 0, /* lookup_symbol */
1166 monitor_create_inferior,
1167 monitor_mourn_inferior,
1169 0, /* notice_signals */
1176 1, /* all mem, mem, stack, regs, exec */
1178 0, /* Section pointers */
1179 OPS_MAGIC, /* Always the last thing */
1183 _initialize_remote_monitors ()
1186 add_set_cmd ("hash", no_class, var_boolean,
1188 "Set display of activity while downloading a file.\n\
1189 When enabled, a period \'.\' is displayed.",
1193 /* generic monitor command */
1194 add_com ("monitor <command>", class_obscure, monitor_command,
1195 "Send a command to the debug monitor.");
1197 add_com ("connect", class_obscure, connect_command,
1198 "Connect the terminal directly up to a serial based command monitor.\n\
1199 Use <CR>~. or <CR>~^D to break out.");
1202 add_target (&rom68k_ops);
1203 /* add_target (&mon68_ops); */
1204 add_target (&monitor_bug_ops);