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 perror_with_name("remote-monitor");
237 * expect -- scan input from the remote system, until STRING is found.
238 * If DISCARD is non-zero, then discard non-matching input, else print
239 * it out. Let the user break out immediately.
242 expect (string, discard)
250 debuglogs (1, "Expecting \"%s\".", string);
254 c = readchar(timeout);
261 printf ("\nMatched\n");
266 fwrite(string, 1, (p - 1) - string, stdout);
275 /* Keep discarding input until we see the MONITOR prompt.
277 The convention for dealing with the prompt is that you
279 o *then* wait for the prompt.
281 Thus the last thing that a procedure does with the serial line
282 will be an expect_prompt(). Exception: monitor_resume does not
283 wait for the prompt, because the terminal is being handed over
284 to the inferior. However, the next thing which happens after that
285 is a monitor_wait which does wait for the prompt.
286 Note that this includes abnormal exit, e.g. error(). This is
287 necessary to prevent getting into states from which we can't
290 expect_prompt(discard)
293 #if defined (LOG_FILE)
294 /* This is a convenient place to do this. The idea is to do it often
295 enough that we never lose much data if we terminate abnormally. */
298 expect (PROMPT, discard);
302 * junk -- ignore junk characters. Returns a 1 if junk, 0 otherwise
314 if (sr_get_debug() > 5)
315 debuglogs (5, "Ignoring \'%c\'.", ch);
318 if (sr_get_debug() > 5)
319 debuglogs (5, "Accepting \'%c\'.", ch);
325 * get_hex_digit -- Get a hex digit from the remote system & return its value.
326 * If ignore is nonzero, ignore spaces, newline & tabs.
329 get_hex_digit(ignore)
334 ch = readchar(timeout);
337 if (sr_get_debug() > 4)
338 debuglogs (4, "get_hex_digit() got a 0x%x(%c)", ch, ch);
340 if (ch >= '0' && ch <= '9')
342 else if (ch >= 'A' && ch <= 'F')
343 return ch - 'A' + 10;
344 else if (ch >= 'a' && ch <= 'f')
345 return ch - 'a' + 10;
346 else if (ch == ' ' && ignore)
350 error("Invalid hex digit from remote system.");
355 /* get_hex_byte -- Get a byte from monitor and put it in *BYT.
356 * Accept any number leading spaces.
364 val = get_hex_digit (1) << 4;
365 debuglogs (4, "get_hex_digit() -- Read first nibble 0x%x", val);
367 val |= get_hex_digit (0);
368 debuglogs (4, "get_hex_digit() -- Read second nibble 0x%x", val);
371 debuglogs (4, "get_hex_digit() -- Read a 0x%x", val);
375 * get_hex_word -- Get N 32-bit words from remote, each preceded by a space,
376 * and put them in registers starting at REGNO.
385 for (i = 0; i < 8; i++)
386 val = (val << 4) + get_hex_digit (i == 0);
388 debuglogs (3, "get_hex_word() got a 0x%x.", val);
393 /* This is called not only when we first attach, but also when the
394 user types "run" after having attached. */
396 monitor_create_inferior (execfile, args, env)
404 error("Can't pass arguments to remote MONITOR process");
406 if (execfile == 0 || exec_bfd == 0)
407 error("No exec file specified");
409 entry_pt = (int) bfd_get_start_address (exec_bfd);
411 debuglogs (2, "create_inferior(exexfile=%s, args=%s, env=%s)", execfile, args, env);
413 /* The "process" (board) is already stopped awaiting our commands, and
414 the program is already downloaded. We just set its PC and go. */
416 clear_proceed_status ();
418 /* Tell wait_for_inferior that we've started a new process. */
419 init_wait_for_inferior ();
421 /* Set up the "saved terminal modes" of the inferior
422 based on what modes we are starting it with. */
423 target_terminal_init ();
425 /* Install inferior's terminal modes. */
426 target_terminal_inferior ();
428 /* insert_step_breakpoint (); FIXME, do we need this? */
431 proceed ((CORE_ADDR)entry_pt, TARGET_SIGNAL_DEFAULT, 0);
435 * monitor_open -- open a connection to a remote debugger.
436 * NAME is the filename used for communication.
438 static int baudrate = 9600;
439 static char dev_name[100];
442 monitor_open(args, name, from_tty)
449 error ("Use `target %s DEVICE-NAME' to use a serial port, or \n\
450 `target %s HOST-NAME:PORT-NUMBER' to use a network connection.", name, name);
455 strcpy(dev_name, args);
456 monitor_desc = SERIAL_OPEN(dev_name);
458 if (monitor_desc == NULL)
459 perror_with_name(dev_name);
463 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);
493 * monitor_close -- Close out all files and local state before this
494 * target loses control.
498 monitor_close (quitting)
501 SERIAL_CLOSE(monitor_desc);
504 debuglogs (1, "monitor_close (quitting=%d)", quitting);
506 #if defined (LOG_FILE)
508 if (ferror(log_file))
509 fprintf(stderr, "Error writing log file.\n");
510 if (fclose(log_file) != 0)
511 fprintf(stderr, "Error closing log file.\n");
517 * monitor_detach -- terminate the open connection to the remote
518 * debugger. Use this when you want to detach and do something
519 * else with your gdb.
522 monitor_detach (from_tty)
526 debuglogs (4, "monitor_detach ()");
528 pop_target(); /* calls monitor_close to do the real work */
530 printf ("Ending remote %s debugging\n", target_shortname);
534 * monitor_attach -- attach GDB to the target.
537 monitor_attach (args, from_tty)
542 printf ("Starting remote %s debugging\n", target_shortname);
545 fprintf (log_file, "\nmonitor_attach (args=%s)\n", args);
548 if (sr_get_debug() > 4)
549 printf ("\nmonitor_attach (args=%s)\n", args);
551 printf_monitor (GO_CMD);
552 /* swallow the echo. */
557 * monitor_resume -- Tell the remote machine to resume.
560 monitor_resume (pid, step, sig)
562 enum target_signal sig;
564 debuglogs (4, "monitor_resume (step=%d, sig=%d)", step, sig);
567 printf_monitor (STEP_CMD);
568 /* wait for the echo. */
569 expect (STEP_CMD, 1);
571 printf_monitor (CONT_CMD);
572 /* swallow the echo. */
573 expect (CONT_CMD, 1);
578 * _wait -- Wait until the remote machine stops, then return,
579 * storing status in status just as `wait' would.
583 monitor_wait (pid, status)
585 struct target_waitstatus *status;
587 int old_timeout = timeout;
589 debuglogs(4, "monitor_wait (), printing extraneous text.", log_file);
591 status->kind = TARGET_WAITKIND_EXITED;
592 status->value.integer = 0;
594 timeout = 0; /* Don't time out -- user program is running. */
596 expect_prompt(0); /* Wait for prompt, outputting extraneous text */
597 if (sr_get_debug() > 4)
598 puts ("monitor_wait(), got the prompt.");
600 debuglogs (4, "monitor_wait(%x), got the prompt.", 12345678);
602 status->kind = TARGET_WAITKIND_STOPPED;
603 status->value.sig = TARGET_SIGNAL_TRAP;
605 timeout = old_timeout;
610 /* Return the name of register number regno in the form input and output by
611 monitor. Currently, register_names just happens to contain exactly what
612 monitor wants. Lets take advantage of that just as long as possible! */
627 for (p = REGNAMES(regno); *p; p++)
632 debuglogs (5, "Got name \"%s\" from regno #%d.", buf, regno);
638 * monitor_fetch_registers -- read the remote registers into the
642 monitor_fetch_registers ()
646 /* yeah yeah, i know this is horribly inefficient. but it isn't done
647 very often... i'll clean it up later. */
649 for (regno = 0; regno <= PC_REGNUM; regno++)
650 monitor_fetch_register(regno);
654 * monitor_fetch_register -- fetch register REGNO, or all registers if REGNO
655 * is -1. Returns errno value.
658 monitor_fetch_register (regno)
663 debuglogs (1, "monitor_fetch_register (regno=%d)", get_reg_name (regno));
666 monitor_fetch_registers ();
668 char *name = get_reg_name (regno);
671 printf_monitor (ROMCMD(GET_REG), name); /* send the command */
672 expect (name, 1); /* then strip the leading garbage */
673 if (*ROMDELIM(GET_REG) != 0) { /* if there's a delimiter */
674 expect (ROMDELIM(GET_REG), 1);
677 val = get_hex_word(); /* get the value, ignore junk */
678 supply_register (regno, (char *) &val);
680 if (*ROMDELIM(GET_REG) != 0) {
681 /*** expect (ROMRES(GET_REG)); ***/
682 printf_monitor (CMD_END);
689 /* Store the remote registers from the contents of the block REGS. */
692 monitor_store_registers ()
696 debuglogs (1, "monitor_store_registers()");
698 for (regno = 0; regno <= PC_REGNUM; regno++)
699 monitor_store_register(regno);
701 registers_changed ();
705 * monitor_store_register -- store register REGNO, or all if REGNO == 0.
706 * return errno value.
709 monitor_store_register (regno)
715 i = read_register(regno);
717 debuglogs (1, "monitor_store_register (regno=%d)", regno);
720 monitor_store_registers ();
722 debuglogs (3, "Setting register %s to 0x%x", get_reg_name (regno), read_register (regno));
724 name = get_reg_name (regno);
727 printf_monitor (ROMCMD(SET_REG), name, read_register(regno));
728 expect (name, 1); /* strip the leading garbage */
729 if (*ROMDELIM(SET_REG) != 0) { /* if there's a delimiter */
730 expect (ROMDELIM(SET_REG), 1);
732 printf_monitor ("%d%s\n", i, CMD_END);
739 printf_monitor (SET_REG, get_reg_name (regno),
740 read_register (regno));
746 /* Get ready to modify the registers array. On machines which store
747 individual registers, this doesn't need to do anything. On machines
748 which store all the registers in one fell swoop, this makes sure
749 that registers contains all the registers from the program being
753 monitor_prepare_to_store ()
755 /* Do nothing, since we can store individual regs */
759 monitor_files_info ()
761 printf ("\tAttached to %s at %d baud.\n",
766 * monitor_write_inferior_memory -- Copy LEN bytes of data from debugger
767 * memory at MYADDR to inferior's memory at MEMADDR. Returns length moved.
770 monitor_write_inferior_memory (memaddr, myaddr, len)
772 unsigned char *myaddr;
778 debuglogs (1, "monitor_write_inferior_memory (memaddr=0x%x, myaddr=0x%x, len=%d)", memaddr, myaddr, len);
780 for (i = 0; i < len; i++) {
781 printf_monitor (ROMCMD(SET_MEM), memaddr + i, myaddr[i] );
782 if (*ROMDELIM(SET_MEM) != 0) { /* if there's a delimiter */
783 expect (ROMDELIM(SET_MEM), 1);
785 printf_monitor ("%x", myaddr[i]);
787 /*** printf_monitor ("%x", myaddr[i]); ***/
788 if (sr_get_debug() > 1)
789 printf ("\nSet 0x%x to 0x%x\n", memaddr + i, myaddr[i]);
790 if (*ROMDELIM(SET_MEM) != 0) {
792 printf_monitor (CMD_END);
800 * monitor_read_inferior_memory -- read LEN bytes from inferior memory
801 * at MEMADDR. Put the result at debugger address MYADDR. Returns
805 monitor_read_inferior_memory(memaddr, myaddr, len)
813 /* Number of bytes read so far. */
816 /* Starting address of this pass. */
817 unsigned long startaddr;
819 /* Number of bytes to read in this pass. */
822 debuglogs (1, "monitor_read_inferior_memory (memaddr=0x%x, myaddr=0x%x, len=%d)", memaddr, myaddr, len);
824 /* Note that this code works correctly if startaddr is just less
825 than UINT_MAX (well, really CORE_ADDR_MAX if there was such a
826 thing). That is, something like
827 monitor_read_bytes (CORE_ADDR_MAX - 4, foo, 4)
828 works--it never adds len To memaddr and gets 0. */
829 /* However, something like
830 monitor_read_bytes (CORE_ADDR_MAX - 3, foo, 4)
831 doesn't need to work. Detect it and give up if there's an attempt
833 if (((memaddr - 1) + len) < memaddr) {
840 while (count < len) {
842 if ((startaddr % 16) != 0)
843 len_this_pass -= startaddr % 16;
844 if (len_this_pass > (len - count))
845 len_this_pass = (len - count);
847 debuglogs (3, "Display %d bytes at %x", len_this_pass, startaddr);
849 for (i = 0; i < len_this_pass; i++) {
850 printf_monitor (ROMCMD(GET_MEM), startaddr, startaddr);
851 sprintf (buf, ROMCMD(GET_MEM), startaddr, startaddr);
852 if (*ROMDELIM(GET_MEM) != 0) { /* if there's a delimiter */
853 expect (ROMDELIM(GET_MEM), 1);
855 sprintf (buf, ROMCMD(GET_MEM), startaddr, startaddr);
856 expect (buf,1); /* get the command echo */
857 get_hex_word(1); /* strip away the address */
859 get_hex_byte (&myaddr[count++]); /* get the value at this address */
861 if (*ROMDELIM(GET_MEM) != 0) {
862 printf_monitor (CMD_END);
871 /* FIXME-someday! merge these two. */
873 monitor_xfer_inferior_memory (memaddr, myaddr, len, write, target)
878 struct target_ops *target; /* ignored */
881 return monitor_write_inferior_memory (memaddr, myaddr, len);
883 return monitor_read_inferior_memory (memaddr, myaddr, len);
887 monitor_kill (args, from_tty)
891 return; /* ignore attempts to kill target system */
894 /* Clean up when a program exits.
895 The program actually lives on in the remote processor's RAM, and may be
896 run again without a download. Don't leave it full of breakpoint
900 monitor_mourn_inferior ()
902 remove_breakpoints ();
903 generic_mourn_inferior (); /* Do all the proper things now */
906 #define MAX_MONITOR_BREAKPOINTS 16
908 extern int memory_breakpoint_size;
909 static CORE_ADDR breakaddr[MAX_MONITOR_BREAKPOINTS] = {0};
912 * monitor_insert_breakpoint -- add a breakpoint
915 monitor_insert_breakpoint (addr, shadow)
921 debuglogs (1, "monitor_insert_breakpoint() addr = 0x%x", addr);
923 for (i = 0; i <= MAX_MONITOR_BREAKPOINTS; i++) {
924 if (breakaddr[i] == 0) {
926 if (sr_get_debug() > 4)
927 printf ("Breakpoint at %x\n", addr);
928 monitor_read_inferior_memory(addr, shadow, memory_breakpoint_size);
929 printf_monitor(SET_BREAK_CMD, addr);
935 fprintf(stderr, "Too many breakpoints (> 16) for monitor\n");
940 * _remove_breakpoint -- Tell the monitor to remove a breakpoint
943 monitor_remove_breakpoint (addr, shadow)
949 debuglogs (1, "monitor_remove_breakpoint() addr = 0x%x", addr);
951 for (i = 0; i < MAX_MONITOR_BREAKPOINTS; i++) {
952 if (breakaddr[i] == addr) {
954 /* some monitors remove breakpoints based on the address */
956 printf_monitor(CLR_BREAK_CMD, addr);
958 printf_monitor(CLR_BREAK_CMD, i);
963 fprintf(stderr, "Can't find breakpoint associated with 0x%x\n", addr);
967 /* Load a file. This is usually an srecord, which is ascii. No
968 protocol, just sent line by line. */
970 #define DOWNLOAD_LINE_SIZE 100
976 char buf[DOWNLOAD_LINE_SIZE];
980 printf ("Loading %s to monitor\n", arg);
982 download = fopen (arg, "r");
983 if (download == NULL)
985 error (sprintf (buf, "%s Does not exist", arg));
989 printf_monitor (LOAD_CMD);
990 /* expect ("Waiting for S-records from host... ", 1); */
992 while (!feof (download))
994 bytes_read = fread (buf, sizeof (char), DOWNLOAD_LINE_SIZE, download);
1001 if (SERIAL_WRITE(monitor_desc, buf, bytes_read)) {
1002 fprintf(stderr, "SERIAL_WRITE failed: (while downloading) %s\n", safe_strerror(errno));
1006 while (i++ <=200000) {} ; /* Ugly HACK, probably needs flow control */
1007 if (bytes_read < DOWNLOAD_LINE_SIZE)
1009 if (!feof (download))
1010 error ("Only read %d bytes\n", bytes_read);
1019 if (!feof (download))
1020 error ("Never got EOF while downloading");
1025 * monitor_command -- put a command string, in args, out to MONITOR.
1026 * Output from MONITOR is placed on the users terminal until the
1027 * prompt is seen. FIXME: We read the charcters ourseleves here
1028 * cause of a nasty echo.
1031 monitor_command (args, fromtty)
1040 debuglogs (1, "monitor_command (args=%s)", args);
1042 if (monitor_desc == NULL)
1043 error("monitor target not open.");
1046 error("Missing command.");
1048 printf_monitor ("%s\n", args);
1054 * _initialize_remote_monitors -- setup a few addtitional commands that
1055 * are usually only used by monitors.
1058 _initialize_remote_monitors ()
1060 struct cmd_list_element *c;
1062 /* this sets the type of download protocol */
1063 c = add_set_cmd ("loadtype", no_class, var_string, (char *)&loadtype_str,
1064 "Set the type of the remote load protocol.\n", &setlist);
1065 c->function.sfunc = set_loadtype_command;
1066 add_show_from_set (c, &showlist);
1067 loadtype_str = savestring ("generic", 8);
1069 add_show_from_set (add_set_cmd ("hash", no_class, var_boolean,
1071 "Set display of activity while downloading a file.\n\
1072 When enabled, a period \'.\' is displayed.",
1076 /* generic monitor command */
1077 add_com ("monitor", class_obscure, monitor_command,
1078 "Send a command to the debug monitor.");