Cleanup debugging messages.
[external/binutils.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   debuglogs (1, "printf_monitor(), Sending: \"%s\".", buf);
125
126   if (SERIAL_WRITE(monitor_desc, buf, strlen(buf)))
127     fprintf(stderr, "SERIAL_WRITE failed: %s\n", safe_strerror(errno));
128 }
129
130 /*
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.
135  */
136 static void
137 debuglogs(va_alist)
138      va_dcl
139 {
140   va_list args;
141   char *pattern, *p;
142   char buf[200];
143   char newbuf[300];
144   int level, i;
145
146   va_start(args);
147
148   level = va_arg(args, int);                    /* get the debug level */
149   if ((level <0) || (level > 100)) {
150     error ("Bad argument passed to debuglogs()");
151     return;
152   }
153       
154   pattern = va_arg(args, char *);               /* get the printf style pattern */
155
156   vsprintf(buf, pattern, args);                 /* format the string */
157   
158   /* convert some characters so it'll look right in the log */
159   p = newbuf;
160   for (i=0 ; buf[i] != '\0'; i++) {
161     switch (buf[i]) {
162     case '\n':                                  /* newlines */
163       *p++ = '\\';
164       *p++ = 'n';
165       continue;
166     case '\r':                                  /* carriage returns */
167       *p++ = '\\';
168       *p++ = 'r';
169       continue;
170     case '\033':                                /* escape */
171       *p++ = '\\';
172       *p++ = 'e';
173       continue;
174     case '\t':                                  /* tab */
175       *p++ = '\\';
176       *p++ = 't';
177       continue;
178     case '\b':                                  /* backspace */
179       *p++ = '\\';
180       *p++ = 'b';
181       continue;
182     default:                                    /* no change */
183       *p++ = buf[i];
184     }
185
186     if (buf[i] < 26) {                          /* modify control characters */
187       *p++ = '^';
188       *p++ = buf[i] + 'A';
189       continue;
190     }
191   }
192   *p = '\0';                                    /* terminate the string */
193
194   if (sr_get_debug() > level)
195     puts (newbuf);
196
197 #ifdef LOG_FILE                                 /* write to the monitor log */
198   if (log_file != 0x0) {
199     fputs (newbuf, log_file);
200     fputc ('\n', log_file);
201     fflush (log_file);
202   }
203 #endif
204 }
205
206 /* readchar -- read a character from the remote system, doing all the fancy
207  *      timeout stuff.
208  */
209 static int
210 readchar(timeout)
211      int timeout;
212 {
213   int c;
214
215   c = SERIAL_READCHAR(monitor_desc, timeout);
216
217   if (sr_get_debug() > 4)
218     putchar(c & 0x7f);
219
220 #ifdef LOG_FILE
221   if (isascii (c))
222     putc(c & 0x7f, log_file);
223 #endif
224
225   if (c >= 0)
226     return c & 0x7f;
227
228   if (c == SERIAL_TIMEOUT) {
229     if (timeout == 0)
230       return c;         /* Polls shouldn't generate timeout errors */
231     error("Timeout reading from remote system.");
232 #ifdef LOG_FILE
233       fputc ("ERROR: Timeout reading from remote system", log_file);
234 #endif
235   }
236   perror_with_name("remote-monitor");
237 }
238
239 /* 
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.
243  */
244 static void
245 expect (string, discard)
246      char *string;
247      int discard;
248 {
249   char *p = string;
250   int c;
251
252
253   debuglogs (1, "Expecting \"%s\".", string);
254
255   immediate_quit = 1;
256   while (1) {
257     c = readchar(timeout);
258     if (!isascii (c))
259       continue;
260     if (c == *p++) {
261       if (*p == '\0') {
262         immediate_quit = 0;
263         debuglogs (4, "Matched");
264         return;
265       }
266     } else {
267       if (!discard) {
268         fwrite(string, 1, (p - 1) - string, stdout);
269         putchar((char)c);
270         fflush(stdout);
271       }
272       p = string;
273     }
274   }
275 }
276
277 /* Keep discarding input until we see the MONITOR prompt.
278
279    The convention for dealing with the prompt is that you
280    o give your command
281    o *then* wait for the prompt.
282
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
290    recover.  */
291 static void
292 expect_prompt(discard)
293      int discard;
294 {
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.  */
298   fflush(log_file);
299 #endif
300   expect (PROMPT, discard);
301 }
302
303 /*
304  * junk -- ignore junk characters. Returns a 1 if junk, 0 otherwise
305  */
306 static int
307 junk(ch)
308      char ch;
309 {
310   switch (ch) {
311   case ' ':
312   case '-':
313   case '\t':
314   case '\r':
315   case '\n':
316     if (sr_get_debug() > 5)
317       debuglogs (5, "Ignoring \'%c\'.", ch);
318     return 1;
319   default:
320     if (sr_get_debug() > 5)
321       debuglogs (5, "Accepting \'%c\'.", ch);
322     return 0;
323   }
324 }
325
326 /* 
327  *  get_hex_digit -- Get a hex digit from the remote system & return its value.
328  *              If ignore is nonzero, ignore spaces, newline & tabs.
329  */
330 static int
331 get_hex_digit(ignore)
332      int ignore;
333 {
334   static int ch;
335   while (1) {
336     ch = readchar(timeout);
337     if (junk(ch))
338       continue;
339     if (sr_get_debug() > 4)
340       debuglogs (4, "get_hex_digit() got a 0x%x(%c)", ch, ch);
341
342     if (ch >= '0' && ch <= '9')
343       return ch - '0';
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)
349       ;
350     else {
351       expect_prompt(1);
352       error("Invalid hex digit from remote system.");
353     }
354   }
355 }
356
357 /* get_hex_byte -- Get a byte from monitor and put it in *BYT. 
358  *      Accept any number leading spaces.
359  */
360 static void
361 get_hex_byte (byt)
362      char *byt;
363 {
364   int val;
365
366   val = get_hex_digit (1) << 4;
367   debuglogs (4, "get_hex_digit() -- Read first nibble 0x%x", val);
368  
369   val |= get_hex_digit (0);
370   debuglogs (4, "get_hex_digit() -- Read second nibble 0x%x", val);
371   *byt = val;
372   
373   debuglogs (4, "get_hex_digit() -- Read a 0x%x", val);
374 }
375
376 /* 
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.
379  */
380 static int
381 get_hex_word ()
382 {
383   long val;
384   int i;
385
386   val = 0;
387   for (i = 0; i < 8; i++)
388     val = (val << 4) + get_hex_digit (i == 0);
389   
390   debuglogs (4, "get_hex_word() got a 0x%x.", val);
391
392   return val;
393 }
394
395 /* This is called not only when we first attach, but also when the
396    user types "run" after having attached.  */
397 void
398 monitor_create_inferior (execfile, args, env)
399      char *execfile;
400      char *args;
401      char **env;
402 {
403   int entry_pt;
404
405   if (args && *args)
406     error("Can't pass arguments to remote MONITOR process");
407
408   if (execfile == 0 || exec_bfd == 0)
409     error("No exec file specified");
410
411   entry_pt = (int) bfd_get_start_address (exec_bfd);
412
413   debuglogs (1, "create_inferior(exexfile=%s, args=%s, env=%s)", execfile, args, env);
414
415 /* The "process" (board) is already stopped awaiting our commands, and
416    the program is already downloaded.  We just set its PC and go.  */
417
418   clear_proceed_status ();
419
420   /* Tell wait_for_inferior that we've started a new process.  */
421   init_wait_for_inferior ();
422
423   /* Set up the "saved terminal modes" of the inferior
424      based on what modes we are starting it with.  */
425   target_terminal_init ();
426
427   /* Install inferior's terminal modes.  */
428   target_terminal_inferior ();
429
430   /* insert_step_breakpoint ();  FIXME, do we need this?  */
431
432   /* Let 'er rip... */
433   proceed ((CORE_ADDR)entry_pt, TARGET_SIGNAL_DEFAULT, 0);
434 }
435
436 /*
437  * monitor_open -- open a connection to a remote debugger.
438  *      NAME is the filename used for communication.
439  */
440 static int baudrate = 9600;
441 static char dev_name[100];
442
443 void
444 monitor_open(args, name, from_tty)
445      char *args;
446      char *name;
447      int from_tty;
448 {
449
450   if (args == NULL)
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);
453
454 /*  if (is_open) */
455     monitor_close(0);
456
457   strcpy(dev_name, args);
458   monitor_desc = SERIAL_OPEN(dev_name);
459
460   if (monitor_desc == NULL)
461     perror_with_name(dev_name);
462
463   if (baud_rate != -1) {
464     if (SERIAL_SETBAUDRATE (monitor_desc, baud_rate)) {
465       SERIAL_CLOSE (monitor_desc);
466       perror_with_name (name);
467     }
468   }
469   
470   SERIAL_RAW(monitor_desc);
471
472 #if defined (LOG_FILE)
473   log_file = fopen (LOG_FILE, "w");
474   if (log_file == NULL)
475     perror_with_name (LOG_FILE);
476 #endif
477
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 */
481
482   /* try again to be sure */
483   printf_monitor(INIT_CMD);
484   expect_prompt(1);             /* See if we get a prompt */
485
486   if (from_tty)
487     printf("Remote target %s connected to %s\n", TARGET_NAME, dev_name);
488 }
489
490 /*
491  * monitor_close -- Close out all files and local state before this
492  *      target loses control.
493  */
494
495 void
496 monitor_close (quitting)
497      int quitting;
498 {
499   SERIAL_CLOSE(monitor_desc);
500   monitor_desc = NULL;
501
502   debuglogs (1, "monitor_close (quitting=%d)", quitting);
503
504 #if defined (LOG_FILE)
505   if (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");
510   }
511 #endif
512 }
513
514 /* 
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.
518  */
519 void
520 monitor_detach (from_tty)
521      int from_tty;
522 {
523
524   debuglogs (1, "monitor_detach ()");
525
526   pop_target();         /* calls monitor_close to do the real work */
527   if (from_tty)
528     printf ("Ending remote %s debugging\n", target_shortname);
529 }
530
531 /*
532  * monitor_attach -- attach GDB to the target.
533  */
534 void
535 monitor_attach (args, from_tty)
536      char *args;
537      int from_tty;
538 {
539   if (from_tty)
540     printf ("Starting remote %s debugging\n", target_shortname);
541  
542   debuglogs (1, "monitor_attach (args=%s)", args);
543   
544   printf_monitor (GO_CMD);
545   /* swallow the echo.  */
546   expect (GO_CMD, 1);
547 }
548   
549 /*
550  * monitor_resume -- Tell the remote machine to resume.
551  */
552 void
553 monitor_resume (pid, step, sig)
554      int pid, step;
555      enum target_signal sig;
556 {
557   debuglogs (1, "monitor_resume (step=%d, sig=%d)", step, sig);
558
559   if (step) {
560     printf_monitor (STEP_CMD);
561   } else {
562     printf_monitor (CONT_CMD);
563   }
564 }
565
566 /*
567  * monitor_wait -- Wait until the remote machine stops, then return,
568  *          storing status in status just as `wait' would.
569  */
570 int
571 monitor_wait (pid, status)
572      int pid;
573      struct target_waitstatus *status;
574 {
575   int old_timeout = timeout;
576
577   debuglogs(1, "monitor_wait (), printing extraneous text.");
578   
579   status->kind = TARGET_WAITKIND_EXITED;
580   status->value.integer = 0;
581
582   timeout = 0;          /* Don't time out -- user program is running. */
583
584   expect_prompt(0);    /* Wait for prompt, outputting extraneous text */
585   debuglogs (4, "monitor_wait(), got the prompt.");
586
587   status->kind = TARGET_WAITKIND_STOPPED;
588   status->value.sig = TARGET_SIGNAL_TRAP;
589
590   timeout = old_timeout;
591
592   return 0;
593 }
594
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! */
598
599 static char *
600 get_reg_name (regno)
601      int regno;
602 {
603   static char buf[50];
604   const char *p;
605   char *b;
606
607   b = buf;
608
609   if (regno < 0)
610     return ("");
611
612   for (p = REGNAMES(regno); *p; p++)
613     *b++ = tolower(*p);
614
615   *b = '\000';
616
617   debuglogs (5, "Got name \"%s\" from regno #%d.", buf, regno);
618
619   return buf;
620 }
621
622 /*
623  * monitor_fetch_registers -- read the remote registers into the
624  *      block regs.
625  */
626 void
627 monitor_fetch_registers ()
628 {
629   int regno;
630
631   /* yeah yeah, i know this is horribly inefficient.  but it isn't done
632      very often...  i'll clean it up later.  */
633
634   for (regno = 0; regno <= PC_REGNUM; regno++)
635     monitor_fetch_register(regno);
636 }
637
638 /* 
639  * monitor_fetch_register -- fetch register REGNO, or all registers if REGNO
640  *      is -1. Returns errno value.
641  */
642 void
643 monitor_fetch_register (regno)
644      int regno;
645 {
646   int val, j;
647
648   debuglogs (1, "monitor_fetch_register (reg=%s)", get_reg_name (regno));
649
650   if (regno < 0) {
651     monitor_fetch_registers ();
652   } else {
653     char *name = get_reg_name (regno);
654     if (STREQ(name, ""))
655       return;
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);
660     }
661     
662     val =  get_hex_word();                      /* get the value, ignore junk */
663     supply_register (regno, (char *) &val);
664     
665     if (*ROMDELIM(GET_REG) != 0) {
666 /***  expect (ROMRES(GET_REG)); ***/
667       printf_monitor (CMD_END);
668     }
669     expect_prompt (1);
670   }
671   return;
672 }
673
674 /* Store the remote registers from the contents of the block REGS.  */
675
676 void
677 monitor_store_registers ()
678 {
679   int regno;
680
681   debuglogs (1, "monitor_store_registers()");
682
683   for (regno = 0; regno <= PC_REGNUM; regno++)
684     monitor_store_register(regno);
685
686   registers_changed ();
687 }
688
689 /* 
690  * monitor_store_register -- store register REGNO, or all if REGNO == 0.
691  *      return errno value.
692  */
693 void
694 monitor_store_register (regno)
695      int regno;
696 {
697   char *name;
698   int i;
699
700   i = read_register(regno);
701
702   debuglogs (1, "monitor_store_register (regno=%d)", regno);
703
704   if (regno < 0)
705     monitor_store_registers ();
706   else {
707       debuglogs (3, "Setting register %s to 0x%x", get_reg_name (regno), read_register (regno));
708     
709     name = get_reg_name (regno);
710     if (STREQ(name, ""))
711       return;
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);
716       get_hex_word(1);
717       printf_monitor ("%d%s\n", i, CMD_END);
718     }
719     expect_prompt (1);
720   }
721   return;
722   
723 #if 0
724       printf_monitor (SET_REG, get_reg_name (regno),
725                       read_register (regno));
726       expect_prompt (1);
727     }
728 #endif
729 }
730
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
735    debugged.  */
736
737 void
738 monitor_prepare_to_store ()
739 {
740   /* Do nothing, since we can store individual regs */
741 }
742
743 void
744 monitor_files_info ()
745 {
746   printf ("\tAttached to %s at %d baud.\n",
747           dev_name, baudrate);
748 }
749
750 /*
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.
753  */
754 int
755 monitor_write_inferior_memory (memaddr, myaddr, len)
756      CORE_ADDR memaddr;
757      unsigned char *myaddr;
758      int len;
759 {
760   int i;
761   char buf[10];
762
763   debuglogs (1, "monitor_write_inferior_memory (memaddr=0x%x, myaddr=0x%x, len=%d)", memaddr, myaddr, len);
764
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);
769       expect (CMD_DELIM);
770       printf_monitor ("%x", myaddr[i]);
771     }
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) {
776       expect (CMD_DELIM);
777       printf_monitor (CMD_END);
778     }
779     expect_prompt (1);
780   }
781   return len;
782 }
783
784 /*
785  * monitor_read_inferior_memory -- read LEN bytes from inferior memory
786  *      at MEMADDR.  Put the result at debugger address MYADDR.  Returns
787  *      length moved.
788  */
789 int
790 monitor_read_inferior_memory(memaddr, myaddr, len)
791      CORE_ADDR memaddr;
792      char *myaddr;
793      int len;
794 {
795   int i, j;
796   char buf[20];
797
798   /* Number of bytes read so far.  */
799   int count;
800
801   /* Starting address of this pass.  */
802   unsigned long startaddr;
803
804   /* Number of bytes to read in this pass.  */
805   int len_this_pass;
806
807   debuglogs (1, "monitor_read_inferior_memory (memaddr=0x%x, myaddr=0x%x, len=%d)", memaddr, myaddr, len);
808
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
817      to do that.  */
818   if (((memaddr - 1) + len) < memaddr) {
819     errno = EIO;
820     return 0;
821   }
822   
823   startaddr = memaddr;
824   count = 0;
825   while (count < len) {
826     len_this_pass = 16;
827     if ((startaddr % 16) != 0)
828       len_this_pass -= startaddr % 16;
829     if (len_this_pass > (len - count))
830       len_this_pass = (len - count);
831
832     debuglogs (3, "Display %d bytes at %x", len_this_pass, startaddr);
833     
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);
839       } else {
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 */
843       }
844       get_hex_byte (&myaddr[count++]);          /* get the value at this address */
845
846       if (*ROMDELIM(GET_MEM) != 0) {
847         printf_monitor (CMD_END);
848       }
849       expect_prompt (1);
850       startaddr += 1;
851     }
852   }
853   return len;
854 }
855
856 /* FIXME-someday!  merge these two.  */
857 int
858 monitor_xfer_inferior_memory (memaddr, myaddr, len, write, target)
859      CORE_ADDR memaddr;
860      char *myaddr;
861      int len;
862      int write;
863      struct target_ops *target;         /* ignored */
864 {
865   if (write)
866     return monitor_write_inferior_memory (memaddr, myaddr, len);
867   else
868     return monitor_read_inferior_memory (memaddr, myaddr, len);
869 }
870
871 void
872 monitor_kill (args, from_tty)
873      char *args;
874      int from_tty;
875 {
876   return;               /* ignore attempts to kill target system */
877 }
878
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
882    instructions.  */
883
884 void
885 monitor_mourn_inferior ()
886 {
887   remove_breakpoints ();
888   generic_mourn_inferior ();    /* Do all the proper things now */
889 }
890
891 #define MAX_MONITOR_BREAKPOINTS 16
892
893 extern int memory_breakpoint_size;
894 static CORE_ADDR breakaddr[MAX_MONITOR_BREAKPOINTS] = {0};
895
896 /*
897  * monitor_insert_breakpoint -- add a breakpoint
898  */
899 int
900 monitor_insert_breakpoint (addr, shadow)
901      CORE_ADDR addr;
902      char *shadow;
903 {
904   int i;
905
906   debuglogs (1, "monitor_insert_breakpoint() addr = 0x%x", addr);
907
908   for (i = 0; i <= MAX_MONITOR_BREAKPOINTS; i++) {
909     if (breakaddr[i] == 0) {
910       breakaddr[i] = addr;
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);
915       expect_prompt(1);
916       return 0;
917     }
918   }
919
920   fprintf(stderr, "Too many breakpoints (> 16) for monitor\n");
921   return 1;
922 }
923
924 /*
925  * _remove_breakpoint -- Tell the monitor to remove a breakpoint
926  */
927 int
928 monitor_remove_breakpoint (addr, shadow)
929      CORE_ADDR addr;
930      char *shadow;
931 {
932   int i;
933
934   debuglogs (1, "monitor_remove_breakpoint() addr = 0x%x", addr);
935
936   for (i = 0; i < MAX_MONITOR_BREAKPOINTS; i++) {
937     if (breakaddr[i] == addr) {
938       breakaddr[i] = 0;
939       /* some monitors remove breakpoints based on the address */
940       if (CLR_BREAK_ADDR)   
941         printf_monitor(CLR_BREAK_CMD, addr);
942       else
943         printf_monitor(CLR_BREAK_CMD, i);
944       expect_prompt(1);
945       return 0;
946     }
947   }
948   fprintf(stderr, "Can't find breakpoint associated with 0x%x\n", addr);
949   return 1;
950 }
951
952 /* Load a file. This is usually an srecord, which is ascii. No 
953    protocol, just sent line by line. */
954
955 #define DOWNLOAD_LINE_SIZE 100
956 void
957 monitor_load (arg)
958     char        *arg;
959 {
960   FILE *download;
961   char buf[DOWNLOAD_LINE_SIZE];
962   int i, bytes_read;
963
964   if (sr_get_debug())
965     printf ("Loading %s to monitor\n", arg);
966
967   download = fopen (arg, "r");
968   if (download == NULL)
969     {
970     error (sprintf (buf, "%s Does not exist", arg));
971     return;
972   }
973
974   printf_monitor (LOAD_CMD);
975 /*  expect ("Waiting for S-records from host... ", 1); */
976
977   while (!feof (download))
978     {
979       bytes_read = fread (buf, sizeof (char), DOWNLOAD_LINE_SIZE, download);
980       if (hashmark)
981         {
982           putchar ('.');
983           fflush (stdout);
984         }
985
986       if (SERIAL_WRITE(monitor_desc, buf, bytes_read)) {
987         fprintf(stderr, "SERIAL_WRITE failed: (while downloading) %s\n", safe_strerror(errno));
988         break;
989       }
990       i = 0;
991       while (i++ <=200000) {} ;                         /* Ugly HACK, probably needs flow control */
992       if (bytes_read < DOWNLOAD_LINE_SIZE)
993         {
994           if (!feof (download))
995             error ("Only read %d bytes\n", bytes_read);
996           break;
997         }
998     }
999
1000   if (hashmark)
1001     {
1002       putchar ('\n');
1003     }
1004   if (!feof (download))
1005     error ("Never got EOF while downloading");
1006   fclose (download);
1007 }
1008
1009 /* 
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.
1014  */
1015 void
1016 monitor_command (args, fromtty)
1017      char       *args;
1018      int        fromtty;
1019 {
1020
1021   char *p;
1022   char c, cp;
1023   p = PROMPT;
1024
1025   debuglogs (1, "monitor_command (args=%s)", args);
1026
1027   if (monitor_desc == NULL)
1028     error("monitor target not open.");
1029
1030   if (!args)
1031     error("Missing command.");
1032         
1033   printf_monitor ("%s\n", args);
1034
1035   expect_prompt(0);
1036 }
1037
1038 /*
1039  * _initialize_remote_monitors -- setup a few addtitional commands that
1040  *              are usually only used by monitors.
1041  */
1042 void
1043 _initialize_remote_monitors ()
1044 {
1045   struct cmd_list_element *c;
1046
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);
1053
1054   add_show_from_set (add_set_cmd ("hash", no_class, var_boolean,
1055                                   (char *)&hashmark,
1056                                   "Set display of activity while downloading a file.\n\
1057 When enabled, a period \'.\' is displayed.",
1058                                   &setlist),
1059                      &showlist);
1060
1061   /* generic monitor command */
1062   add_com ("monitor", class_obscure, monitor_command,
1063            "Send a command to the debug monitor."); 
1064 }