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 various remote-* modules. It is a collection
22 of generic support functions so GDB can talk directly to a ROM based
23 monitor. This saves use from having to hack an exception based handler
24 into existance, and makes for quick porting.
26 This module talks to a debug monitor called 'MONITOR', which
27 We communicate with MONITOR via either a direct serial line, or a TCP
28 (or possibly TELNET) stream to a terminal multiplexor,
29 which in turn talks to the target board.
39 #include <sys/types.h>
43 #include "remote-utils.h"
46 # define TERMINAL struct termios
48 # define TERMINAL struct sgttyb
51 struct monitor_ops *current_monitor;
52 extern struct cmd_list_element *setlist;
53 extern struct cmd_list_element *unsetlist;
54 struct cmd_list_element *showlist;
56 static int hashmark; /* flag set by "set hash" */
58 /* FIXME: Replace with sr_get_debug (). */
59 #define LOG_FILE "monitor.log"
60 #if defined (LOG_FILE)
64 static int timeout = 24;
66 /* Descriptor for I/O to remote machine. Initialize it to NULL so that
67 monitor_open knows that we don't have a file open when the program starts.
69 static serial_t monitor_desc = NULL;
71 /* sets the download protocol, choices are srec, generic, boot */
73 static char *loadtype_str;
74 static void set_loadtype_command();
77 * set_loadtype_command -- set the type for downloading. Check to make
78 * sure you have a support protocol for this target.
81 set_loadtype_command (ignore, from_tty, c)
84 struct cmd_list_element *c;
88 if (strcmp (LOADTYPES, "")) {
89 error ("No loadtype set");
93 type = strtok(LOADTYPES, ",");
94 if (STREQ (type, (*(char **) c->var))) {
95 loadtype_str = savestring (*(char **) c->var, strlen (*(char **) c->var));
99 while (type = strtok (NULL, ",") != (char *)NULL)
100 if (STREQ (type, (*(char **) c->var)))
101 loadtype_str = savestring (*(char **) c->var, strlen (*(char **) c->var));
103 loadtype_str = savestring (*(char **) c->var, strlen (*(char **) c->var));
107 * printf_monitor -- send data to monitor. Works just like printf.
110 printf_monitor(va_alist)
120 pattern = va_arg(args, char *);
122 vsprintf(buf, pattern, args);
124 debuglogs (1, "printf_monitor(), Sending: \"%s\".", buf);
126 if (SERIAL_WRITE(monitor_desc, buf, strlen(buf)))
127 fprintf(stderr, "SERIAL_WRITE failed: %s\n", safe_strerror(errno));
131 * debuglogs -- deal with debugging info to multiple sources. This takes
132 * two real args, the first one is the level to be compared against
133 * the sr_get_debug() value, the second arg is a printf buffer and args
134 * to be formatted and printed. A CR is added after each string is printed.
148 level = va_arg(args, int); /* get the debug level */
149 if ((level <0) || (level > 100)) {
150 error ("Bad argument passed to debuglogs()");
154 pattern = va_arg(args, char *); /* get the printf style pattern */
156 vsprintf(buf, pattern, args); /* format the string */
158 /* convert some characters so it'll look right in the log */
160 for (i=0 ; buf[i] != '\0'; i++) {
162 case '\n': /* newlines */
166 case '\r': /* carriage returns */
170 case '\033': /* escape */
178 case '\b': /* backspace */
182 default: /* no change */
186 if (buf[i] < 26) { /* modify control characters */
192 *p = '\0'; /* terminate the string */
194 if (sr_get_debug() > level)
197 #ifdef LOG_FILE /* write to the monitor log */
198 if (log_file != 0x0) {
199 fputs (newbuf, log_file);
200 fputc ('\n', log_file);
206 /* readchar -- read a character from the remote system, doing all the fancy
215 c = SERIAL_READCHAR(monitor_desc, timeout);
217 if (sr_get_debug() > 4)
222 putc(c & 0x7f, log_file);
228 if (c == SERIAL_TIMEOUT) {
230 return c; /* Polls shouldn't generate timeout errors */
231 error("Timeout reading from remote system.");
233 fputc ("ERROR: Timeout reading from remote system", log_file);
236 perror_with_name("remote-monitor");
240 * expect -- scan input from the remote system, until STRING is found.
241 * If DISCARD is non-zero, then discard non-matching input, else print
242 * it out. Let the user break out immediately.
245 expect (string, discard)
253 debuglogs (1, "Expecting \"%s\".", string);
257 c = readchar(timeout);
263 debuglogs (4, "Matched");
268 fwrite(string, 1, (p - 1) - string, stdout);
277 /* Keep discarding input until we see the MONITOR prompt.
279 The convention for dealing with the prompt is that you
281 o *then* wait for the prompt.
283 Thus the last thing that a procedure does with the serial line
284 will be an expect_prompt(). Exception: monitor_resume does not
285 wait for the prompt, because the terminal is being handed over
286 to the inferior. However, the next thing which happens after that
287 is a monitor_wait which does wait for the prompt.
288 Note that this includes abnormal exit, e.g. error(). This is
289 necessary to prevent getting into states from which we can't
292 expect_prompt(discard)
295 #if defined (LOG_FILE)
296 /* This is a convenient place to do this. The idea is to do it often
297 enough that we never lose much data if we terminate abnormally. */
300 expect (PROMPT, discard);
304 * junk -- ignore junk characters. Returns a 1 if junk, 0 otherwise
316 if (sr_get_debug() > 5)
317 debuglogs (5, "Ignoring \'%c\'.", ch);
320 if (sr_get_debug() > 5)
321 debuglogs (5, "Accepting \'%c\'.", ch);
327 * get_hex_digit -- Get a hex digit from the remote system & return its value.
328 * If ignore is nonzero, ignore spaces, newline & tabs.
331 get_hex_digit(ignore)
336 ch = readchar(timeout);
339 if (sr_get_debug() > 4)
340 debuglogs (4, "get_hex_digit() got a 0x%x(%c)", ch, ch);
342 if (ch >= '0' && ch <= '9')
344 else if (ch >= 'A' && ch <= 'F')
345 return ch - 'A' + 10;
346 else if (ch >= 'a' && ch <= 'f')
347 return ch - 'a' + 10;
348 else if (ch == ' ' && ignore)
352 error("Invalid hex digit from remote system.");
357 /* get_hex_byte -- Get a byte from monitor and put it in *BYT.
358 * Accept any number leading spaces.
366 val = get_hex_digit (1) << 4;
367 debuglogs (4, "get_hex_digit() -- Read first nibble 0x%x", val);
369 val |= get_hex_digit (0);
370 debuglogs (4, "get_hex_digit() -- Read second nibble 0x%x", val);
373 debuglogs (4, "get_hex_digit() -- Read a 0x%x", val);
377 * get_hex_word -- Get N 32-bit words from remote, each preceded by a space,
378 * and put them in registers starting at REGNO.
387 for (i = 0; i < 8; i++)
388 val = (val << 4) + get_hex_digit (i == 0);
390 debuglogs (4, "get_hex_word() got a 0x%x.", val);
395 /* This is called not only when we first attach, but also when the
396 user types "run" after having attached. */
398 monitor_create_inferior (execfile, args, env)
406 error("Can't pass arguments to remote MONITOR process");
408 if (execfile == 0 || exec_bfd == 0)
409 error("No exec file specified");
411 entry_pt = (int) bfd_get_start_address (exec_bfd);
413 debuglogs (1, "create_inferior(exexfile=%s, args=%s, env=%s)", execfile, args, env);
415 /* The "process" (board) is already stopped awaiting our commands, and
416 the program is already downloaded. We just set its PC and go. */
418 clear_proceed_status ();
420 /* Tell wait_for_inferior that we've started a new process. */
421 init_wait_for_inferior ();
423 /* Set up the "saved terminal modes" of the inferior
424 based on what modes we are starting it with. */
425 target_terminal_init ();
427 /* Install inferior's terminal modes. */
428 target_terminal_inferior ();
430 /* insert_step_breakpoint (); FIXME, do we need this? */
433 proceed ((CORE_ADDR)entry_pt, TARGET_SIGNAL_DEFAULT, 0);
437 * monitor_open -- open a connection to a remote debugger.
438 * NAME is the filename used for communication.
440 static int baudrate = 9600;
441 static char dev_name[100];
444 monitor_open(args, name, from_tty)
451 error ("Use `target %s DEVICE-NAME' to use a serial port, or \n\
452 `target %s HOST-NAME:PORT-NUMBER' to use a network connection.", name, name);
457 strcpy(dev_name, args);
458 monitor_desc = SERIAL_OPEN(dev_name);
460 if (monitor_desc == NULL)
461 perror_with_name(dev_name);
463 if (baud_rate != -1) {
464 if (SERIAL_SETBAUDRATE (monitor_desc, baud_rate)) {
465 SERIAL_CLOSE (monitor_desc);
466 perror_with_name (name);
470 SERIAL_RAW(monitor_desc);
472 #if defined (LOG_FILE)
473 log_file = fopen (LOG_FILE, "w");
474 if (log_file == NULL)
475 perror_with_name (LOG_FILE);
478 /* wake up the monitor and see if it's alive */
479 printf_monitor(INIT_CMD);
480 expect_prompt(1); /* See if we get a prompt */
482 /* try again to be sure */
483 printf_monitor(INIT_CMD);
484 expect_prompt(1); /* See if we get a prompt */
487 printf("Remote target %s connected to %s\n", TARGET_NAME, dev_name);
491 * monitor_close -- Close out all files and local state before this
492 * target loses control.
496 monitor_close (quitting)
499 SERIAL_CLOSE(monitor_desc);
502 debuglogs (1, "monitor_close (quitting=%d)", quitting);
504 #if defined (LOG_FILE)
506 if (ferror(log_file))
507 fprintf(stderr, "Error writing log file.\n");
508 if (fclose(log_file) != 0)
509 fprintf(stderr, "Error closing log file.\n");
515 * monitor_detach -- terminate the open connection to the remote
516 * debugger. Use this when you want to detach and do something
517 * else with your gdb.
520 monitor_detach (from_tty)
524 debuglogs (1, "monitor_detach ()");
526 pop_target(); /* calls monitor_close to do the real work */
528 printf ("Ending remote %s debugging\n", target_shortname);
532 * monitor_attach -- attach GDB to the target.
535 monitor_attach (args, from_tty)
540 printf ("Starting remote %s debugging\n", target_shortname);
542 debuglogs (1, "monitor_attach (args=%s)", args);
544 printf_monitor (GO_CMD);
545 /* swallow the echo. */
550 * monitor_resume -- Tell the remote machine to resume.
553 monitor_resume (pid, step, sig)
555 enum target_signal sig;
557 debuglogs (1, "monitor_resume (step=%d, sig=%d)", step, sig);
560 printf_monitor (STEP_CMD);
562 printf_monitor (CONT_CMD);
567 * monitor_wait -- Wait until the remote machine stops, then return,
568 * storing status in status just as `wait' would.
571 monitor_wait (pid, status)
573 struct target_waitstatus *status;
575 int old_timeout = timeout;
577 debuglogs(1, "monitor_wait (), printing extraneous text.");
579 status->kind = TARGET_WAITKIND_EXITED;
580 status->value.integer = 0;
582 timeout = 0; /* Don't time out -- user program is running. */
584 expect_prompt(0); /* Wait for prompt, outputting extraneous text */
585 debuglogs (4, "monitor_wait(), got the prompt.");
587 status->kind = TARGET_WAITKIND_STOPPED;
588 status->value.sig = TARGET_SIGNAL_TRAP;
590 timeout = old_timeout;
595 /* Return the name of register number regno in the form input and output by
596 monitor. Currently, register_names just happens to contain exactly what
597 monitor wants. Lets take advantage of that just as long as possible! */
612 for (p = REGNAMES(regno); *p; p++)
617 debuglogs (5, "Got name \"%s\" from regno #%d.", buf, regno);
623 * monitor_fetch_registers -- read the remote registers into the
627 monitor_fetch_registers ()
631 /* yeah yeah, i know this is horribly inefficient. but it isn't done
632 very often... i'll clean it up later. */
634 for (regno = 0; regno <= PC_REGNUM; regno++)
635 monitor_fetch_register(regno);
639 * monitor_fetch_register -- fetch register REGNO, or all registers if REGNO
640 * is -1. Returns errno value.
643 monitor_fetch_register (regno)
648 debuglogs (1, "monitor_fetch_register (reg=%s)", get_reg_name (regno));
651 monitor_fetch_registers ();
653 char *name = get_reg_name (regno);
656 printf_monitor (ROMCMD(GET_REG), name); /* send the command */
657 expect (name, 1); /* then strip the leading garbage */
658 if (*ROMDELIM(GET_REG) != 0) { /* if there's a delimiter */
659 expect (ROMDELIM(GET_REG), 1);
662 val = get_hex_word(); /* get the value, ignore junk */
663 supply_register (regno, (char *) &val);
665 if (*ROMDELIM(GET_REG) != 0) {
666 /*** expect (ROMRES(GET_REG)); ***/
667 printf_monitor (CMD_END);
674 /* Store the remote registers from the contents of the block REGS. */
677 monitor_store_registers ()
681 debuglogs (1, "monitor_store_registers()");
683 for (regno = 0; regno <= PC_REGNUM; regno++)
684 monitor_store_register(regno);
686 registers_changed ();
690 * monitor_store_register -- store register REGNO, or all if REGNO == 0.
691 * return errno value.
694 monitor_store_register (regno)
700 i = read_register(regno);
702 debuglogs (1, "monitor_store_register (regno=%d)", regno);
705 monitor_store_registers ();
707 debuglogs (3, "Setting register %s to 0x%x", get_reg_name (regno), read_register (regno));
709 name = get_reg_name (regno);
712 printf_monitor (ROMCMD(SET_REG), name, read_register(regno));
713 expect (name, 1); /* strip the leading garbage */
714 if (*ROMDELIM(SET_REG) != 0) { /* if there's a delimiter */
715 expect (ROMDELIM(SET_REG), 1);
717 printf_monitor ("%d%s\n", i, CMD_END);
724 printf_monitor (SET_REG, get_reg_name (regno),
725 read_register (regno));
731 /* Get ready to modify the registers array. On machines which store
732 individual registers, this doesn't need to do anything. On machines
733 which store all the registers in one fell swoop, this makes sure
734 that registers contains all the registers from the program being
738 monitor_prepare_to_store ()
740 /* Do nothing, since we can store individual regs */
744 monitor_files_info ()
746 printf ("\tAttached to %s at %d baud.\n",
751 * monitor_write_inferior_memory -- Copy LEN bytes of data from debugger
752 * memory at MYADDR to inferior's memory at MEMADDR. Returns length moved.
755 monitor_write_inferior_memory (memaddr, myaddr, len)
757 unsigned char *myaddr;
763 debuglogs (1, "monitor_write_inferior_memory (memaddr=0x%x, myaddr=0x%x, len=%d)", memaddr, myaddr, len);
765 for (i = 0; i < len; i++) {
766 printf_monitor (ROMCMD(SET_MEM), memaddr + i, myaddr[i] );
767 if (*ROMDELIM(SET_MEM) != 0) { /* if there's a delimiter */
768 expect (ROMDELIM(SET_MEM), 1);
770 printf_monitor ("%x", myaddr[i]);
772 /*** printf_monitor ("%x", myaddr[i]); ***/
773 if (sr_get_debug() > 1)
774 printf ("\nSet 0x%x to 0x%x\n", memaddr + i, myaddr[i]);
775 if (*ROMDELIM(SET_MEM) != 0) {
777 printf_monitor (CMD_END);
785 * monitor_read_inferior_memory -- read LEN bytes from inferior memory
786 * at MEMADDR. Put the result at debugger address MYADDR. Returns
790 monitor_read_inferior_memory(memaddr, myaddr, len)
798 /* Number of bytes read so far. */
801 /* Starting address of this pass. */
802 unsigned long startaddr;
804 /* Number of bytes to read in this pass. */
807 debuglogs (1, "monitor_read_inferior_memory (memaddr=0x%x, myaddr=0x%x, len=%d)", memaddr, myaddr, len);
809 /* Note that this code works correctly if startaddr is just less
810 than UINT_MAX (well, really CORE_ADDR_MAX if there was such a
811 thing). That is, something like
812 monitor_read_bytes (CORE_ADDR_MAX - 4, foo, 4)
813 works--it never adds len To memaddr and gets 0. */
814 /* However, something like
815 monitor_read_bytes (CORE_ADDR_MAX - 3, foo, 4)
816 doesn't need to work. Detect it and give up if there's an attempt
818 if (((memaddr - 1) + len) < memaddr) {
825 while (count < len) {
827 if ((startaddr % 16) != 0)
828 len_this_pass -= startaddr % 16;
829 if (len_this_pass > (len - count))
830 len_this_pass = (len - count);
832 debuglogs (3, "Display %d bytes at %x", len_this_pass, startaddr);
834 for (i = 0; i < len_this_pass; i++) {
835 printf_monitor (ROMCMD(GET_MEM), startaddr, startaddr);
836 sprintf (buf, ROMCMD(GET_MEM), startaddr, startaddr);
837 if (*ROMDELIM(GET_MEM) != 0) { /* if there's a delimiter */
838 expect (ROMDELIM(GET_MEM), 1);
840 sprintf (buf, ROMCMD(GET_MEM), startaddr, startaddr);
841 expect (buf,1); /* get the command echo */
842 get_hex_word(1); /* strip away the address */
844 get_hex_byte (&myaddr[count++]); /* get the value at this address */
846 if (*ROMDELIM(GET_MEM) != 0) {
847 printf_monitor (CMD_END);
856 /* FIXME-someday! merge these two. */
858 monitor_xfer_inferior_memory (memaddr, myaddr, len, write, target)
863 struct target_ops *target; /* ignored */
866 return monitor_write_inferior_memory (memaddr, myaddr, len);
868 return monitor_read_inferior_memory (memaddr, myaddr, len);
872 monitor_kill (args, from_tty)
876 return; /* ignore attempts to kill target system */
879 /* Clean up when a program exits.
880 The program actually lives on in the remote processor's RAM, and may be
881 run again without a download. Don't leave it full of breakpoint
885 monitor_mourn_inferior ()
887 remove_breakpoints ();
888 generic_mourn_inferior (); /* Do all the proper things now */
891 #define MAX_MONITOR_BREAKPOINTS 16
893 extern int memory_breakpoint_size;
894 static CORE_ADDR breakaddr[MAX_MONITOR_BREAKPOINTS] = {0};
897 * monitor_insert_breakpoint -- add a breakpoint
900 monitor_insert_breakpoint (addr, shadow)
906 debuglogs (1, "monitor_insert_breakpoint() addr = 0x%x", addr);
908 for (i = 0; i <= MAX_MONITOR_BREAKPOINTS; i++) {
909 if (breakaddr[i] == 0) {
911 if (sr_get_debug() > 4)
912 printf ("Breakpoint at %x\n", addr);
913 monitor_read_inferior_memory(addr, shadow, memory_breakpoint_size);
914 printf_monitor(SET_BREAK_CMD, addr);
920 fprintf(stderr, "Too many breakpoints (> 16) for monitor\n");
925 * _remove_breakpoint -- Tell the monitor to remove a breakpoint
928 monitor_remove_breakpoint (addr, shadow)
934 debuglogs (1, "monitor_remove_breakpoint() addr = 0x%x", addr);
936 for (i = 0; i < MAX_MONITOR_BREAKPOINTS; i++) {
937 if (breakaddr[i] == addr) {
939 /* some monitors remove breakpoints based on the address */
941 printf_monitor(CLR_BREAK_CMD, addr);
943 printf_monitor(CLR_BREAK_CMD, i);
948 fprintf(stderr, "Can't find breakpoint associated with 0x%x\n", addr);
952 /* Load a file. This is usually an srecord, which is ascii. No
953 protocol, just sent line by line. */
955 #define DOWNLOAD_LINE_SIZE 100
961 char buf[DOWNLOAD_LINE_SIZE];
965 printf ("Loading %s to monitor\n", arg);
967 download = fopen (arg, "r");
968 if (download == NULL)
970 error (sprintf (buf, "%s Does not exist", arg));
974 printf_monitor (LOAD_CMD);
975 /* expect ("Waiting for S-records from host... ", 1); */
977 while (!feof (download))
979 bytes_read = fread (buf, sizeof (char), DOWNLOAD_LINE_SIZE, download);
986 if (SERIAL_WRITE(monitor_desc, buf, bytes_read)) {
987 fprintf(stderr, "SERIAL_WRITE failed: (while downloading) %s\n", safe_strerror(errno));
991 while (i++ <=200000) {} ; /* Ugly HACK, probably needs flow control */
992 if (bytes_read < DOWNLOAD_LINE_SIZE)
994 if (!feof (download))
995 error ("Only read %d bytes\n", bytes_read);
1004 if (!feof (download))
1005 error ("Never got EOF while downloading");
1010 * monitor_command -- put a command string, in args, out to MONITOR.
1011 * Output from MONITOR is placed on the users terminal until the
1012 * prompt is seen. FIXME: We read the charcters ourseleves here
1013 * cause of a nasty echo.
1016 monitor_command (args, fromtty)
1025 debuglogs (1, "monitor_command (args=%s)", args);
1027 if (monitor_desc == NULL)
1028 error("monitor target not open.");
1031 error("Missing command.");
1033 printf_monitor ("%s\n", args);
1039 * _initialize_remote_monitors -- setup a few addtitional commands that
1040 * are usually only used by monitors.
1043 _initialize_remote_monitors ()
1045 struct cmd_list_element *c;
1047 /* this sets the type of download protocol */
1048 c = add_set_cmd ("loadtype", no_class, var_string, (char *)&loadtype_str,
1049 "Set the type of the remote load protocol.\n", &setlist);
1050 c->function.sfunc = set_loadtype_command;
1051 add_show_from_set (c, &showlist);
1052 loadtype_str = savestring ("generic", 8);
1054 add_show_from_set (add_set_cmd ("hash", no_class, var_boolean,
1056 "Set display of activity while downloading a file.\n\
1057 When enabled, a period \'.\' is displayed.",
1061 /* generic monitor command */
1062 add_com ("monitor", class_obscure, monitor_command,
1063 "Send a command to the debug monitor.");