1 /* Remote debugging interface for boot monitors, for GDB.
2 Copyright 1990, 1991, 1992, 1993, 2001 Free Software Foundation, Inc.
4 This file is part of GDB.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, 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 a different situation--
26 having a PC running os9000 hook up with a unix machine with
27 a serial line, and running ctty com2 on the PC. os9000 has a debug
28 monitor called ROMBUG running. 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 'ROMBUG', which
33 We communicate with ROMBUG via a direct serial line, the network version
34 of ROMBUG is not available yet.
37 /* FIXME This file needs to be rewritten if it's to work again, either
38 to self-contained or to use the new monitor interface. */
43 #include "gdb_string.h"
44 #include <sys/types.h>
48 #include "remote-utils.h"
52 #include "gdb-stabs.h"
55 struct cmd_list_element *showlist;
56 extern struct target_ops rombug_ops; /* Forward declaration */
57 extern struct monitor_ops rombug_cmds; /* Forward declaration */
58 extern struct cmd_list_element *setlist;
59 extern struct cmd_list_element *unsetlist;
60 extern int attach_flag;
62 static void rombug_close ();
63 static void rombug_fetch_register ();
64 static void rombug_fetch_registers ();
65 static void rombug_store_register ();
67 static int sr_get_debug (); /* flag set by "set remotedebug" */
69 static int hashmark; /* flag set by "set hash" */
70 static int rombug_is_open = 0;
72 /* FIXME: Replace with sr_get_debug (). */
73 #define LOG_FILE "monitor.log"
75 static int monitor_log = 0;
76 static int tty_xon = 0;
77 static int tty_xoff = 0;
79 static int timeout = 10;
80 static int is_trace_mode = 0;
81 /* Descriptor for I/O to remote machine. Initialize it to NULL */
82 static serial_t monitor_desc = NULL;
84 static CORE_ADDR bufaddr = 0;
85 static int buflen = 0;
86 static char readbuf[16];
88 /* Send data to monitor. Works just like printf. */
90 printf_monitor (char *pattern,...)
96 va_start (args, pattern);
98 vsprintf (buf, pattern, args);
101 if (SERIAL_WRITE (monitor_desc, buf, strlen (buf)))
102 fprintf (stderr, "SERIAL_WRITE failed: %s\n", safe_strerror (errno));
105 /* Read a character from the remote system, doing all the fancy timeout stuff */
107 readchar (int timeout)
111 c = SERIAL_READCHAR (monitor_desc, timeout);
116 if (monitor_log && isascii (c))
117 putc (c & 0x7f, log_file);
122 if (c == SERIAL_TIMEOUT)
125 return c; /* Polls shouldn't generate timeout errors */
127 error ("Timeout reading from remote system.");
130 perror_with_name ("remote-monitor");
133 /* Scan input from the remote system, until STRING is found. If DISCARD is
134 non-zero, then discard non-matching input, else print it out.
135 Let the user break out immediately. */
137 expect (char *string, int discard)
143 printf ("Expecting \"%s\"\n", string);
148 c = readchar (timeout);
157 printf ("\nMatched\n");
165 fwrite (string, 1, (p - 1) - string, stdout);
174 /* Keep discarding input until we see the ROMBUG prompt.
176 The convention for dealing with the prompt is that you
178 o *then* wait for the prompt.
180 Thus the last thing that a procedure does with the serial line
181 will be an expect_prompt(). Exception: rombug_resume does not
182 wait for the prompt, because the terminal is being handed over
183 to the inferior. However, the next thing which happens after that
184 is a rombug_wait which does wait for the prompt.
185 Note that this includes abnormal exit, e.g. error(). This is
186 necessary to prevent getting into states from which we can't
189 expect_prompt (int discard)
192 /* This is a convenient place to do this. The idea is to do it often
193 enough that we never lose much data if we terminate abnormally. */
198 expect ("trace", discard);
202 expect (PROMPT, discard);
206 /* Get a hex digit from the remote system & return its value.
207 If ignore_space is nonzero, ignore spaces (not newline, tab, etc). */
209 get_hex_digit (int ignore_space)
214 ch = readchar (timeout);
215 if (ch >= '0' && ch <= '9')
217 else if (ch >= 'A' && ch <= 'F')
218 return ch - 'A' + 10;
219 else if (ch >= 'a' && ch <= 'f')
220 return ch - 'a' + 10;
221 else if (ch == ' ' && ignore_space)
226 error ("Invalid hex digit from remote system.");
231 /* Get a byte from monitor and put it in *BYT. Accept any number
234 get_hex_byte (char *byt)
238 val = get_hex_digit (1) << 4;
239 val |= get_hex_digit (0);
243 /* Get N 32-bit words from remote, each preceded by a space,
244 and put them in registers starting at REGNO. */
246 get_hex_regs (int n, int regno)
252 for (i = 0; i < n; i++)
257 for (j = 0; j < 4; j++)
260 if (TARGET_BYTE_ORDER == BIG_ENDIAN)
261 val = (val << 8) + b;
263 val = val + (b << (j * 8));
265 supply_register (regno++, (char *) &val);
269 /* This is called not only when we first attach, but also when the
270 user types "run" after having attached. */
272 rombug_create_inferior (char *execfile, char *args, char **env)
277 error ("Can't pass arguments to remote ROMBUG process");
279 if (execfile == 0 || exec_bfd == 0)
280 error ("No executable file specified");
282 entry_pt = (int) bfd_get_start_address (exec_bfd);
285 fputs ("\nIn Create_inferior()", log_file);
288 /* The "process" (board) is already stopped awaiting our commands, and
289 the program is already downloaded. We just set its PC and go. */
291 init_wait_for_inferior ();
292 proceed ((CORE_ADDR) entry_pt, TARGET_SIGNAL_DEFAULT, 0);
295 /* Open a connection to a remote debugger.
296 NAME is the filename used for communication. */
298 static char dev_name[100];
301 rombug_open (char *args, int from_tty)
304 error ("Use `target RomBug DEVICE-NAME' to use a serial port, or \n\
305 `target RomBug HOST-NAME:PORT-NUMBER' to use a network connection.");
307 target_preopen (from_tty);
310 unpush_target (&rombug_ops);
312 strcpy (dev_name, args);
313 monitor_desc = SERIAL_OPEN (dev_name);
314 if (monitor_desc == NULL)
315 perror_with_name (dev_name);
317 /* if baud rate is set by 'set remotebaud' */
318 if (SERIAL_SETBAUDRATE (monitor_desc, sr_get_baud_rate ()))
320 SERIAL_CLOSE (monitor_desc);
321 perror_with_name ("RomBug");
323 SERIAL_RAW (monitor_desc);
324 if (tty_xon || tty_xoff)
326 struct hardware_ttystate
332 tty_s = (struct hardware_ttystate *) SERIAL_GET_TTY_STATE (monitor_desc);
334 tty_s->t.c_iflag |= IXON;
336 tty_s->t.c_iflag |= IXOFF;
337 SERIAL_SET_TTY_STATE (monitor_desc, (serial_ttystate) tty_s);
342 log_file = fopen (LOG_FILE, "w");
343 if (log_file == NULL)
344 perror_with_name (LOG_FILE);
346 push_monitor (&rombug_cmds);
347 printf_monitor ("\r"); /* CR wakes up monitor */
349 push_target (&rombug_ops);
353 printf ("Remote %s connected to %s\n", target_shortname,
356 rombug_fetch_registers ();
358 printf_monitor ("ov e \r");
365 * Close out all files and local state before this target loses control.
369 rombug_close (int quitting)
373 SERIAL_CLOSE (monitor_desc);
380 if (ferror (log_file))
381 fprintf (stderr, "Error writing log file.\n");
382 if (fclose (log_file) != 0)
383 fprintf (stderr, "Error closing log file.\n");
389 rombug_link (char *mod_name, CORE_ADDR *text_reloc)
395 printf_monitor ("l %s \r", mod_name);
397 printf_monitor (".r \r");
398 expect (REG_DELIM, 1);
399 for (i = 0; i <= 7; i++)
402 for (j = 0; j < 4; j++)
405 val = (val << 8) + b;
413 /* Terminate the open connection to the remote debugger.
414 Use this when you want to detach and do something else
417 rombug_detach (int from_tty)
421 printf_monitor (GO_CMD);
424 pop_target (); /* calls rombug_close to do the real work */
426 printf ("Ending remote %s debugging\n", target_shortname);
430 * Tell the remote machine to resume.
433 rombug_resume (int pid, int step, enum target_signal sig)
436 fprintf (log_file, "\nIn Resume (step=%d, sig=%d)\n", step, sig);
441 printf_monitor (STEP_CMD);
442 /* wait for the echo. **
443 expect (STEP_CMD, 1);
448 printf_monitor (GO_CMD);
449 /* swallow the echo. **
458 * Wait until the remote machine stops, then return,
459 * storing status in status just as `wait' would.
463 rombug_wait (int pid, struct target_waitstatus *status)
465 int old_timeout = timeout;
466 struct section_offsets *offs;
468 struct obj_section *obj_sec;
471 fputs ("\nIn wait ()", log_file);
473 status->kind = TARGET_WAITKIND_EXITED;
474 status->value.integer = 0;
476 timeout = -1; /* Don't time out -- user program is running. */
477 expect ("eax:", 0); /* output any message before register display */
478 expect_prompt (1); /* Wait for prompt, outputting extraneous text */
480 status->kind = TARGET_WAITKIND_STOPPED;
481 status->value.sig = TARGET_SIGNAL_TRAP;
482 timeout = old_timeout;
483 rombug_fetch_registers ();
486 pc = read_register (PC_REGNUM);
487 addr = read_register (DATABASE_REG);
488 obj_sec = find_pc_section (pc);
491 if (obj_sec->objfile != symfile_objfile)
492 new_symfile_objfile (obj_sec->objfile, 1, 0);
493 offs = (struct section_offsets *) alloca (SIZEOF_SECTION_OFFSETS);
494 memcpy (offs, symfile_objfile->section_offsets, SIZEOF_SECTION_OFFSETS);
495 offs->offsets[SECT_OFF_DATA (symfile_objfile)] = addr;
496 offs->offsets[SECT_OFF_BSS (symfile_objfile)] = addr;
498 objfile_relocate (symfile_objfile, offs);
504 /* Return the name of register number regno in the form input and output by
505 monitor. Currently, register_names just happens to contain exactly what
506 monitor wants. Lets take advantage of that just as long as possible! */
509 get_reg_name (int regno)
520 for (p = REGISTER_NAME (regno); *p; p++)
524 p = (char *) REGISTER_NAME (regno);
531 /* read the remote registers into the block regs. */
534 rombug_fetch_registers (void)
540 printf_monitor (GET_REG);
551 for (regno = 8; regno <= 15; regno++)
553 expect (REG_DELIM, 1);
554 if (regno >= 8 && regno <= 13)
557 for (j = 0; j < 2; j++)
560 if (TARGET_BYTE_ORDER == BIG_ENDIAN)
561 val = (val << 8) + b;
563 val = val + (b << (j * 8));
568 if (regno >= 9 && regno <= 12)
572 supply_register (i, (char *) &val);
574 else if (regno == 14)
576 get_hex_regs (1, PC_REGNUM);
578 else if (regno == 15)
585 supply_register (regno, (char *) &val);
592 /* Fetch register REGNO, or all registers if REGNO is -1.
593 Returns errno value. */
595 rombug_fetch_register (int regno)
602 fprintf (log_file, "\nIn Fetch Register (reg=%s)\n", get_reg_name (regno));
608 rombug_fetch_registers ();
612 char *name = get_reg_name (regno);
613 printf_monitor (GET_REG);
614 if (regno >= 10 && regno <= 15)
619 expect (REG_DELIM, 1);
621 for (j = 0; j < 2; j++)
624 if (TARGET_BYTE_ORDER == BIG_ENDIAN)
625 val = (val << 8) + b;
627 val = val + (b << (j * 8));
629 supply_register (regno, (char *) &val);
631 else if (regno == 8 || regno == 9)
637 expect (REG_DELIM, 1);
638 get_hex_regs (1, regno);
643 expect (REG_DELIM, 1);
659 /* Store the remote registers from the contents of the block REGS. */
662 rombug_store_registers (void)
666 for (regno = 0; regno <= PC_REGNUM; regno++)
667 rombug_store_register (regno);
669 registers_changed ();
672 /* Store register REGNO, or all if REGNO == 0.
673 return errno value. */
675 rombug_store_register (int regno)
680 fprintf (log_file, "\nIn Store_register (regno=%d)\n", regno);
683 rombug_store_registers ();
687 printf ("Setting register %s to 0x%x\n", get_reg_name (regno), read_register (regno));
689 name = get_reg_name (regno);
692 printf_monitor (SET_REG, name, read_register (regno));
699 /* Get ready to modify the registers array. On machines which store
700 individual registers, this doesn't need to do anything. On machines
701 which store all the registers in one fell swoop, this makes sure
702 that registers contains all the registers from the program being
706 rombug_prepare_to_store (void)
708 /* Do nothing, since we can store individual regs */
712 rombug_files_info (void)
714 printf ("\tAttached to %s at %d baud.\n",
715 dev_name, sr_get_baud_rate ());
718 /* Copy LEN bytes of data from debugger memory at MYADDR
719 to inferior's memory at MEMADDR. Returns length moved. */
721 rombug_write_inferior_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len)
727 fprintf (log_file, "\nIn Write_inferior_memory (memaddr=%x, len=%d)\n", memaddr, len);
729 printf_monitor (MEM_SET_CMD, memaddr);
730 for (i = 0; i < len; i++)
732 expect (CMD_DELIM, 1);
733 printf_monitor ("%x \r", myaddr[i]);
735 printf ("\nSet 0x%x to 0x%x\n", memaddr + i, myaddr[i]);
737 expect (CMD_DELIM, 1);
739 printf_monitor (CMD_END);
748 /* Read LEN bytes from inferior memory at MEMADDR. Put the result
749 at debugger address MYADDR. Returns length moved. */
751 rombug_read_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len)
755 /* Number of bytes read so far. */
758 /* Starting address of this pass. */
759 unsigned long startaddr;
761 /* Number of bytes to read in this pass. */
765 fprintf (log_file, "\nIn Read_inferior_memory (memaddr=%x, len=%d)\n", memaddr, len);
767 /* Note that this code works correctly if startaddr is just less
768 than UINT_MAX (well, really CORE_ADDR_MAX if there was such a
769 thing). That is, something like
770 rombug_read_bytes (CORE_ADDR_MAX - 4, foo, 4)
771 works--it never adds len To memaddr and gets 0. */
772 /* However, something like
773 rombug_read_bytes (CORE_ADDR_MAX - 3, foo, 4)
774 doesn't need to work. Detect it and give up if there's an attempt
776 if (((memaddr - 1) + len) < memaddr)
781 if (bufaddr <= memaddr && (memaddr + len) <= (bufaddr + buflen))
783 memcpy (myaddr, &readbuf[memaddr - bufaddr], len);
792 if ((startaddr % 16) != 0)
793 len_this_pass -= startaddr % 16;
794 if (len_this_pass > (len - count))
795 len_this_pass = (len - count);
797 printf ("\nDisplay %d bytes at %x\n", len_this_pass, startaddr);
799 printf_monitor (MEM_DIS_CMD, startaddr, 8);
801 for (i = 0; i < 16; i++)
803 get_hex_byte (&readbuf[i]);
807 memcpy (&myaddr[count], readbuf, len_this_pass);
808 count += len_this_pass;
809 startaddr += len_this_pass;
810 expect (CMD_DELIM, 1);
813 printf_monitor (CMD_END);
820 /* Transfer LEN bytes between GDB address MYADDR and target address
821 MEMADDR. If WRITE is non-zero, transfer them to the target,
822 otherwise transfer them from the target. TARGET is unused.
824 Returns the number of bytes transferred. */
827 rombug_xfer_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len,
829 struct mem_attrib *attrib ATTRIBUTE_UNUSED,
830 struct target_ops *target ATTRIBUTE_UNUSED)
833 return rombug_write_inferior_memory (memaddr, myaddr, len);
835 return rombug_read_inferior_memory (memaddr, myaddr, len);
839 rombug_kill (char *args, int from_tty)
841 return; /* ignore attempts to kill target system */
844 /* Clean up when a program exits.
845 The program actually lives on in the remote processor's RAM, and may be
846 run again without a download. Don't leave it full of breakpoint
850 rombug_mourn_inferior (void)
852 remove_breakpoints ();
853 generic_mourn_inferior (); /* Do all the proper things now */
856 #define MAX_MONITOR_BREAKPOINTS 16
858 static CORE_ADDR breakaddr[MAX_MONITOR_BREAKPOINTS] =
862 rombug_insert_breakpoint (CORE_ADDR addr, char *shadow)
865 CORE_ADDR bp_addr = addr;
869 fprintf (log_file, "\nIn Insert_breakpoint (addr=%x)\n", addr);
870 BREAKPOINT_FROM_PC (&bp_addr, &bp_size);
872 for (i = 0; i <= MAX_MONITOR_BREAKPOINTS; i++)
873 if (breakaddr[i] == 0)
877 printf ("Breakpoint at %x\n", addr);
878 rombug_read_inferior_memory (bp_addr, shadow, bp_size);
879 printf_monitor (SET_BREAK_CMD, addr);
885 fprintf (stderr, "Too many breakpoints (> 16) for monitor\n");
890 * _remove_breakpoint -- Tell the monitor to remove a breakpoint
893 rombug_remove_breakpoint (CORE_ADDR addr, char *shadow)
898 fprintf (log_file, "\nIn Remove_breakpoint (addr=%x)\n", addr);
900 for (i = 0; i < MAX_MONITOR_BREAKPOINTS; i++)
901 if (breakaddr[i] == addr)
904 printf_monitor (CLR_BREAK_CMD, addr);
910 fprintf (stderr, "Can't find breakpoint associated with 0x%x\n", addr);
914 /* Load a file. This is usually an srecord, which is ascii. No
915 protocol, just sent line by line. */
917 #define DOWNLOAD_LINE_SIZE 100
919 rombug_load (char *arg)
921 /* this part comment out for os9* */
924 char buf[DOWNLOAD_LINE_SIZE];
928 printf ("Loading %s to monitor\n", arg);
930 download = fopen (arg, "r");
931 if (download == NULL)
933 error (sprintf (buf, "%s Does not exist", arg));
937 printf_monitor (LOAD_CMD);
938 /* expect ("Waiting for S-records from host... ", 1); */
940 while (!feof (download))
942 bytes_read = fread (buf, sizeof (char), DOWNLOAD_LINE_SIZE, download);
949 if (SERIAL_WRITE (monitor_desc, buf, bytes_read))
951 fprintf (stderr, "SERIAL_WRITE failed: (while downloading) %s\n", safe_strerror (errno));
955 while (i++ <= 200000)
957 }; /* Ugly HACK, probably needs flow control */
958 if (bytes_read < DOWNLOAD_LINE_SIZE)
960 if (!feof (download))
961 error ("Only read %d bytes\n", bytes_read);
970 if (!feof (download))
971 error ("Never got EOF while downloading");
976 /* Put a command string, in args, out to MONITOR.
977 Output from MONITOR is placed on the users terminal until the prompt
981 rombug_command (char *args, int fromtty)
983 if (monitor_desc == NULL)
984 error ("monitor target not open.");
987 fprintf (log_file, "\nIn command (args=%s)\n", args);
990 error ("Missing command.");
992 printf_monitor ("%s\r", args);
997 /* Connect the user directly to MONITOR. This command acts just like the
998 'cu' or 'tip' command. Use <CR>~. or <CR>~^D to break out. */
1000 static struct ttystate ttystate;
1005 printf ("\r\n[Exiting connect mode]\r\n");
1006 /*SERIAL_RESTORE(0, &ttystate); */
1010 connect_command (char *args, int fromtty)
1019 if (monitor_desc == NULL)
1020 error ("monitor target not open.");
1023 fprintf ("This command takes no args. They have been ignored.\n");
1025 printf ("[Entering connect mode. Use ~. or ~^D to escape]\n");
1027 serial_raw (0, &ttystate);
1029 make_cleanup (cleanup_tty, 0);
1037 FD_SET (0, &readfds);
1038 FD_SET (DEPRECATED_SERIAL_FD (monitor_desc), &readfds);
1039 numfds = select (sizeof (readfds) * 8, &readfds, 0, 0, 0);
1041 while (numfds == 0);
1044 perror_with_name ("select");
1046 if (FD_ISSET (0, &readfds))
1047 { /* tty input, send to monitor */
1050 perror_with_name ("connect");
1052 printf_monitor ("%c", c);
1066 if (c == '.' || c == '\004')
1073 if (FD_ISSET (DEPRECATED_SERIAL_FD (monitor_desc), &readfds))
1089 * Define the monitor command strings. Since these are passed directly
1090 * through to a printf style function, we need can include formatting
1091 * strings. We also need a CR or LF on the end.
1093 #warning FIXME: monitor interface pattern strings, stale struct decl
1094 struct monitor_ops rombug_cmds =
1096 "g \r", /* execute or usually GO command */
1097 "g \r", /* continue command */
1098 "t \r", /* single step */
1099 "b %x\r", /* set a breakpoint */
1100 "k %x\r", /* clear a breakpoint */
1101 "c %x\r", /* set memory to a value */
1102 "d %x %d\r", /* display memory */
1103 "$%08X", /* prompt memory commands use */
1104 ".%s %x\r", /* set a register */
1105 ":", /* delimiter between registers */
1106 ". \r", /* read a register */
1107 "mf \r", /* download command */
1108 "RomBug: ", /* monitor command prompt */
1109 ": ", /* end-of-command delimitor */
1110 ".\r" /* optional command terminator */
1113 struct target_ops rombug_ops;
1116 init_rombug_ops (void)
1118 rombug_ops.to_shortname = "rombug";
1119 rombug_ops.to_longname = "Microware's ROMBUG debug monitor";
1120 rombug_ops.to_doc = "Use a remote computer running the ROMBUG debug monitor.\n\
1121 Specify the serial device it is connected to (e.g. /dev/ttya).",
1122 rombug_ops.to_open = rombug_open;
1123 rombug_ops.to_close = rombug_close;
1124 rombug_ops.to_attach = 0;
1125 rombug_ops.to_post_attach = NULL;
1126 rombug_ops.to_require_attach = NULL;
1127 rombug_ops.to_detach = rombug_detach;
1128 rombug_ops.to_require_detach = NULL;
1129 rombug_ops.to_resume = rombug_resume;
1130 rombug_ops.to_wait = rombug_wait;
1131 rombug_ops.to_post_wait = NULL;
1132 rombug_ops.to_fetch_registers = rombug_fetch_register;
1133 rombug_ops.to_store_registers = rombug_store_register;
1134 rombug_ops.to_prepare_to_store = rombug_prepare_to_store;
1135 rombug_ops.to_xfer_memory = rombug_xfer_inferior_memory;
1136 rombug_ops.to_files_info = rombug_files_info;
1137 rombug_ops.to_insert_breakpoint = rombug_insert_breakpoint;
1138 rombug_ops.to_remove_breakpoint = rombug_remove_breakpoint; /* Breakpoints */
1139 rombug_ops.to_terminal_init = 0;
1140 rombug_ops.to_terminal_inferior = 0;
1141 rombug_ops.to_terminal_ours_for_output = 0;
1142 rombug_ops.to_terminal_ours = 0;
1143 rombug_ops.to_terminal_info = 0; /* Terminal handling */
1144 rombug_ops.to_kill = rombug_kill;
1145 rombug_ops.to_load = rombug_load; /* load */
1146 rombug_ops.to_lookup_symbol = rombug_link; /* lookup_symbol */
1147 rombug_ops.to_create_inferior = rombug_create_inferior;
1148 rombug_ops.to_post_startup_inferior = NULL;
1149 rombug_ops.to_acknowledge_created_inferior = NULL;
1150 rombug_ops.to_clone_and_follow_inferior = NULL;
1151 rombug_ops.to_post_follow_inferior_by_clone = NULL;
1152 rombug_ops.to_insert_fork_catchpoint = NULL;
1153 rombug_ops.to_remove_fork_catchpoint = NULL;
1154 rombug_ops.to_insert_vfork_catchpoint = NULL;
1155 rombug_ops.to_remove_vfork_catchpoint = NULL;
1156 rombug_ops.to_has_forked = NULL;
1157 rombug_ops.to_has_vforked = NULL;
1158 rombug_ops.to_can_follow_vfork_prior_to_exec = NULL;
1159 rombug_ops.to_post_follow_vfork = NULL;
1160 rombug_ops.to_insert_exec_catchpoint = NULL;
1161 rombug_ops.to_remove_exec_catchpoint = NULL;
1162 rombug_ops.to_has_execd = NULL;
1163 rombug_ops.to_reported_exec_events_per_exec_call = NULL;
1164 rombug_ops.to_has_exited = NULL;
1165 rombug_ops.to_mourn_inferior = rombug_mourn_inferior;
1166 rombug_ops.to_can_run = 0; /* can_run */
1167 rombug_ops.to_notice_signals = 0; /* notice_signals */
1168 rombug_ops.to_thread_alive = 0;
1169 rombug_ops.to_stop = 0; /* to_stop */
1170 rombug_ops.to_pid_to_exec_file = NULL;
1171 rombug_ops.to_core_file_to_sym_file = NULL;
1172 rombug_ops.to_stratum = process_stratum;
1173 rombug_ops.DONT_USE = 0; /* next */
1174 rombug_ops.to_has_all_memory = 1;
1175 rombug_ops.to_has_memory = 1;
1176 rombug_ops.to_has_stack = 1;
1177 rombug_ops.to_has_registers = 1;
1178 rombug_ops.to_has_execution = 1; /* has execution */
1179 rombug_ops.to_sections = 0;
1180 rombug_ops.to_sections_end = 0; /* Section pointers */
1181 rombug_ops.to_magic = OPS_MAGIC; /* Always the last thing */
1185 _initialize_remote_os9k (void)
1188 add_target (&rombug_ops);
1191 add_set_cmd ("hash", no_class, var_boolean, (char *) &hashmark,
1192 "Set display of activity while downloading a file.\nWhen enabled, a period \'.\' is displayed.",
1197 add_set_cmd ("timeout", no_class, var_zinteger,
1199 "Set timeout in seconds for remote MIPS serial I/O.",
1204 add_set_cmd ("remotelog", no_class, var_zinteger,
1205 (char *) &monitor_log,
1206 "Set monitor activity log on(=1) or off(=0).",
1211 add_set_cmd ("remotexon", no_class, var_zinteger,
1213 "Set remote tty line XON control",
1218 add_set_cmd ("remotexoff", no_class, var_zinteger,
1220 "Set remote tty line XOFF control",
1224 add_com ("rombug <command>", class_obscure, rombug_command,
1225 "Send a command to the debug monitor.");
1227 add_com ("connect", class_obscure, connect_command,
1228 "Connect the terminal directly up to a serial based command monitor.\nUse <CR>~. or <CR>~^D to break out.");