bd0709dea59500a1b7ca63f975fa0590ca4657d7
[binutils-gdb.git] / gdb / monitor.c
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.
4
5 This file is part of GDB.
6
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.
11
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.
16
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. */
20
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.
25
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.
30 */
31
32 #include "defs.h"
33 #include "gdbcore.h"
34 #include "target.h"
35 #include "wait.h"
36 #include <varargs.h>
37 #include <signal.h>
38 #include <string.h>
39 #include <sys/types.h>
40 #include "command.h"
41 #include "serial.h"
42 #include "monitor.h"
43 #include "remote-utils.h"
44
45 #ifdef HAVE_TERMIO
46 # define TERMINAL struct termios
47 #else
48 # define TERMINAL struct sgttyb
49 #endif
50
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;
55
56 static int hashmark; /* flag set by "set hash" */
57
58 /* FIXME: Replace with sr_get_debug (). */
59 #define LOG_FILE "monitor.log"
60 #if defined (LOG_FILE)
61 FILE *log_file;
62 #endif
63
64 static int timeout = 24;
65
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.
68 */
69 static serial_t monitor_desc = NULL;
70
71 /* sets the download protocol, choices are srec, generic, boot */
72 char *loadtype;
73 static char *loadtype_str;
74 static void set_loadtype_command();
75
76 /*
77 * set_loadtype_command -- set the type for downloading. Check to make
78 * sure you have a support protocol for this target.
79 */
80 static void
81 set_loadtype_command (ignore, from_tty, c)
82 char *ignore;
83 int from_tty;
84 struct cmd_list_element *c;
85 {
86 #if 0
87 char *type;
88 if (strcmp (LOADTYPES, "")) {
89 error ("No loadtype set");
90 return;
91 }
92
93 type = strtok(LOADTYPES, ",");
94 if (STREQ (type, (*(char **) c->var))) {
95 loadtype_str = savestring (*(char **) c->var, strlen (*(char **) c->var));
96 return;
97 }
98
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));
102 #endif
103 loadtype_str = savestring (*(char **) c->var, strlen (*(char **) c->var));
104 }
105
106 /*
107 * printf_monitor -- send data to monitor. Works just like printf.
108 */
109 static void
110 printf_monitor(va_alist)
111 va_dcl
112 {
113 va_list args;
114 char *pattern;
115 char buf[200];
116 int i;
117
118 va_start(args);
119
120 pattern = va_arg(args, char *);
121
122 vsprintf(buf, pattern, args);
123
124 if (sr_get_debug() > 3)
125 printf ("Sending to monitor,\r\n\t\"%s\".\r\n", buf);
126
127 if (SERIAL_WRITE(monitor_desc, buf, strlen(buf)))
128 fprintf(stderr, "SERIAL_WRITE failed: %s\n", safe_strerror(errno));
129 }
130
131 /* readchar -- read a character from the remote system, doing all the fancy
132 * timeout stuff.
133 */
134 static int
135 readchar(timeout)
136 int timeout;
137 {
138 int c;
139
140 c = SERIAL_READCHAR(monitor_desc, timeout);
141
142 if (sr_get_debug() > 5)
143 putchar(c & 0x7f);
144
145 #ifdef LOG_FILE
146 if (isascii (c))
147 putc(c & 0x7f, log_file);
148 #endif
149
150 if (c >= 0)
151 return c & 0x7f;
152
153 if (c == SERIAL_TIMEOUT) {
154 if (timeout == 0)
155 return c; /* Polls shouldn't generate timeout errors */
156 error("Timeout reading from remote system.");
157 }
158 perror_with_name("remote-monitor");
159 }
160
161 /*
162 * expect -- scan input from the remote system, until STRING is found.
163 * If DISCARD is non-zero, then discard non-matching input, else print
164 * it out. Let the user break out immediately.
165 */
166 static void
167 expect (string, discard)
168 char *string;
169 int discard;
170 {
171 char *p = string;
172 int c;
173
174
175 if (sr_get_debug())
176 printf ("Expecting \"%s\".\n", string);
177
178 immediate_quit = 1;
179 while (1) {
180 c = readchar(timeout);
181 if (!isascii (c))
182 continue;
183 if (c == *p++) {
184 if (*p == '\0') {
185 immediate_quit = 0;
186 if (sr_get_debug())
187 printf ("\nMatched\n");
188 return;
189 }
190 } else {
191 if (!discard) {
192 fwrite(string, 1, (p - 1) - string, stdout);
193 putchar((char)c);
194 fflush(stdout);
195 }
196 p = string;
197 }
198 }
199 }
200
201 /* Keep discarding input until we see the MONITOR prompt.
202
203 The convention for dealing with the prompt is that you
204 o give your command
205 o *then* wait for the prompt.
206
207 Thus the last thing that a procedure does with the serial line
208 will be an expect_prompt(). Exception: monitor_resume does not
209 wait for the prompt, because the terminal is being handed over
210 to the inferior. However, the next thing which happens after that
211 is a monitor_wait which does wait for the prompt.
212 Note that this includes abnormal exit, e.g. error(). This is
213 necessary to prevent getting into states from which we can't
214 recover. */
215 static void
216 expect_prompt(discard)
217 int discard;
218 {
219 #if defined (LOG_FILE)
220 /* This is a convenient place to do this. The idea is to do it often
221 enough that we never lose much data if we terminate abnormally. */
222 fflush(log_file);
223 #endif
224 expect (PROMPT, discard);
225 }
226
227 /*
228 * junk -- ignore junk characters. Returns a 1 if junk, 0 otherwise
229 */
230 static int
231 junk(ch)
232 char ch;
233 {
234 switch (ch) {
235 case ' ':
236 case '-':
237 case '\t':
238 case '\r':
239 case '\n':
240 if (sr_get_debug() > 5)
241 printf ("Ignoring \'%c\'.\n", ch);
242 return 1;
243 default:
244 if (sr_get_debug() > 5)
245 printf ("Accepting \'%c\'.\n", ch);
246 return 0;
247 }
248 }
249
250 /*
251 * get_hex_digit -- Get a hex digit from the remote system & return its value.
252 * If ignore is nonzero, ignore spaces, newline & tabs.
253 */
254 static int
255 get_hex_digit(ignore)
256 int ignore;
257 {
258 static int ch;
259 while (1) {
260 ch = readchar(timeout);
261 if (junk(ch))
262 continue;
263 if (sr_get_debug() > 4)
264 printf ("get_hex_digit() got a 0x%x(%c)\n", ch, ch);
265
266 if (ch >= '0' && ch <= '9')
267 return ch - '0';
268 else if (ch >= 'A' && ch <= 'F')
269 return ch - 'A' + 10;
270 else if (ch >= 'a' && ch <= 'f')
271 return ch - 'a' + 10;
272 else if (ch == ' ' && ignore)
273 ;
274 else {
275 expect_prompt(1);
276 error("Invalid hex digit from remote system.");
277 }
278 }
279 }
280
281 /* get_hex_byte -- Get a byte from monitor and put it in *BYT.
282 * Accept any number leading spaces.
283 */
284 static void
285 get_hex_byte (byt)
286 char *byt;
287 {
288 int val;
289
290 val = get_hex_digit (1) << 4;
291 if (sr_get_debug() > 3)
292 printf ("\nget_hex_digit() -- Read first nibble 0x%x\n", val);
293
294 val |= get_hex_digit (0);
295 if (sr_get_debug() > 3)
296 printf ("\nget_hex_digit() -- Read second nibble 0x%x\n", val);
297 *byt = val;
298
299 if (sr_get_debug() > 3)
300 printf ("\nget_hex_digit() -- Read a 0x%x\n", val);
301 }
302
303 /*
304 * get_hex_word -- Get N 32-bit words from remote, each preceded by a space,
305 * and put them in registers starting at REGNO.
306 */
307 static int
308 get_hex_word ()
309 {
310 long val;
311 int i;
312
313 val = 0;
314 for (i = 0; i < 8; i++)
315 val = (val << 4) + get_hex_digit (i == 0);
316
317 if (sr_get_debug() > 3)
318 printf ("\nget_hex_word() got a 0x%x.\n", val);
319
320 return val;
321 }
322
323 /* This is called not only when we first attach, but also when the
324 user types "run" after having attached. */
325 void
326 monitor_create_inferior (execfile, args, env)
327 char *execfile;
328 char *args;
329 char **env;
330 {
331 int entry_pt;
332
333 if (args && *args)
334 error("Can't pass arguments to remote MONITOR process");
335
336 if (execfile == 0 || exec_bfd == 0)
337 error("No exec file specified");
338
339 entry_pt = (int) bfd_get_start_address (exec_bfd);
340
341 #ifdef LOG_FILE
342 fputs ("\nIn Create_inferior()", log_file);
343 #endif
344
345 /* The "process" (board) is already stopped awaiting our commands, and
346 the program is already downloaded. We just set its PC and go. */
347
348 clear_proceed_status ();
349
350 /* Tell wait_for_inferior that we've started a new process. */
351 init_wait_for_inferior ();
352
353 /* Set up the "saved terminal modes" of the inferior
354 based on what modes we are starting it with. */
355 target_terminal_init ();
356
357 /* Install inferior's terminal modes. */
358 target_terminal_inferior ();
359
360 /* insert_step_breakpoint (); FIXME, do we need this? */
361
362 /* Let 'er rip... */
363 proceed ((CORE_ADDR)entry_pt, TARGET_SIGNAL_DEFAULT, 0);
364 }
365
366 /*
367 * monitor_open -- open a connection to a remote debugger.
368 * NAME is the filename used for communication.
369 */
370 static int baudrate = 9600;
371 static char dev_name[100];
372
373 void
374 monitor_open(args, name, from_tty)
375 char *args;
376 char *name;
377 int from_tty;
378 {
379
380 if (args == NULL)
381 error ("Use `target %s DEVICE-NAME' to use a serial port, or \n\
382 `target %s HOST-NAME:PORT-NUMBER' to use a network connection.", name, name);
383
384 /* if (is_open) */
385 monitor_close(0);
386
387 strcpy(dev_name, args);
388 monitor_desc = SERIAL_OPEN(dev_name);
389
390 if (monitor_desc == NULL)
391 perror_with_name(dev_name);
392
393 if (baud_rate != -1)
394 {
395 if (SERIAL_SETBAUDRATE (monitor_desc, baud_rate))
396 {
397 SERIAL_CLOSE (monitor_desc);
398 perror_with_name (name);
399 }
400 }
401
402 SERIAL_RAW(monitor_desc);
403
404 #if defined (LOG_FILE)
405 log_file = fopen (LOG_FILE, "w");
406 if (log_file == NULL)
407 perror_with_name (LOG_FILE);
408 #endif
409
410 /* wake up the monitor and see if it's alive */
411 printf_monitor(INIT_CMD);
412 expect_prompt(1); /* See if we get a prompt */
413
414 /* try again to be sure */
415 printf_monitor(INIT_CMD);
416 expect_prompt(1); /* See if we get a prompt */
417
418 if (from_tty)
419 printf("Remote target %s connected to %s\n", TARGET_NAME, dev_name);
420
421
422 }
423
424 /*
425 * monitor_close -- Close out all files and local state before this
426 * target loses control.
427 */
428
429 void
430 monitor_close (quitting)
431 int quitting;
432 {
433 SERIAL_CLOSE(monitor_desc);
434 monitor_desc = NULL;
435
436 if (sr_get_debug() > 4)
437 puts ("\nmonitor_close ()");
438
439 #if defined (LOG_FILE)
440 if (log_file) {
441 if (ferror(log_file))
442 fprintf(stderr, "Error writing log file.\n");
443 if (fclose(log_file) != 0)
444 fprintf(stderr, "Error closing log file.\n");
445 }
446 #endif
447 }
448
449 /*
450 * monitor_detach -- terminate the open connection to the remote
451 * debugger. Use this when you want to detach and do something
452 * else with your gdb.
453 */
454 void
455 monitor_detach (from_tty)
456 int from_tty;
457 {
458 #ifdef LOG_FILE
459 fprintf (log_file, "\nmonitor_detach ()\n");
460 #endif
461
462 pop_target(); /* calls monitor_close to do the real work */
463 if (from_tty)
464 printf ("Ending remote %s debugging\n", target_shortname);
465 }
466
467 /*
468 * monitor_attach -- attach GDB to the target.
469 */
470 void
471 monitor_attach (args, from_tty)
472 char *args;
473 int from_tty;
474 {
475 if (from_tty)
476 printf ("Starting remote %s debugging\n", target_shortname);
477
478 #ifdef LOG_FILE
479 fprintf (log_file, "\nmonitor_attach (args=%s)\n", args);
480 #endif
481
482 if (sr_get_debug() > 4)
483 printf ("\nmonitor_attach (args=%s)\n", args);
484
485 printf_monitor (GO_CMD);
486 /* swallow the echo. */
487 expect (GO_CMD, 1);
488 }
489
490 /*
491 * monitor_resume -- Tell the remote machine to resume.
492 */
493 void
494 monitor_resume (pid, step, sig)
495 int pid, step;
496 enum target_signal sig;
497 {
498 #ifdef LOG_FILE
499 fprintf (log_file, "\nmonitor_resume (step=%d, sig=%d)\n", step, sig);
500 #endif
501
502 if (sr_get_debug() > 4)
503 printf ("\nmonitor_resume (step=%d, sig=%d)\n", step, sig);
504
505 if (step) {
506 printf_monitor (STEP_CMD);
507 /* wait for the echo. */
508 expect (STEP_CMD, 1);
509 } else {
510 printf_monitor (CONT_CMD);
511 /* swallow the echo. */
512 expect (CONT_CMD, 1);
513 }
514 }
515
516 /*
517 * _wait -- Wait until the remote machine stops, then return,
518 * storing status in status just as `wait' would.
519 */
520
521 int
522 monitor_wait (pid, status)
523 int pid;
524 struct target_waitstatus *status;
525 {
526 int old_timeout = timeout;
527 #ifdef LOG_FILE
528 fputs ("\nIn wait ()", log_file);
529 #endif
530
531 status->kind = TARGET_WAITKIND_EXITED;
532 status->value.integer = 0;
533
534 timeout = 0; /* Don't time out -- user program is running. */
535
536 expect_prompt(0); /* Wait for prompt, outputting extraneous text */
537
538 status->kind = TARGET_WAITKIND_STOPPED;
539 status->value.sig = TARGET_SIGNAL_TRAP;
540
541 timeout = old_timeout;
542
543 return 0;
544 }
545
546 /* Return the name of register number regno in the form input and output by
547 monitor. Currently, register_names just happens to contain exactly what
548 monitor wants. Lets take advantage of that just as long as possible! */
549
550 static char *
551 get_reg_name (regno)
552 int regno;
553 {
554 static char buf[50];
555 const char *p;
556 char *b;
557
558 b = buf;
559
560 if (regno < 0)
561 return ("");
562
563 for (p = REGNAMES(regno); *p; p++)
564 *b++ = tolower(*p);
565
566 *b = '\000';
567
568 if (sr_get_debug() > 5)
569 printf ("Got name \"%s\" from regno #%d.\n", buf, regno);
570
571 #ifdef LOG_FILE
572 fprintf (log_file, "Got name \"%s\" from regno #%d.\n", buf, regno);
573 fflush (log_file);
574 #endif
575
576 return buf;
577 }
578
579 /* read the remote registers into the block regs. */
580
581 void
582 monitor_fetch_registers ()
583 {
584 int regno;
585
586 /* yeah yeah, i know this is horribly inefficient. but it isn't done
587 very often... i'll clean it up later. */
588
589 for (regno = 0; regno <= PC_REGNUM; regno++)
590 monitor_fetch_register(regno);
591 }
592
593 /*
594 * monitor_fetch_register -- fetch register REGNO, or all registers if REGNO
595 * is -1. Returns errno value.
596 */
597 void
598 monitor_fetch_register (regno)
599 int regno;
600 {
601 int val, j;
602
603 #ifdef LOG_FILE
604 fprintf (log_file, "\nIn Fetch Register (reg=%s)\n", get_reg_name (regno));
605 fflush (log_file);
606 #endif
607
608 if (regno < 0) {
609 monitor_fetch_registers ();
610 } else {
611 char *name = get_reg_name (regno);
612 if (STREQ(name, ""))
613 return;
614 printf_monitor (ROMCMD(GET_REG), name); /* send the command */
615 expect (name, 1); /* then strip the leading garbage */
616 if (*ROMDELIM(GET_REG) != 0) { /* if there's a delimiter */
617 expect (ROMDELIM(GET_REG), 1);
618 }
619
620 val = get_hex_word(); /* get the value, ignore junk */
621 supply_register (regno, (char *) &val);
622
623 if (*ROMDELIM(GET_REG) != 0) {
624 /*** expect (ROMRES(GET_REG)); ***/
625 printf_monitor (CMD_END);
626 }
627 expect_prompt (1);
628 }
629 return;
630 }
631
632 /* Store the remote registers from the contents of the block REGS. */
633
634 void
635 monitor_store_registers ()
636 {
637 int regno;
638
639 #ifdef LOG_FILE
640 fprintf (log_file, "\nIn Fetch Registers\n");
641 fflush (log_file);
642 #endif
643 for (regno = 0; regno <= PC_REGNUM; regno++)
644 monitor_store_register(regno);
645
646 registers_changed ();
647 }
648
649 /*
650 * monitor_store_register -- store register REGNO, or all if REGNO == 0.
651 * return errno value.
652 */
653 void
654 monitor_store_register (regno)
655 int regno;
656 {
657 char *name;
658 int i;
659
660 i = read_register(regno);
661
662 #ifdef LOG_FILE
663 fprintf (log_file, "\nIn Store_register (regno=%d)\n", regno);
664 #endif
665
666 if (regno < 0)
667 monitor_store_registers ();
668 else {
669 if (sr_get_debug() > 3)
670 printf ("Setting register %s to 0x%x\n", get_reg_name (regno), read_register (regno));
671
672 name = get_reg_name (regno);
673 if (STREQ(name, ""))
674 return;
675 printf_monitor (ROMCMD(SET_REG), name, read_register(regno));
676 expect (name, 1); /* strip the leading garbage */
677 if (*ROMDELIM(SET_REG) != 0) { /* if there's a delimiter */
678 expect (ROMDELIM(SET_REG), 1);
679 get_hex_word(1);
680 printf_monitor ("%d%s\n", i, CMD_END);
681 }
682 expect_prompt (1);
683 }
684 return;
685
686 #if 0
687 printf_monitor (SET_REG, get_reg_name (regno),
688 read_register (regno));
689 expect_prompt (1);
690 }
691 #endif
692 }
693
694 /* Get ready to modify the registers array. On machines which store
695 individual registers, this doesn't need to do anything. On machines
696 which store all the registers in one fell swoop, this makes sure
697 that registers contains all the registers from the program being
698 debugged. */
699
700 void
701 monitor_prepare_to_store ()
702 {
703 /* Do nothing, since we can store individual regs */
704 }
705
706 void
707 monitor_files_info ()
708 {
709 printf ("\tAttached to %s at %d baud.\n",
710 dev_name, baudrate);
711 }
712
713 /*
714 * monitor_write_inferior_memory -- Copy LEN bytes of data from debugger
715 * memory at MYADDR to inferior's memory at MEMADDR. Returns length moved.
716 */
717 int
718 monitor_write_inferior_memory (memaddr, myaddr, len)
719 CORE_ADDR memaddr;
720 unsigned char *myaddr;
721 int len;
722 {
723 int i;
724 char buf[10];
725
726 #ifdef LOG_FILE
727 fprintf (log_file, "\nIn Write_inferior_memory (memaddr=%x, len=%d)\n", memaddr, len);
728 #endif
729
730 if (sr_get_debug() > 0)
731 printf ("\nTrying to set 0x%x to 0x%x\n", memaddr, myaddr);
732
733 for (i = 0; i < len; i++) {
734 printf_monitor (ROMCMD(SET_MEM), memaddr + i, myaddr[i] );
735 if (*ROMDELIM(SET_MEM) != 0) { /* if there's a delimiter */
736 expect (ROMDELIM(SET_MEM), 1);
737 expect (CMD_DELIM);
738 printf_monitor ("%x", myaddr[i]);
739 }
740 /*** printf_monitor ("%x", myaddr[i]); ***/
741 if (sr_get_debug() > 1)
742 printf ("\nSet 0x%x to 0x%x\n", memaddr + i, myaddr[i]);
743 if (*ROMDELIM(SET_MEM) != 0) {
744 expect (CMD_DELIM);
745 printf_monitor (CMD_END);
746 }
747 expect_prompt (1);
748 }
749 return len;
750 }
751
752 /*
753 * monitor_read_inferior_memory -- read LEN bytes from inferior memory
754 * at MEMADDR. Put the result at debugger address MYADDR. Returns
755 * length moved.
756 */
757 int
758 monitor_read_inferior_memory(memaddr, myaddr, len)
759 CORE_ADDR memaddr;
760 char *myaddr;
761 int len;
762 {
763 int i, j;
764 char buf[20];
765
766 /* Number of bytes read so far. */
767 int count;
768
769 /* Starting address of this pass. */
770 unsigned long startaddr;
771
772 /* Number of bytes to read in this pass. */
773 int len_this_pass;
774
775 #ifdef LOG_FILE
776 fprintf (log_file, "\nIn Read_inferior_memory (memaddr=%x, len=%d)\n", memaddr, len);
777 #endif
778
779 /* Note that this code works correctly if startaddr is just less
780 than UINT_MAX (well, really CORE_ADDR_MAX if there was such a
781 thing). That is, something like
782 monitor_read_bytes (CORE_ADDR_MAX - 4, foo, 4)
783 works--it never adds len To memaddr and gets 0. */
784 /* However, something like
785 monitor_read_bytes (CORE_ADDR_MAX - 3, foo, 4)
786 doesn't need to work. Detect it and give up if there's an attempt
787 to do that. */
788 if (((memaddr - 1) + len) < memaddr) {
789 errno = EIO;
790 return 0;
791 }
792
793 startaddr = memaddr;
794 count = 0;
795 while (count < len) {
796 len_this_pass = 16;
797 if ((startaddr % 16) != 0)
798 len_this_pass -= startaddr % 16;
799 if (len_this_pass > (len - count))
800 len_this_pass = (len - count);
801 if (sr_get_debug())
802 printf ("\nDisplay %d bytes at %x\n", len_this_pass, startaddr);
803
804 for (i = 0; i < len_this_pass; i++) {
805 printf_monitor (ROMCMD(GET_MEM), startaddr, startaddr);
806 sprintf (buf, ROMCMD(GET_MEM), startaddr, startaddr);
807 #if 0
808 expect (buf,1); /* get the command echo */
809 get_hex_word(1); /* strip away the address */
810 #endif
811 if (*ROMDELIM(GET_MEM) != 0) { /* if there's a delimiter */
812 expect (ROMDELIM(GET_MEM), 1);
813 } else {
814 sprintf (buf, ROMCMD(GET_MEM), startaddr, startaddr);
815 expect (buf,1); /* get the command echo */
816 get_hex_word(1); /* strip away the address */
817 }
818 get_hex_byte (&myaddr[count++]); /* get the value at this address */
819
820 if (*ROMDELIM(GET_MEM) != 0) {
821 printf_monitor (CMD_END);
822 }
823 expect_prompt (1);
824 startaddr += 1;
825 }
826 }
827 return len;
828 }
829
830 /* FIXME-someday! merge these two. */
831 int
832 monitor_xfer_inferior_memory (memaddr, myaddr, len, write, target)
833 CORE_ADDR memaddr;
834 char *myaddr;
835 int len;
836 int write;
837 struct target_ops *target; /* ignored */
838 {
839 if (write)
840 return monitor_write_inferior_memory (memaddr, myaddr, len);
841 else
842 return monitor_read_inferior_memory (memaddr, myaddr, len);
843 }
844
845 void
846 monitor_kill (args, from_tty)
847 char *args;
848 int from_tty;
849 {
850 return; /* ignore attempts to kill target system */
851 }
852
853 /* Clean up when a program exits.
854 The program actually lives on in the remote processor's RAM, and may be
855 run again without a download. Don't leave it full of breakpoint
856 instructions. */
857
858 void
859 monitor_mourn_inferior ()
860 {
861 remove_breakpoints ();
862 generic_mourn_inferior (); /* Do all the proper things now */
863 }
864
865 #define MAX_MONITOR_BREAKPOINTS 16
866
867 extern int memory_breakpoint_size;
868 static CORE_ADDR breakaddr[MAX_MONITOR_BREAKPOINTS] = {0};
869
870 /*
871 * monitor_insert_breakpoint -- add a breakpoint
872 */
873 int
874 monitor_insert_breakpoint (addr, shadow)
875 CORE_ADDR addr;
876 char *shadow;
877 {
878 int i;
879
880 #ifdef LOG_FILE
881 fprintf (log_file, "\nIn Insert_breakpoint (addr=%x)\n", addr);
882 #endif
883
884 if (sr_get_debug() > 4)
885 printf ("insert_breakpoint() addr = 0x%x\n", addr);
886
887 for (i = 0; i <= MAX_MONITOR_BREAKPOINTS; i++) {
888 if (breakaddr[i] == 0) {
889 breakaddr[i] = addr;
890 if (sr_get_debug() > 4)
891 printf ("Breakpoint at %x\n", addr);
892 monitor_read_inferior_memory(addr, shadow, memory_breakpoint_size);
893 printf_monitor(SET_BREAK_CMD, addr);
894 expect_prompt(1);
895 return 0;
896 }
897 }
898
899 fprintf(stderr, "Too many breakpoints (> 16) for monitor\n");
900 return 1;
901 }
902
903 /*
904 * _remove_breakpoint -- Tell the monitor to remove a breakpoint
905 */
906 int
907 monitor_remove_breakpoint (addr, shadow)
908 CORE_ADDR addr;
909 char *shadow;
910 {
911 int i;
912
913 #ifdef LOG_FILE
914 fprintf (log_file, "\nIn Remove_breakpoint (addr=%x)\n", addr);
915 #endif
916
917 if (sr_get_debug() > 4)
918 printf ("remove_breakpoint (addr=%x)\n", addr);
919
920 for (i = 0; i < MAX_MONITOR_BREAKPOINTS; i++) {
921 if (breakaddr[i] == addr) {
922 breakaddr[i] = 0;
923 /* some monitors remove breakpoints based on the address */
924 if (CLR_BREAK_ADDR)
925 printf_monitor(CLR_BREAK_CMD, addr);
926 else
927 printf_monitor(CLR_BREAK_CMD, i);
928 expect_prompt(1);
929 return 0;
930 }
931 }
932 fprintf(stderr, "Can't find breakpoint associated with 0x%x\n", addr);
933 return 1;
934 }
935
936 /* Load a file. This is usually an srecord, which is ascii. No
937 protocol, just sent line by line. */
938
939 #define DOWNLOAD_LINE_SIZE 100
940 void
941 monitor_load (arg)
942 char *arg;
943 {
944 FILE *download;
945 char buf[DOWNLOAD_LINE_SIZE];
946 int i, bytes_read;
947
948 if (sr_get_debug())
949 printf ("Loading %s to monitor\n", arg);
950
951 download = fopen (arg, "r");
952 if (download == NULL)
953 {
954 error (sprintf (buf, "%s Does not exist", arg));
955 return;
956 }
957
958 printf_monitor (LOAD_CMD);
959 /* expect ("Waiting for S-records from host... ", 1); */
960
961 while (!feof (download))
962 {
963 bytes_read = fread (buf, sizeof (char), DOWNLOAD_LINE_SIZE, download);
964 if (hashmark)
965 {
966 putchar ('.');
967 fflush (stdout);
968 }
969
970 if (SERIAL_WRITE(monitor_desc, buf, bytes_read)) {
971 fprintf(stderr, "SERIAL_WRITE failed: (while downloading) %s\n", safe_strerror(errno));
972 break;
973 }
974 i = 0;
975 while (i++ <=200000) {} ; /* Ugly HACK, probably needs flow control */
976 if (bytes_read < DOWNLOAD_LINE_SIZE)
977 {
978 if (!feof (download))
979 error ("Only read %d bytes\n", bytes_read);
980 break;
981 }
982 }
983
984 if (hashmark)
985 {
986 putchar ('\n');
987 }
988 if (!feof (download))
989 error ("Never got EOF while downloading");
990 fclose (download);
991 }
992
993 /*
994 * monitor_command -- put a command string, in args, out to MONITOR.
995 * Output from MONITOR is placed on the users terminal until the
996 * prompt is seen. FIXME: We read the charcters ourseleves here
997 * cause of a nasty echo.
998 */
999 void
1000 monitor_command (args, fromtty)
1001 char *args;
1002 int fromtty;
1003 {
1004
1005 char *p;
1006 char c, cp;
1007 p = PROMPT;
1008
1009 #ifdef LOG_FILE
1010 fprintf (log_file, "\nmonitor_command (args=%s)\n", args);
1011 #endif
1012 if (monitor_desc == NULL)
1013 error("monitor target not open.");
1014
1015 if (!args)
1016 error("Missing command.");
1017
1018 if (sr_get_debug() > 4)
1019 printf ("monitor_command (args=%s)\n", args);
1020
1021 printf_monitor ("%s\n", args);
1022
1023 expect_prompt(0);
1024 }
1025
1026 /*
1027 * _initialize_remote_monitors -- setup a few addtitional commands that
1028 * are usually only used by monitors.
1029 */
1030 void
1031 _initialize_remote_monitors ()
1032 {
1033 struct cmd_list_element *c;
1034
1035 /* this sets the type of download protocol */
1036 c = add_set_cmd ("loadtype", no_class, var_string, (char *)&loadtype_str,
1037 "Set the type of the remote load protocol.\n", &setlist);
1038 c->function.sfunc = set_loadtype_command;
1039 add_show_from_set (c, &showlist);
1040 loadtype_str = savestring ("generic", 8);
1041
1042 add_show_from_set (add_set_cmd ("hash", no_class, var_boolean,
1043 (char *)&hashmark,
1044 "Set display of activity while downloading a file.\n\
1045 When enabled, a period \'.\' is displayed.",
1046 &setlist),
1047 &showlist);
1048
1049 /* generic monitor command */
1050 add_com ("monitor", class_obscure, monitor_command,
1051 "Send a command to the debug monitor.");
1052 }