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 */
66 extern struct monitor_ops mon68_cmds; /* Forward declaration */
68 extern struct monitor_ops bug_cmds; /* Forward declaration */
69 extern struct cmd_list_element *setlist;
70 extern struct cmd_list_element *unsetlist;
71 struct cmd_list_element *showlist;
73 static void monitor_close();
74 static void monitor_fetch_register();
75 static void monitor_store_register();
77 static int sr_get_debug(); /* flag set by "set remotedebug" */
79 static int hashmark; /* flag set by "set hash" */
81 /* FIXME: Replace with sr_get_debug (). */
82 #define LOG_FILE "monitor.log"
83 #if defined (LOG_FILE)
87 static int timeout = 24;
89 /* Descriptor for I/O to remote machine. Initialize it to NULL so that
90 monitor_open knows that we don't have a file open when the program starts.
92 static serial_t monitor_desc = NULL;
94 /* Send data to monitor. Works just like printf. */
97 printf_monitor(va_alist)
107 pattern = va_arg(args, char *);
109 vsprintf(buf, pattern, args);
111 if (SERIAL_WRITE(monitor_desc, buf, strlen(buf)))
112 fprintf(stderr, "SERIAL_WRITE failed: %s\n", safe_strerror(errno));
115 /* Read a character from the remote system, doing all the fancy
123 c = SERIAL_READCHAR(monitor_desc, timeout);
130 putc(c & 0x7f, log_file);
136 if (c == SERIAL_TIMEOUT)
139 return c; /* Polls shouldn't generate timeout errors */
141 error("Timeout reading from remote system.");
144 perror_with_name("remote-monitor");
147 /* Scan input from the remote system, until STRING is found. If DISCARD is
148 non-zero, then discard non-matching input, else print it out.
149 Let the user break out immediately. */
151 expect(string, discard)
159 printf ("Expecting \"%s\"\n", string);
164 c = readchar(timeout);
173 printf ("\nMatched\n");
181 fwrite(string, 1, (p - 1) - string, stdout);
190 /* Keep discarding input until we see the MONITOR prompt.
192 The convention for dealing with the prompt is that you
194 o *then* wait for the prompt.
196 Thus the last thing that a procedure does with the serial line
197 will be an expect_prompt(). Exception: monitor_resume does not
198 wait for the prompt, because the terminal is being handed over
199 to the inferior. However, the next thing which happens after that
200 is a monitor_wait which does wait for the prompt.
201 Note that this includes abnormal exit, e.g. error(). This is
202 necessary to prevent getting into states from which we can't
205 expect_prompt(discard)
208 #if defined (LOG_FILE)
209 /* This is a convenient place to do this. The idea is to do it often
210 enough that we never lose much data if we terminate abnormally. */
213 expect (PROMPT, discard);
216 /* Get a hex digit from the remote system & return its value.
217 If ignore_space is nonzero, ignore spaces (not newline, tab, etc). */
219 get_hex_digit(ignore_space)
225 ch = readchar(timeout);
226 if (ch >= '0' && ch <= '9')
228 else if (ch >= 'A' && ch <= 'F')
229 return ch - 'A' + 10;
230 else if (ch >= 'a' && ch <= 'f')
231 return ch - 'a' + 10;
232 else if (ch == ' ' && ignore_space)
237 error("Invalid hex digit from remote system.");
242 /* Get a byte from monitor and put it in *BYT. Accept any number
250 val = get_hex_digit (1) << 4;
251 val |= get_hex_digit (0);
255 /* Get N 32-bit words from remote, each preceded by a space,
256 and put them in registers starting at REGNO. */
258 get_hex_regs (n, regno)
265 for (i = 0; i < n; i++)
270 for (j = 0; j < 8; j++)
271 val = (val << 4) + get_hex_digit (j == 0);
272 supply_register (regno++, (char *) &val);
276 /* This is called not only when we first attach, but also when the
277 user types "run" after having attached. */
279 monitor_create_inferior (execfile, args, env)
287 error("Can't pass arguments to remote MONITOR process");
289 if (execfile == 0 || exec_bfd == 0)
290 error("No exec file specified");
292 entry_pt = (int) bfd_get_start_address (exec_bfd);
295 fputs ("\nIn Create_inferior()", log_file);
298 /* The "process" (board) is already stopped awaiting our commands, and
299 the program is already downloaded. We just set its PC and go. */
301 clear_proceed_status ();
303 /* Tell wait_for_inferior that we've started a new process. */
304 init_wait_for_inferior ();
306 /* Set up the "saved terminal modes" of the inferior
307 based on what modes we are starting it with. */
308 target_terminal_init ();
310 /* Install inferior's terminal modes. */
311 target_terminal_inferior ();
313 /* insert_step_breakpoint (); FIXME, do we need this? */
316 proceed ((CORE_ADDR)entry_pt, TARGET_SIGNAL_DEFAULT, 0);
319 /* Open a connection to a remote debugger.
320 NAME is the filename used for communication. */
322 static int baudrate = 9600;
323 static char dev_name[100];
326 general_open(args, name, from_tty)
332 error ("Use `target %s DEVICE-NAME' to use a serial port, or \n\
333 `target %s HOST-NAME:PORT-NUMBER' to use a network connection.", name, name);
335 target_preopen(from_tty);
340 strcpy(dev_name, args);
341 monitor_desc = SERIAL_OPEN(dev_name);
343 if (monitor_desc == NULL)
344 perror_with_name(dev_name);
348 if (SERIAL_SETBAUDRATE (monitor_desc, baud_rate))
350 SERIAL_CLOSE (monitor_desc);
351 perror_with_name (name);
355 SERIAL_RAW(monitor_desc);
357 #if defined (LOG_FILE)
358 log_file = fopen (LOG_FILE, "w");
359 if (log_file == NULL)
360 perror_with_name (LOG_FILE);
363 /* Hello? Are you there? */
364 printf_monitor("\r"); /* CR wakes up monitor */
369 printf("Remote %s connected to %s\n", target_shortname,
374 rom68k_open(args, from_tty)
378 push_target(&rom68k_ops);
379 push_monitor (&rom68k_cmds);
381 general_open (args, "rom68k", from_tty);
385 mon68_open(args, from_tty)
389 push_target(&mon68_ops);
391 push_monitor (&mon68_cmds);
394 general_open (args, "mon68", from_tty);
398 bug_open(args, from_tty)
402 push_target(&monitor_bug_ops);
403 push_monitor (&bug_cmds);
405 general_open (args, "bug", from_tty);
409 * _close -- Close out all files and local state before this target loses control.
413 monitor_close (quitting)
416 SERIAL_CLOSE(monitor_desc);
419 #if defined (LOG_FILE)
421 if (ferror(log_file))
422 fprintf(stderr, "Error writing log file.\n");
423 if (fclose(log_file) != 0)
424 fprintf(stderr, "Error closing log file.\n");
429 /* Terminate the open connection to the remote debugger.
430 Use this when you want to detach and do something else
433 monitor_detach (from_tty)
436 pop_target(); /* calls monitor_close to do the real work */
438 printf ("Ending remote %s debugging\n", target_shortname);
442 * _resume -- Tell the remote machine to resume.
445 monitor_resume (pid, step, sig)
447 enum target_signal sig;
450 fprintf (log_file, "\nIn Resume (step=%d, sig=%d)\n", step, sig);
455 printf_monitor (STEP_CMD);
456 /* wait for the echo. */
457 expect (STEP_CMD, 1);
461 printf_monitor (GO_CMD);
462 /* swallow the echo. */
468 * _wait -- Wait until the remote machine stops, then return,
469 * storing status in status just as `wait' would.
473 monitor_wait (pid, status)
475 struct target_waitstatus *status;
477 int old_timeout = timeout;
479 fputs ("\nIn wait ()", log_file);
482 status->kind = TARGET_WAITKIND_EXITED;
483 status->value.integer = 0;
485 timeout = 0; /* Don't time out -- user program is running. */
487 expect_prompt(0); /* Wait for prompt, outputting extraneous text */
489 status->kind = TARGET_WAITKIND_STOPPED;
490 status->value.sig = TARGET_SIGNAL_TRAP;
492 timeout = old_timeout;
497 /* Return the name of register number regno in the form input and output by
498 monitor. Currently, register_names just happens to contain exactly what
499 monitor wants. Lets take advantage of that just as long as possible! */
513 for (p = reg_names[regno]; *p; p++)
520 /* read the remote registers into the block regs. */
523 monitor_fetch_registers ()
527 /* yeah yeah, i know this is horribly inefficient. but it isn't done
528 very often... i'll clean it up later. */
530 for (regno = 0; regno <= PC_REGNUM; regno++)
531 monitor_fetch_register(regno);
534 /* Fetch register REGNO, or all registers if REGNO is -1.
535 Returns errno value. */
537 monitor_fetch_register (regno)
543 fprintf (log_file, "\nIn Fetch Register (reg=%s)\n", get_reg_name (regno));
549 monitor_fetch_registers ();
553 char *name = get_reg_name (regno);
554 printf_monitor (GET_REG, name);
556 expect (REG_DELIM, 1);
557 if (strcasecmp (name, "SR") == 0)
560 for (j = 0; j < 4; j++)
561 val = (val << 4) + get_hex_digit (j == 0);
562 supply_register (regno, (char *) &val);
566 get_hex_regs (1, regno);
571 printf_monitor (CMD_END);
578 /* Store the remote registers from the contents of the block REGS. */
581 monitor_store_registers ()
585 for (regno = 0; regno <= PC_REGNUM; regno++)
586 monitor_store_register(regno);
588 registers_changed ();
591 /* Store register REGNO, or all if REGNO == 0.
592 return errno value. */
594 monitor_store_register (regno)
598 fprintf (log_file, "\nIn Store_register (regno=%d)\n", regno);
601 monitor_store_registers ();
605 printf ("Setting register %s to 0x%x\n", get_reg_name (regno), read_register (regno));
607 printf_monitor (SET_REG, get_reg_name (regno),
608 read_register (regno));
614 /* Get ready to modify the registers array. On machines which store
615 individual registers, this doesn't need to do anything. On machines
616 which store all the registers in one fell swoop, this makes sure
617 that registers contains all the registers from the program being
621 monitor_prepare_to_store ()
623 /* Do nothing, since we can store individual regs */
627 monitor_files_info ()
629 printf ("\tAttached to %s at %d baud.\n",
633 /* Copy LEN bytes of data from debugger memory at MYADDR
634 to inferior's memory at MEMADDR. Returns length moved. */
636 monitor_write_inferior_memory (memaddr, myaddr, len)
638 unsigned char *myaddr;
645 fprintf (log_file, "\nIn Write_inferior_memory (memaddr=%x, len=%d)\n", memaddr, len);
647 for (i = 0; i < len; i++)
649 printf_monitor (MEM_SET_CMD, memaddr + i);
650 expect (sprintf (buf, MEM_PROMPT, memaddr + i), 1);
652 printf_monitor ("%x", myaddr[i]);
654 printf ("\nSet 0x%x to 0x%x\n", memaddr + i, myaddr[i]);
657 /*** expect (sprintf (buf, MEM_PROMPT, memaddr + i +1), 1);
658 expect (CMD_DELIM); ***/
659 printf_monitor (CMD_END);
666 /* Read LEN bytes from inferior memory at MEMADDR. Put the result
667 at debugger address MYADDR. Returns length moved. */
669 monitor_read_inferior_memory(memaddr, myaddr, len)
677 /* Number of bytes read so far. */
680 /* Starting address of this pass. */
681 unsigned long startaddr;
683 /* Number of bytes to read in this pass. */
687 fprintf (log_file, "\nIn Read_inferior_memory (memaddr=%x, len=%d)\n", memaddr, len);
690 /* Note that this code works correctly if startaddr is just less
691 than UINT_MAX (well, really CORE_ADDR_MAX if there was such a
692 thing). That is, something like
693 monitor_read_bytes (CORE_ADDR_MAX - 4, foo, 4)
694 works--it never adds len To memaddr and gets 0. */
695 /* However, something like
696 monitor_read_bytes (CORE_ADDR_MAX - 3, foo, 4)
697 doesn't need to work. Detect it and give up if there's an attempt
699 if (((memaddr - 1) + len) < memaddr) {
709 if ((startaddr % 16) != 0)
710 len_this_pass -= startaddr % 16;
711 if (len_this_pass > (len - count))
712 len_this_pass = (len - count);
714 printf ("\nDisplay %d bytes at %x\n", len_this_pass, startaddr);
716 for (i = 0; i < len_this_pass; i++)
718 printf_monitor (MEM_DIS_CMD, startaddr);
719 expect (sprintf(buf, MEM_PROMPT, startaddr), 1);
720 get_hex_byte (&myaddr[count++]);
722 printf ("\nRead a 0x%x from 0x%x\n", myaddr[count-1], startaddr);
726 printf_monitor (CMD_END);
735 /* FIXME-someday! merge these two. */
737 monitor_xfer_inferior_memory (memaddr, myaddr, len, write, target)
742 struct target_ops *target; /* ignored */
745 return monitor_write_inferior_memory (memaddr, myaddr, len);
747 return monitor_read_inferior_memory (memaddr, myaddr, len);
751 monitor_kill (args, from_tty)
755 return; /* ignore attempts to kill target system */
758 /* Clean up when a program exits.
759 The program actually lives on in the remote processor's RAM, and may be
760 run again without a download. Don't leave it full of breakpoint
764 monitor_mourn_inferior ()
766 remove_breakpoints ();
767 generic_mourn_inferior (); /* Do all the proper things now */
770 #define MAX_MONITOR_BREAKPOINTS 16
772 extern int memory_breakpoint_size;
773 static CORE_ADDR breakaddr[MAX_MONITOR_BREAKPOINTS] = {0};
776 monitor_insert_breakpoint (addr, shadow)
783 fprintf (log_file, "\nIn Insert_breakpoint (addr=%x)\n", addr);
785 for (i = 0; i <= MAX_MONITOR_BREAKPOINTS; i++)
786 if (breakaddr[i] == 0)
790 printf ("Breakpoint at %x\n", addr);
791 monitor_read_inferior_memory(addr, shadow, memory_breakpoint_size);
792 printf_monitor(SET_BREAK_CMD, addr);
797 fprintf(stderr, "Too many breakpoints (> 16) for monitor\n");
802 * _remove_breakpoint -- Tell the monitor to remove a breakpoint
805 monitor_remove_breakpoint (addr, shadow)
812 fprintf (log_file, "\nIn Remove_breakpoint (addr=%x)\n", addr);
814 for (i = 0; i < MAX_MONITOR_BREAKPOINTS; i++)
815 if (breakaddr[i] == addr)
818 /* some monitors remove breakpoints based on the address */
819 if (strcasecmp (target_shortname, "bug") == 0)
820 printf_monitor(CLR_BREAK_CMD, addr);
822 printf_monitor(CLR_BREAK_CMD, i);
827 fprintf(stderr, "Can't find breakpoint associated with 0x%x\n", addr);
831 /* Load a file. This is usually an srecord, which is ascii. No
832 protocol, just sent line by line. */
834 #define DOWNLOAD_LINE_SIZE 100
840 char buf[DOWNLOAD_LINE_SIZE];
844 printf ("Loading %s to monitor\n", arg);
846 download = fopen (arg, "r");
847 if (download == NULL)
849 error (sprintf (buf, "%s Does not exist", arg));
853 printf_monitor (LOAD_CMD);
854 /* expect ("Waiting for S-records from host... ", 1); */
856 while (!feof (download))
858 bytes_read = fread (buf, sizeof (char), DOWNLOAD_LINE_SIZE, download);
865 if (SERIAL_WRITE(monitor_desc, buf, bytes_read)) {
866 fprintf(stderr, "SERIAL_WRITE failed: (while downloading) %s\n", safe_strerror(errno));
870 while (i++ <=200000) {} ; /* Ugly HACK, probably needs flow control */
871 if (bytes_read < DOWNLOAD_LINE_SIZE)
873 if (!feof (download))
874 error ("Only read %d bytes\n", bytes_read);
883 if (!feof (download))
884 error ("Never got EOF while downloading");
888 /* Put a command string, in args, out to MONITOR. Output from MONITOR is placed
889 on the users terminal until the prompt is seen. */
892 monitor_command (args, fromtty)
897 fprintf (log_file, "\nIn command (args=%s)\n", args);
899 if (monitor_desc == NULL)
900 error("monitor target not open.");
903 error("Missing command.");
905 printf_monitor("%s\r", args);
911 /* Connect the user directly to MONITOR. This command acts just like the
912 'cu' or 'tip' command. Use <CR>~. or <CR>~^D to break out. */
914 static struct ttystate ttystate;
918 { printf("\r\n[Exiting connect mode]\r\n");
919 /*SERIAL_RESTORE(0, &ttystate);*/
923 connect_command (args, fromtty)
934 if (monitor_desc == NULL)
935 error("monitor target not open.");
938 fprintf("This command takes no args. They have been ignored.\n");
940 printf("[Entering connect mode. Use ~. or ~^D to escape]\n");
942 serial_raw(0, &ttystate);
944 make_cleanup(cleanup_tty, 0);
955 FD_SET(monitor_desc, &readfds);
956 numfds = select(sizeof(readfds)*8, &readfds, 0, 0, 0);
961 perror_with_name("select");
963 if (FD_ISSET(0, &readfds))
964 { /* tty input, send to monitor */
967 perror_with_name("connect");
969 printf_monitor("%c", c);
983 if (c == '.' || c == '\004')
990 if (FD_ISSET(monitor_desc, &readfds))
1005 struct target_ops rom68k_ops = {
1007 "Integrated System's ROM68K remote debug monitor",
1008 "Use a remote computer running the ROM68K debug monitor.\n\
1009 Specify the serial device it is connected to (e.g. /dev/ttya).",
1016 monitor_fetch_register,
1017 monitor_store_register,
1018 monitor_prepare_to_store,
1019 monitor_xfer_inferior_memory,
1021 monitor_insert_breakpoint,
1022 monitor_remove_breakpoint, /* Breakpoints */
1027 0, /* Terminal handling */
1029 monitor_load, /* load */
1030 0, /* lookup_symbol */
1031 monitor_create_inferior,
1032 monitor_mourn_inferior,
1034 0, /* notice_signals */
1042 1, /* all mem, mem, stack, regs, exec */
1044 0, /* Section pointers */
1045 OPS_MAGIC, /* Always the last thing */
1048 struct target_ops monitor_bug_ops = {
1050 "Motorola's BUG remote serial debug monitor",
1051 "Use a remote computer running Motorola's BUG 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 */
1085 1, /* all mem, mem, stack, regs, exec */
1087 0, /* Section pointers */
1088 OPS_MAGIC, /* Always the last thing */
1091 struct target_ops mon68_ops = {
1093 "Intermetric's MON68 remote serial debug monitor",
1094 "Use a remote computer running the MON68 debug monitor.\n\
1095 Specify the serial device it is connected to (e.g. /dev/ttya).",
1102 monitor_fetch_register,
1103 monitor_store_register,
1104 monitor_prepare_to_store,
1105 monitor_xfer_inferior_memory,
1107 monitor_insert_breakpoint,
1108 monitor_remove_breakpoint, /* Breakpoints */
1113 0, /* Terminal handling */
1115 monitor_load, /* load */
1116 0, /* lookup_symbol */
1117 monitor_create_inferior,
1118 monitor_mourn_inferior,
1120 0, /* notice_signals */
1128 1, /* all mem, mem, stack, regs, exec */
1130 0, /* Section pointers */
1131 OPS_MAGIC, /* Always the last thing */
1136 * Define the monitor command strings. Since these are passed directly
1137 * through to a printf style function, we need can include formatting
1138 * strings. We also need a CR or LF on the end.
1140 struct monitor_ops rom68k_cmds = {
1141 1, /* 1 is ascii, 0 is binary */
1142 "\n", /* monitor init string */
1143 "go \r", /* execute or usually GO command */
1144 "go \r", /* continue command */
1145 "st \r", /* single step */
1146 "db %x\r", /* set a breakpoint */
1147 "cb %x\r", /* clear a breakpoint */
1148 0, /* 0 for number, 1 for address */
1150 "pm %x\r", /* set memory to a value */
1155 "pm %x\r", /* display memory */
1160 "pr %s %x\r", /* set a register */
1161 ": ", /* delimiter between registers */
1165 "pr %s\r", /* read a register */
1166 ": ", /* delimiter between registers */
1169 "dc \r", /* download command */
1170 "ROM68K :->", /* monitor command prompt */
1171 "=", /* end-of-command delimitor */
1172 ".\r", /* optional command terminator */
1173 &rom68k_ops, /* target operations */
1174 "-%08X ", /* prompt memory commands use */
1177 struct monitor_ops bug_cmds = {
1178 1, /* 1 is ascii, 0 is binary */
1179 "\n", /* monitor init string */
1180 "go \r", /* execute or usually GO command */
1181 "go \r", /* continue command */
1182 "gn \r", /* single step */
1183 "br %x\r", /* set a breakpoint */
1184 "nobr %x\r", /* clear a breakpoint */
1185 0, /* 0 for number, 1 for address */
1187 "mm %x\r", /* set memory to a value */
1192 "mm %x\r", /* display memory */
1197 "rs %s %x\r", /* set a register */
1198 "=", /* delimiter between registers */
1202 "rm %s\r", /* read a register */
1203 "=", /* delimiter between registers */
1206 "lo 0\r", /* download command */
1207 "Bug>", /* monitor command prompt */
1208 "? ", /* end-of-command delimitor */
1209 ".\r", /* optional command terminator */
1211 "%08X", /* prompt memory commands use */
1215 /* Define the target subroutine names */
1216 struct monitor_ops mon68_cmds = {
1217 1, /* 1 is ascii, 0 is binary */
1218 "", /* execute or usually GO command */
1219 "", /* continue command */
1220 "", /* single step */
1221 "", /* set a breakpoint */
1222 "", /* clear a breakpoint */
1223 "", /* set memory to a value */
1224 "", /* display memory */
1225 "", /* set a register */
1226 "", /* delimiter between registers */
1227 "", /* read a register */
1228 "", /* download command */
1229 ">", /* monitor command prompt */
1230 "", /* end-of-command delimitor */
1231 "" /* optional command terminator */
1237 _initialize_remote_monitors ()
1240 add_set_cmd ("hash", no_class, var_boolean,
1242 "Set display of activity while downloading a file.\n\
1243 When enabled, a period \'.\' is displayed.",
1247 /* generic monitor command */
1248 add_com ("monitor <command>", class_obscure, monitor_command,
1249 "Send a command to the debug monitor.");
1251 add_com ("connect", class_obscure, connect_command,
1252 "Connect the terminal directly up to a serial based command monitor.\n\
1253 Use <CR>~. or <CR>~^D to break out.");
1256 add_target (&rom68k_ops);
1257 /* add_target (&mon68_ops); */
1258 add_target (&monitor_bug_ops);