1 /* Remote debugging interface for MONITOR boot monitor, for GDB.
2 Copyright 1990, 1991, 1992 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 a 29k 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>
54 # define TERMINAL struct termios
56 # define TERMINAL struct sgttyb
59 struct monitor_ops *current_monitor;
60 extern struct target_ops rom68k_ops; /* Forward declaration */
61 extern struct target_ops mon68_ops; /* Forward declaration */
62 extern struct target_ops bug_ops; /* Forward declaration */
63 extern struct monitor_ops rom68k_cmds; /* Forward declaration */
64 extern struct monitor_ops mon68_cmds; /* Forward declaration */
65 extern struct monitor_ops bug_cmds; /* Forward declaration */
66 extern struct cmd_list_element *setlist;
67 extern struct cmd_list_element *unsetlist;
68 struct cmd_list_element *showlist;
70 static void monitor_close();
71 static void monitor_fetch_register();
72 static void monitor_store_register();
73 static int kiodebug; /* flag set by "set remotedebug" */
74 static int hashmark; /* flag set by "set hash" */
76 #define LOG_FILE "monitor.log"
77 #if defined (LOG_FILE)
81 static int timeout = 24;
83 /* Descriptor for I/O to remote machine. Initialize it to -1 so that
84 monitor_open knows that we don't have a file open when the program
86 int monitor_desc = -1;
88 /* Send data to monitor. Works just like printf. */
91 printf_monitor(va_alist)
101 pattern = va_arg(args, char *);
103 vsprintf(buf, pattern, args);
105 if (!serial_write(buf, strlen(buf)))
106 fprintf(stderr, "serial_write failed: %s\n", safe_strerror(errno));
109 /* Read a character from the remote system, doing all the fancy
117 c = serial_readchar(timeout);
124 putc(c & 0x7f, log_file);
133 return c; /* Polls shouldn't generate timeout errors */
135 error("Timeout reading from remote system.");
138 perror_with_name("remote-monitor");
141 /* Scan input from the remote system, until STRING is found. If DISCARD is
142 non-zero, then discard non-matching input, else print it out.
143 Let the user break out immediately. */
145 expect(string, discard)
153 printf ("Expecting \"%s\"\n", string);
158 c = readchar(timeout);
167 printf ("\nMatched\n");
175 fwrite(string, 1, (p - 1) - string, stdout);
184 /* Keep discarding input until we see the MONITOR prompt.
186 The convention for dealing with the prompt is that you
188 o *then* wait for the prompt.
190 Thus the last thing that a procedure does with the serial line
191 will be an expect_prompt(). Exception: monitor_resume does not
192 wait for the prompt, because the terminal is being handed over
193 to the inferior. However, the next thing which happens after that
194 is a monitor_wait which does wait for the prompt.
195 Note that this includes abnormal exit, e.g. error(). This is
196 necessary to prevent getting into states from which we can't
199 expect_prompt(discard)
202 #if defined (LOG_FILE)
203 /* This is a convenient place to do this. The idea is to do it often
204 enough that we never lose much data if we terminate abnormally. */
207 expect (PROMPT, discard);
210 /* Get a hex digit from the remote system & return its value.
211 If ignore_space is nonzero, ignore spaces (not newline, tab, etc). */
213 get_hex_digit(ignore_space)
219 ch = readchar(timeout);
220 if (ch >= '0' && ch <= '9')
222 else if (ch >= 'A' && ch <= 'F')
223 return ch - 'A' + 10;
224 else if (ch >= 'a' && ch <= 'f')
225 return ch - 'a' + 10;
226 else if (ch == ' ' && ignore_space)
231 error("Invalid hex digit from remote system.");
236 /* Get a byte from monitor and put it in *BYT. Accept any number
244 val = get_hex_digit (1) << 4;
245 val |= get_hex_digit (0);
249 /* Get N 32-bit words from remote, each preceded by a space,
250 and put them in registers starting at REGNO. */
252 get_hex_regs (n, regno)
259 for (i = 0; i < n; i++)
264 for (j = 0; j < 8; j++)
265 val = (val << 4) + get_hex_digit (j == 0);
266 supply_register (regno++, (char *) &val);
270 /* This is called not only when we first attach, but also when the
271 user types "run" after having attached. */
273 monitor_create_inferior (execfile, args, env)
281 error("Can't pass arguments to remote MONITOR process");
283 if (execfile == 0 || exec_bfd == 0)
284 error("No exec file specified");
286 entry_pt = (int) bfd_get_start_address (exec_bfd);
288 #ifdef CREATE_INFERIOR_HOOK
289 CREATE_INFERIOR_HOOK (0); /* No process-ID */
292 fputs ("\nIn Create_inferior()", log_file);
295 /* The "process" (board) is already stopped awaiting our commands, and
296 the program is already downloaded. We just set its PC and go. */
298 clear_proceed_status ();
300 /* Tell wait_for_inferior that we've started a new process. */
301 init_wait_for_inferior ();
303 /* Set up the "saved terminal modes" of the inferior
304 based on what modes we are starting it with. */
305 target_terminal_init ();
307 /* Install inferior's terminal modes. */
308 target_terminal_inferior ();
310 /* insert_step_breakpoint (); FIXME, do we need this? */
311 proceed ((CORE_ADDR)entry_pt, -1, 0); /* Let 'er rip... */
314 /* Open a connection to a remote debugger.
315 NAME is the filename used for communication. */
317 static int baudrate = 9600;
318 static char dev_name[100];
321 rom68k_open(args, from_tty)
329 target_preopen(from_tty);
331 n = sscanf(args, " %s %d %s", dev_name, &baudrate, junk);
334 error("Bad arguments. Usage: target rom68k <device> <speed>\n\
335 or target monitor <host> <port>\n");
339 monitor_desc = serial_open(dev_name);
341 serial_setbaudrate(baudrate);
343 ioctl (monitor_desc, TIOCGETP, &sg);
344 sg.sg_flags = O_CRDELAY | O_NLDELAY | ~(RAW);
345 ioctl (monitor_desc, TIOCSETN, &sg);
347 push_target(&rom68k_ops);
348 push_monitor (&rom68k_cmds);
350 #if defined (LOG_FILE)
351 log_file = fopen (LOG_FILE, "w");
352 if (log_file == NULL)
353 perror_with_name (LOG_FILE);
356 /* Hello? Are you there? */
357 printf_monitor("\n"); /* CR wakes up monitor */
362 printf("Remote %s connected to %s\n", target_shortname,
367 mon68_open(args, from_tty)
374 target_preopen(from_tty);
376 n = sscanf(args, " %s %d %s", dev_name, &baudrate, junk);
379 error("Bad arguments. Usage: target mon68 <device> <speed>\n\
380 or target monitor <host> <port>\n");
384 monitor_desc = serial_open(dev_name);
386 serial_setbaudrate(baudrate);
388 push_target(&mon68_ops);
389 push_monitor (&mon68_cmds);
391 #if defined (LOG_FILE)
392 log_file = fopen (LOG_FILE, "w");
393 if (log_file == NULL)
394 perror_with_name (LOG_FILE);
397 /* Hello? Are you there? */
398 printf_monitor("\n"); /* CR wakes up dbug */
403 printf("Remote %s connected to %s\n", target_shortname,
408 bug_open(args, from_tty)
415 target_preopen(from_tty);
417 n = sscanf(args, " %s %d %s", dev_name, &baudrate, junk);
420 error("Bad arguments. Usage: target bug <device> <speed>\n\
421 or target monitor <host> <port>\n");
425 monitor_desc = serial_open(dev_name);
427 serial_setbaudrate(baudrate);
429 push_target(&bug_ops);
430 push_monitor (&bug_cmds);
432 #if defined (LOG_FILE)
433 log_file = fopen (LOG_FILE, "w");
434 if (log_file == NULL)
435 perror_with_name (LOG_FILE);
438 /* Hello? Are you there? */
439 printf_monitor("\r"); /* CR wakes up dbug */
444 printf("Remote %s connected to %s\n", target_shortname,
449 * _close -- Close out all files and local state before this target loses control.
452 monitor_close (quitting)
457 #if defined (LOG_FILE)
459 if (ferror(log_file))
460 fprintf(stderr, "Error writing log file.\n");
461 if (fclose(log_file) != 0)
462 fprintf(stderr, "Error closing log file.\n");
467 /* Terminate the open connection to the remote debugger.
468 Use this when you want to detach and do something else
471 monitor_detach (from_tty)
474 pop_target(); /* calls monitor_close to do the real work */
476 printf ("Ending remote %s debugging\n", target_shortname);
480 * _resume -- Tell the remote machine to resume.
483 monitor_resume (step, sig)
487 fprintf (log_file, "\nIn Resume (step=%d, sig=%d)\n", step, sig);
492 printf_monitor (STEP_CMD);
493 /* wait for the echo. */
494 expect (STEP_CMD, 1);
498 printf_monitor (GO_CMD);
499 /* swallow the echo. */
505 * _wait -- Wait until the remote machine stops, then return,
506 * storing status in status just as `wait' would.
510 monitor_wait (status)
513 int old_timeout = timeout;
515 fputs ("\nIn wait ()", log_file);
518 WSETEXIT ((*status), 0);
520 timeout = 0; /* Don't time out -- user program is running. */
522 expect_prompt(0); /* Wait for prompt, outputting extraneous text */
524 WSETSTOP ((*status), SIGTRAP);
526 timeout = old_timeout;
531 /* Return the name of register number regno in the form input and output by
532 monitor. Currently, register_names just happens to contain exactly what
533 monitor wants. Lets take advantage of that just as long as possible! */
547 for (p = reg_names[regno]; *p; p++)
554 /* read the remote registers into the block regs. */
557 monitor_fetch_registers ()
561 /* yeah yeah, i know this is horribly inefficient. but it isn't done
562 very often... i'll clean it up later. */
564 for (regno = 0; regno <= PC_REGNUM; regno++)
565 monitor_fetch_register(regno);
568 /* Fetch register REGNO, or all registers if REGNO is -1.
569 Returns errno value. */
571 monitor_fetch_register (regno)
577 fprintf (log_file, "\nIn Fetch Register (reg=%s)\n", get_reg_name (regno));
583 monitor_fetch_registers ();
587 char *name = get_reg_name (regno);
588 printf_monitor (GET_REG, name);
590 expect (REG_DELIM, 1);
591 if (strcasecmp (name, "SR") == 0)
594 for (j = 0; j < 4; j++)
595 val = (val << 4) + get_hex_digit (j == 0);
596 supply_register (regno, (char *) &val);
600 get_hex_regs (1, regno);
605 printf_monitor (CMD_END);
612 /* Store the remote registers from the contents of the block REGS. */
615 monitor_store_registers ()
619 for (regno = 0; regno <= PC_REGNUM; regno++)
620 monitor_store_register(regno);
622 registers_changed ();
625 /* Store register REGNO, or all if REGNO == 0.
626 return errno value. */
628 monitor_store_register (regno)
632 fprintf (log_file, "\nIn Store_register (regno=%d)\n", regno);
635 monitor_store_registers ();
639 printf ("Setting register %s to 0x%x\n", get_reg_name (regno), read_register (regno));
641 printf_monitor (SET_REG, get_reg_name (regno),
642 read_register (regno));
648 /* Get ready to modify the registers array. On machines which store
649 individual registers, this doesn't need to do anything. On machines
650 which store all the registers in one fell swoop, this makes sure
651 that registers contains all the registers from the program being
655 monitor_prepare_to_store ()
657 /* Do nothing, since we can store individual regs */
661 monitor_files_info ()
663 printf ("\tAttached to %s at %d baud.\n",
667 /* Copy LEN bytes of data from debugger memory at MYADDR
668 to inferior's memory at MEMADDR. Returns length moved. */
670 monitor_write_inferior_memory (memaddr, myaddr, len)
672 unsigned char *myaddr;
679 fprintf (log_file, "\nIn Write_inferior_memory (memaddr=%x, len=%d)\n", memaddr, len);
681 for (i = 0; i < len; i++)
683 printf_monitor (MEM_SET_CMD, memaddr + i);
684 expect (sprintf (buf, MEM_PROMPT, memaddr + i), 1);
686 printf_monitor ("%x", myaddr[i]);
688 printf ("\nSet 0x%x to 0x%x\n", memaddr + i, myaddr[i]);
691 /*** expect (sprintf (buf, MEM_PROMPT, memaddr + i +1), 1);
692 expect (CMD_DELIM); ***/
693 printf_monitor (CMD_END);
700 /* Read LEN bytes from inferior memory at MEMADDR. Put the result
701 at debugger address MYADDR. Returns length moved. */
703 monitor_read_inferior_memory(memaddr, myaddr, len)
711 /* Number of bytes read so far. */
714 /* Starting address of this pass. */
715 unsigned long startaddr;
717 /* Number of bytes to read in this pass. */
721 fprintf (log_file, "\nIn Read_inferior_memory (memaddr=%x, len=%d)\n", memaddr, len);
724 /* Note that this code works correctly if startaddr is just less
725 than UINT_MAX (well, really CORE_ADDR_MAX if there was such a
726 thing). That is, something like
727 monitor_read_bytes (CORE_ADDR_MAX - 4, foo, 4)
728 works--it never adds len To memaddr and gets 0. */
729 /* However, something like
730 monitor_read_bytes (CORE_ADDR_MAX - 3, foo, 4)
731 doesn't need to work. Detect it and give up if there's an attempt
733 if (((memaddr - 1) + len) < memaddr) {
743 if ((startaddr % 16) != 0)
744 len_this_pass -= startaddr % 16;
745 if (len_this_pass > (len - count))
746 len_this_pass = (len - count);
748 printf ("\nDisplay %d bytes at %x\n", len_this_pass, startaddr);
750 for (i = 0; i < len_this_pass; i++)
752 printf_monitor (MEM_DIS_CMD, startaddr);
753 expect (sprintf(buf, MEM_PROMPT, startaddr), 1);
754 get_hex_byte (&myaddr[count++]);
756 printf ("\nRead a 0x%x from 0x%x\n", myaddr[count-1], startaddr);
760 printf_monitor (CMD_END);
769 /* FIXME-someday! merge these two. */
771 monitor_xfer_inferior_memory (memaddr, myaddr, len, write, target)
776 struct target_ops *target; /* ignored */
779 return monitor_write_inferior_memory (memaddr, myaddr, len);
781 return monitor_read_inferior_memory (memaddr, myaddr, len);
785 monitor_kill (args, from_tty)
789 return; /* ignore attempts to kill target system */
792 /* Clean up when a program exits.
793 The program actually lives on in the remote processor's RAM, and may be
794 run again without a download. Don't leave it full of breakpoint
798 monitor_mourn_inferior ()
800 remove_breakpoints ();
801 generic_mourn_inferior (); /* Do all the proper things now */
804 #define MAX_MONITOR_BREAKPOINTS 16
806 extern int memory_breakpoint_size;
807 static CORE_ADDR breakaddr[MAX_MONITOR_BREAKPOINTS] = {0};
810 monitor_insert_breakpoint (addr, shadow)
817 fprintf (log_file, "\nIn Insert_breakpoint (addr=%x)\n", addr);
819 for (i = 0; i <= MAX_MONITOR_BREAKPOINTS; i++)
820 if (breakaddr[i] == 0)
824 printf ("Breakpoint at %x\n", addr);
825 monitor_read_inferior_memory(addr, shadow, memory_breakpoint_size);
826 printf_monitor(SET_BREAK_CMD, addr);
831 fprintf(stderr, "Too many breakpoints (> 16) for monitor\n");
836 * _remove_breakpoint -- Tell the monitor to remove a breakpoint
839 monitor_remove_breakpoint (addr, shadow)
846 fprintf (log_file, "\nIn Remove_breakpoint (addr=%x)\n", addr);
848 for (i = 0; i < MAX_MONITOR_BREAKPOINTS; i++)
849 if (breakaddr[i] == addr)
852 /* some monitors remove breakpoints based on the address */
853 if (strcasecmp (target_shortname, "bug") == 0)
854 printf_monitor(CLR_BREAK_CMD, addr);
856 printf_monitor(CLR_BREAK_CMD, i);
861 fprintf(stderr, "Can't find breakpoint associated with 0x%x\n", addr);
865 /* Load a file. This is usually an srecord, which is ascii. No
866 protocol, just sent line by line. */
868 #define DOWNLOAD_LINE_SIZE 100
874 char buf[DOWNLOAD_LINE_SIZE];
878 printf ("Loading %s to monitor\n", arg);
880 download = fopen (arg, "r");
881 if (download == NULL)
883 error (sprintf (buf, "%s Does not exist", arg));
887 printf_monitor (LOAD_CMD);
888 /* expect ("Waiting for S-records from host... ", 1); */
890 while (!feof (download))
892 bytes_read = fread (buf, sizeof (char), DOWNLOAD_LINE_SIZE, download);
899 if (!serial_write(buf, bytes_read)) {
900 fprintf(stderr, "serial_write failed: (while downloading) %s\n", safe_strerror(errno));
904 while (i++ <=200000) {} ; /* Ugly HACK, probably needs flow control */
905 if (bytes_read < DOWNLOAD_LINE_SIZE)
907 if (!feof (download))
908 error ("Only read %d bytes\n", bytes_read);
917 if (!feof (download))
918 error ("Never got EOF while downloading");
922 /* Put a command string, in args, out to MONITOR. Output from MONITOR is placed
923 on the users terminal until the prompt is seen. */
926 monitor_command (args, fromtty)
931 fprintf (log_file, "\nIn command (args=%s)\n", args);
933 if (monitor_desc < 0)
934 error("monitor target not open.");
937 error("Missing command.");
939 printf_monitor("%s\r", args);
943 /* Connect the user directly to MONITOR. This command acts just like the
944 'cu' or 'tip' command. Use <CR>~. or <CR>~^D to break out. */
946 static struct ttystate ttystate;
950 { printf("\r\n[Exiting connect mode]\r\n");
951 serial_restore(0, &ttystate);
955 connect_command (args, fromtty)
966 if (monitor_desc < 0)
967 error("monitor target not open.");
970 fprintf("This command takes no args. They have been ignored.\n");
972 printf("[Entering connect mode. Use ~. or ~^D to escape]\n");
974 serial_raw(0, &ttystate);
976 make_cleanup(cleanup_tty, 0);
985 FD_SET(monitor_desc, &readfds);
986 numfds = select(sizeof(readfds)*8, &readfds, 0, 0, 0);
991 perror_with_name("select");
993 if (FD_ISSET(0, &readfds))
994 { /* tty input, send to monitor */
997 perror_with_name("connect");
999 printf_monitor("%c", c);
1013 if (c == '.' || c == '\004')
1020 if (FD_ISSET(monitor_desc, &readfds))
1035 * Define the monitor command strings. Since these are passed directly
1036 * through to a printf style function, we need can include formatting
1037 * strings. We also need a CR or LF on the end.
1039 struct monitor_ops rom68k_cmds = {
1040 "go \r", /* execute or usually GO command */
1041 "go \r", /* continue command */
1042 "st \r", /* single step */
1043 "db %x\r", /* set a breakpoint */
1044 "cb %x\r", /* clear a breakpoint */
1045 "pm %x\r", /* set memory to a value */
1046 "pm %x\r", /* display memory */
1047 "-%08X ", /* prompt memory commands use */
1048 "pr %s %x\r", /* set a register */
1049 ": ", /* delimiter between registers */
1050 "pr %s\r", /* read a register */
1051 "dc \r", /* download command */
1052 "ROM68K :->", /* monitor command prompt */
1053 "=", /* end-of-command delimitor */
1054 ".\r" /* optional command terminator */
1057 struct monitor_ops bug_cmds = {
1058 "go \r", /* execute or usually GO command */
1059 "go \r", /* continue command */
1060 "gn \r", /* single step */
1061 "br %x\r", /* set a breakpoint */
1062 "nobr %x\r", /* clear a breakpoint */
1063 "mm %x\r", /* set memory to a value */
1064 "mm %x\r", /* display memory */
1065 "%08X", /* prompt memory commands use */
1066 "rs %s %x\r", /* set a register */
1067 "=", /* delimiter between registers */
1068 "rm %s\r", /* read a register */
1069 "lo 0\r", /* download command */
1070 "Bug>", /* monitor command prompt */
1071 "? ", /* end-of-command delimitor */
1072 ".\r" /* optional command terminator */
1075 /* Define the target subroutine names */
1076 struct monitor_ops mon68_cmds = {
1077 "", /* execute or usually GO command */
1078 "", /* continue command */
1079 "", /* single step */
1080 "", /* set a breakpoint */
1081 "", /* clear a breakpoint */
1082 "", /* set memory to a value */
1083 "", /* display memory */
1084 "", /* set a register */
1085 "", /* delimiter between registers */
1086 "", /* read a register */
1087 "", /* download command */
1088 ">", /* monitor command prompt */
1089 "", /* end-of-command delimitor */
1090 "" /* optional command terminator */
1093 struct target_ops rom68k_ops = {
1095 "Integrated System's ROM68K remote debug monitor",
1096 "Use a remote computer running the ROM68K debug monitor, connected by a\n\
1097 serial line. Arguments are the name of the device for the serial line,\n\
1098 the speed to connect at in bits per second.",
1105 monitor_fetch_register,
1106 monitor_store_register,
1107 monitor_prepare_to_store,
1108 monitor_xfer_inferior_memory,
1110 monitor_insert_breakpoint,
1111 monitor_remove_breakpoint, /* Breakpoints */
1116 0, /* Terminal handling */
1118 monitor_load, /* load */
1119 0, /* lookup_symbol */
1120 monitor_create_inferior,
1121 monitor_mourn_inferior,
1123 0, /* notice_signals */
1130 1, /* all mem, mem, stack, regs, exec */
1132 0, /* Section pointers */
1133 OPS_MAGIC, /* Always the last thing */
1136 struct target_ops bug_ops = {
1138 "Motorola's BUG remote serial debug monitor",
1139 "Use a remote computer running Motorola's BUG debug monitor, connected by a\n\
1140 serial line. Arguments are the name of the device for the serial line,\n\
1141 the speed to connect at in bits per second.",
1148 monitor_fetch_register,
1149 monitor_store_register,
1150 monitor_prepare_to_store,
1151 monitor_xfer_inferior_memory,
1153 monitor_insert_breakpoint,
1154 monitor_remove_breakpoint, /* Breakpoints */
1159 0, /* Terminal handling */
1161 monitor_load, /* load */
1162 0, /* lookup_symbol */
1163 monitor_create_inferior,
1164 monitor_mourn_inferior,
1166 0, /* notice_signals */
1173 1, /* all mem, mem, stack, regs, exec */
1175 0, /* Section pointers */
1176 OPS_MAGIC, /* Always the last thing */
1179 struct target_ops mon68_ops = {
1181 "Intermetric's MON68 remote serial debug monitor",
1182 "Use a remote computer running the MON68 debug monitor, connected by a\n\
1183 serial line. Arguments are the name of the device for the serial line,\n\
1184 the speed to connect at in bits per second.",
1191 monitor_fetch_register,
1192 monitor_store_register,
1193 monitor_prepare_to_store,
1194 monitor_xfer_inferior_memory,
1196 monitor_insert_breakpoint,
1197 monitor_remove_breakpoint, /* Breakpoints */
1202 0, /* Terminal handling */
1204 monitor_load, /* load */
1205 0, /* lookup_symbol */
1206 monitor_create_inferior,
1207 monitor_mourn_inferior,
1209 0, /* notice_signals */
1216 1, /* all mem, mem, stack, regs, exec */
1218 0, /* Section pointers */
1219 OPS_MAGIC, /* Always the last thing */
1223 _initialize_remote_monitors ()
1226 add_set_cmd ("remotedebug", no_class, var_boolean,
1228 "Set debugging of I/O to a serial based Monitor.\n\
1229 When enabled, debugging info is displayed.",
1233 add_set_cmd ("hash", no_class, var_boolean,
1235 "Set display of activity while downloading a file.\n\
1236 When enabled, a period \'.\' is displayed.",
1240 /* generic monitor command */
1241 add_com ("monitor <command>", class_obscure, monitor_command,
1242 "Send a command to the debug monitor.");
1243 add_com ("connect", class_obscure, connect_command,
1244 "Connect the terminal directly up to a serial based command monitor.\n\
1245 Use <CR>~. or <CR>~^D to break out.");
1247 add_target (&rom68k_ops);
1248 /* add_target (&mon68_ops); */
1249 add_target (&bug_ops);