xref: /openbsd-src/gnu/usr.bin/binutils/gdb/monitor.c (revision e93f7393d476ad1c5192174ea92f14ecc97182e7)
1 /* Remote debugging interface for boot monitors, for GDB.
2    Copyright 1990, 1991, 1992, 1993, 1995, 1996
3    Free Software Foundation, Inc.
4    Contributed by Cygnus Support.  Written by Rob Savoye for Cygnus.
5    Resurrected from the ashes by Stu Grossman.
6 
7 This file is part of GDB.
8 
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
13 
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18 
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
22 
23 /* This file was derived from various remote-* modules. It is a collection
24    of generic support functions so GDB can talk directly to a ROM based
25    monitor. This saves use from having to hack an exception based handler
26    into existance, and makes for quick porting.
27 
28    This module talks to a debug monitor called 'MONITOR', which
29    We communicate with MONITOR via either a direct serial line, or a TCP
30    (or possibly TELNET) stream to a terminal multiplexor,
31    which in turn talks to the target board.  */
32 
33 /* FIXME 32x64: This code assumes that registers and addresses are at
34    most 32 bits long.  If they can be larger, you will need to declare
35    values as LONGEST and use %llx or some such to print values when
36    building commands to send to the monitor.  Since we don't know of
37    any actual 64-bit targets with ROM monitors that use this code,
38    it's not an issue right now.  -sts 4/18/96  */
39 
40 #include "defs.h"
41 #include "gdbcore.h"
42 #include "target.h"
43 #include "wait.h"
44 #ifdef ANSI_PROTOTYPES
45 #include <stdarg.h>
46 #else
47 #include <varargs.h>
48 #endif
49 #include <signal.h>
50 #include <ctype.h>
51 #include "gdb_string.h"
52 #include <sys/types.h>
53 #include "command.h"
54 #include "serial.h"
55 #include "monitor.h"
56 #include "gdbcmd.h"
57 #include "inferior.h"
58 #include "gnu-regex.h"
59 #include "dcache.h"
60 #include "srec.h"
61 
62 static char *dev_name;
63 static struct target_ops *targ_ops;
64 
65 static int readchar PARAMS ((int timeout));
66 
67 static void monitor_command PARAMS ((char *args, int fromtty));
68 
69 static void monitor_fetch_register PARAMS ((int regno));
70 static void monitor_store_register PARAMS ((int regno));
71 
72 static void monitor_detach PARAMS ((char *args, int from_tty));
73 static void monitor_resume PARAMS ((int pid, int step, enum target_signal sig));
74 static void monitor_interrupt PARAMS ((int signo));
75 static void monitor_interrupt_twice PARAMS ((int signo));
76 static void monitor_interrupt_query PARAMS ((void));
77 static void monitor_wait_cleanup PARAMS ((int old_timeout));
78 
79 static int monitor_wait PARAMS ((int pid, struct target_waitstatus *status));
80 static void monitor_fetch_registers PARAMS ((int regno));
81 static void monitor_store_registers PARAMS ((int regno));
82 static void monitor_prepare_to_store PARAMS ((void));
83 static int monitor_xfer_memory PARAMS ((CORE_ADDR memaddr, char *myaddr, int len, int write, struct target_ops *target));
84 static void monitor_files_info PARAMS ((struct target_ops *ops));
85 static int monitor_insert_breakpoint PARAMS ((CORE_ADDR addr, char *shadow));
86 static int monitor_remove_breakpoint PARAMS ((CORE_ADDR addr, char *shadow));
87 static void monitor_kill PARAMS ((void));
88 static void monitor_load PARAMS ((char *file, int from_tty));
89 static void monitor_mourn_inferior PARAMS ((void));
90 static void monitor_stop PARAMS ((void));
91 static void monitor_debug PARAMS ((char *prefix, char *string, char *suffix));
92 
93 static int monitor_read_memory PARAMS ((CORE_ADDR addr, char *myaddr,int len));
94 static int monitor_write_memory PARAMS ((CORE_ADDR addr, char *myaddr,int len));
95 
96 static int monitor_expect_regexp PARAMS ((struct re_pattern_buffer *pat,
97 					  char *buf, int buflen));
98 static int from_hex PARAMS ((int a));
99 static unsigned long get_hex_word PARAMS ((void));
100 
101 static struct monitor_ops *current_monitor;
102 
103 static int hashmark;		/* flag set by "set hash" */
104 
105 static int timeout = 30;
106 
107 static int in_monitor_wait = 0;	/* Non-zero means we are in monitor_wait() */
108 
109 static void (*ofunc)();		/* Old SIGINT signal handler */
110 
111 /* Descriptor for I/O to remote machine.  Initialize it to NULL so
112    that monitor_open knows that we don't have a file open when the
113    program starts.  */
114 
115 static serial_t monitor_desc = NULL;
116 
117 /* Pointer to regexp pattern matching data */
118 
119 static struct re_pattern_buffer register_pattern;
120 static char register_fastmap[256];
121 
122 static struct re_pattern_buffer getmem_resp_delim_pattern;
123 static char getmem_resp_delim_fastmap[256];
124 
125 static int dump_reg_flag;	/* Non-zero means do a dump_registers cmd when
126 				   monitor_wait wakes up.  */
127 
128 static DCACHE *remote_dcache;
129 static int first_time=0;	/* is this the first time we're executing after
130 					gaving created the child proccess? */
131 
132 /* monitor_debug is like fputs_unfiltered, except it prints special
133    characters in printable fashion.  */
134 
135 static void
136 monitor_debug (prefix, string, suffix)
137      char *prefix;
138      char *string;
139      char *suffix;
140 {
141   int ch;
142 
143   /* print prefix and suffix after each line */
144   static int new_line=1;
145   static char *prev_prefix = "";
146   static char *prev_suffix = "";
147 
148   /* if the prefix is changing, print the previous suffix, a new line,
149      and the new prefix */
150   if (strcmp(prev_prefix, prefix) != 0 && !new_line)
151     {
152       fputs_unfiltered (prev_suffix, gdb_stderr);
153       fputs_unfiltered ("\n", gdb_stderr);
154       fputs_unfiltered (prefix, gdb_stderr);
155     }
156   prev_prefix = prefix;
157   prev_suffix = suffix;
158 
159   /* print prefix if last char was a newline*/
160 
161   if (new_line == 1) {
162     fputs_unfiltered (prefix, gdb_stderr);
163     new_line=0;
164   }
165   if (strchr(string,'\n'))	/* save state for next call */
166     new_line=1;
167 
168   while ((ch = *string++) != '\0')
169     {
170       switch (ch) {
171       default:
172 	if (isprint (ch))
173 	  fputc_unfiltered (ch, gdb_stderr);
174 
175 	else
176 	  fprintf_unfiltered (gdb_stderr, "\\%03o", ch);
177 
178 	break;
179 
180       case '\\': fputs_unfiltered ("\\\\",  gdb_stderr);	break;
181       case '\b': fputs_unfiltered ("\\b",   gdb_stderr);	break;
182       case '\f': fputs_unfiltered ("\\f",   gdb_stderr);	break;
183       case '\n': fputs_unfiltered ("\\n",   gdb_stderr);	break;
184       case '\r': fputs_unfiltered ("\\r",   gdb_stderr);	break;
185       case '\t': fputs_unfiltered ("\\t",   gdb_stderr);	break;
186       case '\v': fputs_unfiltered ("\\v",   gdb_stderr);	break;
187       }
188     }
189 
190   if (new_line==1) {	/* print suffix if last char was a newline */
191     fputs_unfiltered (suffix, gdb_stderr);
192     fputs_unfiltered ("\n", gdb_stderr);
193   }
194 }
195 
196 /* monitor_printf_noecho -- Send data to monitor, but don't expect an echo.
197    Works just like printf.  */
198 
199 void
200 #ifdef ANSI_PROTOTYPES
201 monitor_printf_noecho (char *pattern, ...)
202 #else
203 monitor_printf_noecho (va_alist)
204      va_dcl
205 #endif
206 {
207   va_list args;
208   char sndbuf[2000];
209   int len;
210 
211 #if ANSI_PROTOTYPES
212   va_start (args, pattern);
213 #else
214   char *pattern;
215   va_start (args);
216   pattern = va_arg (args, char *);
217 #endif
218 
219   vsprintf (sndbuf, pattern, args);
220 
221   if (remote_debug > 0)
222     monitor_debug ("sent -->", sndbuf, "<--");
223 
224   len = strlen (sndbuf);
225 
226   if (len + 1 > sizeof sndbuf)
227     abort ();
228 
229   if (SERIAL_WRITE(monitor_desc, sndbuf, len))
230     fprintf_unfiltered (stderr, "SERIAL_WRITE failed: %s\n", safe_strerror (errno));
231 }
232 
233 /* monitor_printf -- Send data to monitor and check the echo.  Works just like
234    printf.  */
235 
236 void
237 #ifdef ANSI_PROTOTYPES
238 monitor_printf (char *pattern, ...)
239 #else
240 monitor_printf (va_alist)
241      va_dcl
242 #endif
243 {
244   va_list args;
245   char sndbuf[2000];
246   int len;
247 
248 #ifdef ANSI_PROTOTYPES
249   va_start (args, pattern);
250 #else
251   char *pattern;
252   va_start (args);
253   pattern = va_arg (args, char *);
254 #endif
255 
256   vsprintf (sndbuf, pattern, args);
257 
258   if (remote_debug > 0)
259     monitor_debug ("sent -->", sndbuf, "<--");
260 
261   len = strlen (sndbuf);
262 
263   if (len + 1 > sizeof sndbuf)
264     abort ();
265 
266   if (SERIAL_WRITE(monitor_desc, sndbuf, len))
267     fprintf_unfiltered (stderr, "SERIAL_WRITE failed: %s\n", safe_strerror (errno));
268 
269   /* We used to expect that the next immediate output was the characters we
270      just output, but sometimes some extra junk appeared before the characters
271      we expected, like an extra prompt, or a portmaster sending telnet negotiations.
272      So, just start searching for what we sent, and skip anything unknown.  */
273   monitor_expect (sndbuf, (char *)0, 0);
274 }
275 
276 /* Read a character from the remote system, doing all the fancy
277    timeout stuff.  */
278 
279 static int
280 readchar (timeout)
281      int timeout;
282 {
283   int c;
284   static enum { last_random, last_nl, last_cr, last_crnl } state = last_random;
285   int looping;
286 
287   do
288     {
289       looping = 0;
290       c = SERIAL_READCHAR (monitor_desc, timeout);
291 
292       if (c >= 0)
293 	{
294 	  c &= 0x7f;
295 	  if (remote_debug > 0)
296 	    {
297 	      char buf[2];
298 	      buf[0] = c;
299 	      buf[1] = '\0';
300 	      monitor_debug ("read -->", buf, "<--");
301 	    }
302 	}
303 
304       /* Canonicialize \n\r combinations into one \r */
305       if ((current_monitor->flags & MO_HANDLE_NL) != 0)
306 	{
307 	  if ((c == '\r' && state == last_nl)
308 	      || (c == '\n' && state == last_cr))
309 	    {
310 	      state = last_crnl;
311 	      looping = 1;
312 	    }
313 	  else if (c == '\r')
314 	    state = last_cr;
315 	  else if (c != '\n')
316 	    state = last_random;
317 	  else
318 	    {
319 	      state = last_nl;
320 	      c = '\r';
321 	    }
322 	}
323     }
324   while (looping);
325 
326   if (c >= 0)
327     return c;
328 
329   if (c == SERIAL_TIMEOUT)
330 #ifdef MAINTENANCE_CMDS
331     if (in_monitor_wait)	/* Watchdog went off */
332       {
333 	target_mourn_inferior ();
334 	error ("Watchdog has expired.  Target detached.\n");
335       }
336     else
337 #endif
338       error ("Timeout reading from remote system.");
339 
340   perror_with_name ("remote-monitor");
341 }
342 
343 /* Scan input from the remote system, until STRING is found.  If BUF is non-
344    zero, then collect input until we have collected either STRING or BUFLEN-1
345    chars.  In either case we terminate BUF with a 0.  If input overflows BUF
346    because STRING can't be found, return -1, else return number of chars in BUF
347    (minus the terminating NUL).  Note that in the non-overflow case, STRING
348    will be at the end of BUF.  */
349 
350 int
351 monitor_expect (string, buf, buflen)
352      char *string;
353      char *buf;
354      int buflen;
355 {
356   char *p = string;
357   int obuflen = buflen;
358   int c;
359   extern struct target_ops *targ_ops;
360 
361   immediate_quit = 1;
362   while (1)
363     {
364       if (buf)
365 	{
366 	  if (buflen < 2)
367 	    {
368 	      *buf = '\000';
369 	      immediate_quit = 0;
370 	      return -1;
371 	    }
372 
373 	  c = readchar (timeout);
374 	  if (c == '\000')
375 	    continue;
376 	  *buf++ = c;
377 	  buflen--;
378 	}
379       else
380 	c = readchar (timeout);
381 
382       /* Don't expect any ^C sent to be echoed */
383 
384       if (*p == '\003' || c == *p)
385 	{
386 	  p++;
387 	  if (*p == '\0')
388 	    {
389 	      immediate_quit = 0;
390 
391 	      if (buf)
392 		{
393 		  *buf++ = '\000';
394 		  return obuflen - buflen;
395 		}
396 	      else
397 		return 0;
398 	    }
399 	}
400       else if ((c == '\021' || c == '\023') &&
401 	       (strcmp(targ_ops->to_shortname, "m32r") == 0))
402 	{ /* m32r monitor emits random DC1/DC3 chars */
403 	  continue;
404 	}
405       else
406 	{
407 	  p = string;
408 	  if (c == *p)
409 	    p++;
410 	}
411     }
412 }
413 
414 /* Search for a regexp.  */
415 
416 static int
417 monitor_expect_regexp (pat, buf, buflen)
418      struct re_pattern_buffer *pat;
419      char *buf;
420      int buflen;
421 {
422   char *mybuf;
423   char *p;
424 
425   if (buf)
426     mybuf = buf;
427   else
428     {
429       mybuf = alloca (1024);
430       buflen = 1024;
431     }
432 
433   p = mybuf;
434   while (1)
435     {
436       int retval;
437 
438       if (p - mybuf >= buflen)
439 	{			/* Buffer about to overflow */
440 
441 /* On overflow, we copy the upper half of the buffer to the lower half.  Not
442    great, but it usually works... */
443 
444 	  memcpy (mybuf, mybuf + buflen / 2, buflen / 2);
445 	  p = mybuf + buflen / 2;
446 	}
447 
448       *p++ = readchar (timeout);
449 
450       retval = re_search (pat, mybuf, p - mybuf, 0, p - mybuf, NULL);
451       if (retval >= 0)
452 	return 1;
453     }
454 }
455 
456 /* Keep discarding input until we see the MONITOR prompt.
457 
458    The convention for dealing with the prompt is that you
459    o give your command
460    o *then* wait for the prompt.
461 
462    Thus the last thing that a procedure does with the serial line will
463    be an monitor_expect_prompt().  Exception: monitor_resume does not
464    wait for the prompt, because the terminal is being handed over to
465    the inferior.  However, the next thing which happens after that is
466    a monitor_wait which does wait for the prompt.  Note that this
467    includes abnormal exit, e.g. error().  This is necessary to prevent
468    getting into states from which we can't recover.  */
469 
470 int
471 monitor_expect_prompt (buf, buflen)
472      char *buf;
473      int buflen;
474 {
475   return monitor_expect (current_monitor->prompt, buf, buflen);
476 }
477 
478 /* Get N 32-bit words from remote, each preceded by a space, and put
479    them in registers starting at REGNO.  */
480 
481 static unsigned long
482 get_hex_word ()
483 {
484   unsigned long val;
485   int i;
486   int ch;
487 
488   do
489     ch = readchar (timeout);
490   while (isspace(ch));
491 
492   val = from_hex (ch);
493 
494   for (i = 7; i >= 1; i--)
495     {
496       ch = readchar (timeout);
497       if (!isxdigit (ch))
498 	break;
499       val = (val << 4) | from_hex (ch);
500     }
501 
502   return val;
503 }
504 
505 static void
506 compile_pattern (pattern, compiled_pattern, fastmap)
507      char *pattern;
508      struct re_pattern_buffer *compiled_pattern;
509      char *fastmap;
510 {
511   int tmp;
512   char *val;
513 
514   compiled_pattern->fastmap = fastmap;
515 
516   tmp = re_set_syntax (RE_SYNTAX_EMACS);
517   val = re_compile_pattern (pattern,
518 			    strlen (pattern),
519 			    compiled_pattern);
520   re_set_syntax (tmp);
521 
522   if (val)
523     error ("compile_pattern: Can't compile pattern string `%s': %s!", pattern, val);
524 
525   if (fastmap)
526     re_compile_fastmap (compiled_pattern);
527 }
528 
529 /* Open a connection to a remote debugger. NAME is the filename used
530    for communication.  */
531 
532 void
533 monitor_open (args, mon_ops, from_tty)
534      char *args;
535      struct monitor_ops *mon_ops;
536      int from_tty;
537 {
538   char *name;
539   int i;
540   char **p;
541 
542   if (mon_ops->magic != MONITOR_OPS_MAGIC)
543     error ("Magic number of monitor_ops struct wrong.");
544 
545   targ_ops = mon_ops->target;
546   name = targ_ops->to_shortname;
547 
548   if (!args)
549     error ("Use `target %s DEVICE-NAME' to use a serial port, or \n\
550 `target %s HOST-NAME:PORT-NUMBER' to use a network connection.", name, name);
551 
552   target_preopen (from_tty);
553 
554   /* Setup pattern for register dump */
555 
556   if (mon_ops->register_pattern)
557     compile_pattern (mon_ops->register_pattern, &register_pattern,
558 		     register_fastmap);
559 
560   if (mon_ops->getmem.resp_delim)
561     compile_pattern (mon_ops->getmem.resp_delim, &getmem_resp_delim_pattern,
562 		     getmem_resp_delim_fastmap);
563 
564   unpush_target (targ_ops);
565 
566   if (dev_name)
567     free (dev_name);
568   dev_name = strsave (args);
569 
570   monitor_desc = SERIAL_OPEN (dev_name);
571 
572   if (!monitor_desc)
573     perror_with_name (dev_name);
574 
575   if (baud_rate != -1)
576     {
577       if (SERIAL_SETBAUDRATE (monitor_desc, baud_rate))
578 	{
579 	  SERIAL_CLOSE (monitor_desc);
580 	  perror_with_name (dev_name);
581 	}
582     }
583 
584   SERIAL_RAW (monitor_desc);
585 
586   SERIAL_FLUSH_INPUT (monitor_desc);
587 
588   /* some systems only work with 2 stop bits */
589 
590   SERIAL_SETSTOPBITS (monitor_desc, mon_ops->stopbits);
591 
592   current_monitor = mon_ops;
593 
594   /* See if we can wake up the monitor.  First, try sending a stop sequence,
595      then send the init strings.  Last, remove all breakpoints.  */
596 
597   if (current_monitor->stop)
598     {
599       monitor_stop ();
600       if ((current_monitor->flags & MO_NO_ECHO_ON_OPEN) == 0)
601         {
602         monitor_expect_prompt (NULL, 0);
603       }
604     }
605 
606   /* wake up the monitor and see if it's alive */
607   for (p = mon_ops->init; *p != NULL; p++)
608     {
609       /* Some of the characters we send may not be echoed,
610 	 but we hope to get a prompt at the end of it all. */
611 
612       if ((current_monitor->flags & MO_NO_ECHO_ON_OPEN) == 0)
613         monitor_printf(*p);
614       else
615         monitor_printf_noecho (*p);
616       monitor_expect_prompt (NULL, 0);
617     }
618 
619   SERIAL_FLUSH_INPUT (monitor_desc);
620 
621   /* Remove all breakpoints */
622 
623   if (mon_ops->clr_all_break)
624     {
625       monitor_printf (mon_ops->clr_all_break);
626       monitor_expect_prompt (NULL, 0);
627     }
628 
629   if (from_tty)
630     printf_unfiltered ("Remote target %s connected to %s\n", name, dev_name);
631 
632   push_target (targ_ops);
633 
634   inferior_pid = 42000;		/* Make run command think we are busy... */
635 
636   /* Give monitor_wait something to read */
637 
638   monitor_printf (current_monitor->line_term);
639 
640   remote_dcache = dcache_init (monitor_read_memory, monitor_write_memory);
641 
642   start_remote ();
643 }
644 
645 /* Close out all files and local state before this target loses
646    control.  */
647 
648 void
649 monitor_close (quitting)
650      int quitting;
651 {
652   if (monitor_desc)
653     SERIAL_CLOSE (monitor_desc);
654   monitor_desc = NULL;
655 }
656 
657 /* Terminate the open connection to the remote debugger.  Use this
658    when you want to detach and do something else with your gdb.  */
659 
660 static void
661 monitor_detach (args, from_tty)
662      char *args;
663      int from_tty;
664 {
665   pop_target ();		/* calls monitor_close to do the real work */
666   if (from_tty)
667     printf_unfiltered ("Ending remote %s debugging\n", target_shortname);
668 }
669 
670 /* Convert VALSTR into the target byte-ordered value of REGNO and store it.  */
671 
672 char *
673 monitor_supply_register (regno, valstr)
674      int regno;
675      char *valstr;
676 {
677   unsigned int val;
678   unsigned char regbuf[MAX_REGISTER_RAW_SIZE];
679   char *p;
680 
681   val = strtoul (valstr, &p, 16);
682 
683   if (val == 0 && valstr == p)
684     error ("monitor_supply_register (%d):  bad value from monitor: %s.",
685 	   regno, valstr);
686 
687   /* supply register stores in target byte order, so swap here */
688 
689   store_unsigned_integer (regbuf, REGISTER_RAW_SIZE (regno), val);
690 
691   supply_register (regno, regbuf);
692 
693   return p;
694 }
695 
696 /* Tell the remote machine to resume.  */
697 
698 static void
699 monitor_resume (pid, step, sig)
700      int pid, step;
701      enum target_signal sig;
702 {
703   /* Some monitors require a different command when starting a program */
704   if (current_monitor->flags & MO_RUN_FIRST_TIME && first_time == 1)
705     {
706       first_time = 0;
707       monitor_printf ("run\r");
708       if (current_monitor->flags & MO_NEED_REGDUMP_AFTER_CONT)
709 	    dump_reg_flag = 1;
710       return;
711     }
712   dcache_flush (remote_dcache);
713   if (step)
714     monitor_printf (current_monitor->step);
715   else
716     {
717       monitor_printf (current_monitor->cont);
718       if (current_monitor->flags & MO_NEED_REGDUMP_AFTER_CONT)
719 	dump_reg_flag = 1;
720     }
721 }
722 
723 /* Parse the output of a register dump command.  A monitor specific
724    regexp is used to extract individual register descriptions of the
725    form REG=VAL.  Each description is split up into a name and a value
726    string which are passed down to monitor specific code.  */
727 
728 static char *
729 parse_register_dump (buf, len)
730      char *buf;
731      int len;
732 {
733   while (1)
734     {
735       int regnamelen, vallen;
736       char *regname, *val;
737       /* Element 0 points to start of register name, and element 1
738 	 points to the start of the register value.  */
739       struct re_registers register_strings;
740 
741       if (re_search (&register_pattern, buf, len, 0, len,
742 		     &register_strings) == -1)
743 	break;
744 
745       regnamelen = register_strings.end[1] - register_strings.start[1];
746       regname = buf + register_strings.start[1];
747       vallen = register_strings.end[2] - register_strings.start[2];
748       val = buf + register_strings.start[2];
749 
750       current_monitor->supply_register (regname, regnamelen, val, vallen);
751 
752       buf += register_strings.end[0];
753       len -= register_strings.end[0];
754     }
755 }
756 
757 /* Send ^C to target to halt it.  Target will respond, and send us a
758    packet.  */
759 
760 static void
761 monitor_interrupt (signo)
762      int signo;
763 {
764   /* If this doesn't work, try more severe steps.  */
765   signal (signo, monitor_interrupt_twice);
766 
767   if (remote_debug)
768     printf_unfiltered ("monitor_interrupt called\n");
769 
770   target_stop ();
771 }
772 
773 /* The user typed ^C twice.  */
774 
775 static void
776 monitor_interrupt_twice (signo)
777      int signo;
778 {
779   signal (signo, ofunc);
780 
781   monitor_interrupt_query ();
782 
783   signal (signo, monitor_interrupt);
784 }
785 
786 /* Ask the user what to do when an interrupt is received.  */
787 
788 static void
789 monitor_interrupt_query ()
790 {
791   target_terminal_ours ();
792 
793   if (query ("Interrupted while waiting for the program.\n\
794 Give up (and stop debugging it)? "))
795     {
796       target_mourn_inferior ();
797       return_to_top_level (RETURN_QUIT);
798     }
799 
800   target_terminal_inferior ();
801 }
802 
803 static void
804 monitor_wait_cleanup (old_timeout)
805      int old_timeout;
806 {
807   timeout = old_timeout;
808   signal (SIGINT, ofunc);
809   in_monitor_wait = 0;
810 }
811 
812 /* Wait until the remote machine stops, then return, storing status in
813    status just as `wait' would.  */
814 
815 static int
816 monitor_wait (pid, status)
817      int pid;
818      struct target_waitstatus *status;
819 {
820   int old_timeout = timeout;
821   char buf[1024];
822   int resp_len;
823   struct cleanup *old_chain;
824 
825   status->kind = TARGET_WAITKIND_EXITED;
826   status->value.integer = 0;
827 
828   old_chain = make_cleanup (monitor_wait_cleanup, old_timeout);
829 
830 #ifdef MAINTENANCE_CMDS
831   in_monitor_wait = 1;
832   timeout = watchdog > 0 ? watchdog : -1;
833 #else
834   timeout = -1;		/* Don't time out -- user program is running. */
835 #endif
836 
837   ofunc = (void (*)()) signal (SIGINT, monitor_interrupt);
838 
839   do
840     {
841       resp_len = monitor_expect_prompt (buf, sizeof (buf));
842 
843       if (resp_len <= 0)
844 	fprintf_unfiltered (gdb_stderr, "monitor_wait:  excessive response from monitor: %s.", buf);
845     }
846   while (resp_len < 0);
847 
848   signal (SIGINT, ofunc);
849 
850   timeout = old_timeout;
851 
852   if (dump_reg_flag && current_monitor->dump_registers)
853     {
854       dump_reg_flag = 0;
855 
856       monitor_printf (current_monitor->dump_registers);
857       resp_len = monitor_expect_prompt (buf, sizeof (buf));
858     }
859 
860   if (current_monitor->register_pattern)
861     parse_register_dump (buf, resp_len);
862 
863   status->kind = TARGET_WAITKIND_STOPPED;
864   status->value.sig = TARGET_SIGNAL_TRAP;
865 
866   discard_cleanups (old_chain);
867 
868   in_monitor_wait = 0;
869 
870   return inferior_pid;
871 }
872 
873 /* Fetch register REGNO, or all registers if REGNO is -1. Returns
874    errno value.  */
875 
876 static void
877 monitor_fetch_register (regno)
878      int regno;
879 {
880   char *name;
881   static char zerobuf[MAX_REGISTER_RAW_SIZE] = {0};
882   char regbuf[MAX_REGISTER_RAW_SIZE * 2 + 1];
883   int i;
884 
885   name = current_monitor->regnames[regno];
886 
887   if (!name)
888     {
889       supply_register (regno, zerobuf);
890       return;
891     }
892 
893   /* send the register examine command */
894 
895   monitor_printf (current_monitor->getreg.cmd, name);
896 
897   /* If RESP_DELIM is specified, we search for that as a leading
898      delimiter for the register value.  Otherwise, we just start
899      searching from the start of the buf.  */
900 
901   if (current_monitor->getreg.resp_delim)
902     monitor_expect (current_monitor->getreg.resp_delim, NULL, 0);
903 
904   /* Skip leading spaces and "0x" if MO_HEX_PREFIX flag is set */
905   if (current_monitor->flags & MO_HEX_PREFIX)
906     {
907       int c;
908       c = readchar (timeout);
909       while (c == ' ')
910 	c = readchar (timeout);
911       if ((c == '0') && ((c = readchar (timeout)) == 'x'))
912 	;
913       else
914 	  error ("Bad value returned from monitor while fetching register %x.",
915 		 regno);
916     }
917 
918   /* Read upto the maximum number of hex digits for this register, skipping
919      spaces, but stop reading if something else is seen.  Some monitors
920      like to drop leading zeros.  */
921 
922   for (i = 0; i < REGISTER_RAW_SIZE (regno) * 2; i++)
923     {
924       int c;
925       c = readchar (timeout);
926       while (c == ' ')
927 	c = readchar (timeout);
928 
929       if (!isxdigit (c))
930 	break;
931 
932       regbuf[i] = c;
933     }
934 
935   regbuf[i] = '\000';		/* terminate the number */
936 
937   /* If TERM is present, we wait for that to show up.  Also, (if TERM
938      is present), we will send TERM_CMD if that is present.  In any
939      case, we collect all of the output into buf, and then wait for
940      the normal prompt.  */
941 
942   if (current_monitor->getreg.term)
943     {
944       monitor_expect (current_monitor->getreg.term, NULL, 0); /* get response */
945 
946       if (current_monitor->getreg.term_cmd)
947 	{
948 	  monitor_printf (current_monitor->getreg.term_cmd);
949 	  monitor_expect_prompt (NULL, 0);
950 	}
951     }
952   else
953     monitor_expect_prompt (NULL, 0); /* get response */
954 
955   monitor_supply_register (regno, regbuf);
956 }
957 
958 /* Read the remote registers into the block regs.  */
959 
960 static void monitor_dump_regs ()
961 {
962   char buf[1024];
963   int resp_len;
964 
965   if (current_monitor->dump_registers)
966     {
967       monitor_printf (current_monitor->dump_registers);
968       resp_len = monitor_expect_prompt (buf, sizeof (buf));
969       parse_register_dump (buf, resp_len);
970     }
971   else
972     abort(); /* Need some way to read registers */
973 }
974 
975 static void
976 monitor_fetch_registers (regno)
977      int regno;
978 {
979   if (current_monitor->getreg.cmd)
980     {
981       if (regno >= 0)
982 	{
983 	  monitor_fetch_register (regno);
984 	  return;
985 	}
986 
987       for (regno = 0; regno < NUM_REGS; regno++)
988 	monitor_fetch_register (regno);
989     }
990   else {
991     monitor_dump_regs ();
992   }
993 }
994 
995 /* Store register REGNO, or all if REGNO == 0.  Return errno value.  */
996 
997 static void
998 monitor_store_register (regno)
999      int regno;
1000 {
1001   char *name;
1002   unsigned int val;
1003 
1004   name = current_monitor->regnames[regno];
1005   if (!name)
1006     return;
1007 
1008   val = read_register (regno);
1009 
1010  /* send the register deposit command */
1011 
1012   if (current_monitor->flags & MO_REGISTER_VALUE_FIRST)
1013     monitor_printf (current_monitor->setreg.cmd, val, name);
1014   else
1015     monitor_printf (current_monitor->setreg.cmd, name, val);
1016 
1017 /* It's possible that there are actually some monitors out there that
1018    will prompt you when you set a register.  In that case, you may
1019    need to add some code here to deal with TERM and TERM_CMD (see
1020    monitor_fetch_register to get an idea of what's needed...) */
1021 
1022   monitor_expect_prompt (NULL, 0);
1023 }
1024 
1025 /* Store the remote registers.  */
1026 
1027 static void
1028 monitor_store_registers (regno)
1029      int regno;
1030 {
1031   if (regno >= 0)
1032     {
1033       monitor_store_register (regno);
1034       return;
1035     }
1036 
1037   for (regno = 0; regno < NUM_REGS; regno++)
1038     monitor_store_register (regno);
1039 }
1040 
1041 /* Get ready to modify the registers array.  On machines which store
1042    individual registers, this doesn't need to do anything.  On machines
1043    which store all the registers in one fell swoop, this makes sure
1044    that registers contains all the registers from the program being
1045    debugged.  */
1046 
1047 static void
1048 monitor_prepare_to_store ()
1049 {
1050   /* Do nothing, since we can store individual regs */
1051 }
1052 
1053 static void
1054 monitor_files_info (ops)
1055      struct target_ops *ops;
1056 {
1057   printf_unfiltered ("\tAttached to %s at %d baud.\n", dev_name, baud_rate);
1058 }
1059 
1060 static int
1061 monitor_write_memory (memaddr, myaddr, len)
1062      CORE_ADDR memaddr;
1063      char *myaddr;
1064      int len;
1065 {
1066   unsigned int val;
1067   char *cmd;
1068   int i;
1069 
1070   /* Use memory fill command for leading 0 bytes.  */
1071 
1072   if (current_monitor->fill)
1073     {
1074       for (i = 0; i < len; i++)
1075 	if (myaddr[i] != 0)
1076 	  break;
1077 
1078       if (i > 4)		/* More than 4 zeros is worth doing */
1079 	{
1080 	  if (current_monitor->flags & MO_FILL_USES_ADDR)
1081 	    monitor_printf (current_monitor->fill, memaddr, memaddr + i, 0);
1082 	  else
1083 	    monitor_printf (current_monitor->fill, memaddr, i, 0);
1084 
1085 	  monitor_expect_prompt (NULL, 0);
1086 
1087 	  return i;
1088 	}
1089     }
1090 
1091 #if 0
1092   /* Can't actually use long longs if VAL is an int (nice idea, though).  */
1093   if ((memaddr & 0x7) == 0 && len >= 8 && current_monitor->setmem.cmdll)
1094     {
1095       len = 8;
1096       cmd = current_monitor->setmem.cmdll;
1097     }
1098   else
1099 #endif
1100   if ((memaddr & 0x3) == 0 && len >= 4 && current_monitor->setmem.cmdl)
1101     {
1102       len = 4;
1103       cmd = current_monitor->setmem.cmdl;
1104     }
1105   else if ((memaddr & 0x1) == 0 && len >= 2 && current_monitor->setmem.cmdw)
1106     {
1107       len = 2;
1108       cmd = current_monitor->setmem.cmdw;
1109     }
1110   else
1111     {
1112       len = 1;
1113       cmd = current_monitor->setmem.cmdb;
1114     }
1115 
1116   val = extract_unsigned_integer (myaddr, len);
1117 
1118   if (current_monitor->flags & MO_NO_ECHO_ON_SETMEM)
1119     monitor_printf_noecho (cmd, memaddr, val);
1120   else
1121     monitor_printf (cmd, memaddr, val);
1122 
1123   monitor_expect_prompt (NULL, 0);
1124 
1125   return len;
1126 }
1127 
1128 /* This is an alternate form of monitor_read_memory which is used for monitors
1129    which can only read a single byte/word/etc. at a time.  */
1130 
1131 static int
1132 monitor_read_memory_single (memaddr, myaddr, len)
1133      CORE_ADDR memaddr;
1134      char *myaddr;
1135      int len;
1136 {
1137   unsigned int val;
1138   char membuf[sizeof(int) * 2 + 1];
1139   char *p;
1140   char *cmd;
1141   int i;
1142 
1143 #if 0
1144   /* Can't actually use long longs (nice idea, though).  In fact, the
1145      call to strtoul below will fail if it tries to convert a value
1146      that's too big to fit in a long.  */
1147   if ((memaddr & 0x7) == 0 && len >= 8 && current_monitor->getmem.cmdll)
1148     {
1149       len = 8;
1150       cmd = current_monitor->getmem.cmdll;
1151     }
1152   else
1153 #endif
1154   if ((memaddr & 0x3) == 0 && len >= 4 && current_monitor->getmem.cmdl)
1155     {
1156       len = 4;
1157       cmd = current_monitor->getmem.cmdl;
1158     }
1159   else if ((memaddr & 0x1) == 0 && len >= 2 && current_monitor->getmem.cmdw)
1160     {
1161       len = 2;
1162       cmd = current_monitor->getmem.cmdw;
1163     }
1164   else
1165     {
1166       len = 1;
1167       cmd = current_monitor->getmem.cmdb;
1168     }
1169 
1170   /* Send the examine command.  */
1171 
1172   monitor_printf (cmd, memaddr);
1173 
1174   /* If RESP_DELIM is specified, we search for that as a leading
1175      delimiter for the memory value.  Otherwise, we just start
1176      searching from the start of the buf.  */
1177 
1178   if (current_monitor->getmem.resp_delim)
1179     monitor_expect_regexp (&getmem_resp_delim_pattern, NULL, 0);
1180 
1181   /* Now, read the appropriate number of hex digits for this loc,
1182      skipping spaces.  */
1183 
1184   /* Skip leading spaces and "0x" if MO_HEX_PREFIX flag is set. */
1185   if (current_monitor->flags & MO_HEX_PREFIX)
1186     {
1187       int c;
1188 
1189       c = readchar (timeout);
1190       while (c == ' ')
1191 	c = readchar (timeout);
1192       if ((c == '0') && ((c = readchar (timeout)) == 'x'))
1193 	;
1194       else
1195 	error ("monitor_read_memory_single (0x%x):  bad response from monitor: %.*s%c.",
1196 	       memaddr, i, membuf, c);
1197     }
1198   for (i = 0; i < len * 2; i++)
1199     {
1200       int c;
1201 
1202       while (1)
1203 	{
1204 	  c = readchar (timeout);
1205 	  if (isxdigit (c))
1206 	    break;
1207 	  if (c == ' ')
1208 	    continue;
1209 
1210 	  error ("monitor_read_memory_single (0x%x):  bad response from monitor: %.*s%c.",
1211 		 memaddr, i, membuf, c);
1212 	}
1213 
1214       membuf[i] = c;
1215     }
1216 
1217   membuf[i] = '\000';		/* terminate the number */
1218 
1219 /* If TERM is present, we wait for that to show up.  Also, (if TERM is
1220    present), we will send TERM_CMD if that is present.  In any case, we collect
1221    all of the output into buf, and then wait for the normal prompt.  */
1222 
1223   if (current_monitor->getmem.term)
1224     {
1225       monitor_expect (current_monitor->getmem.term, NULL, 0); /* get response */
1226 
1227       if (current_monitor->getmem.term_cmd)
1228 	{
1229 	  monitor_printf (current_monitor->getmem.term_cmd);
1230 	  monitor_expect_prompt (NULL, 0);
1231 	}
1232     }
1233   else
1234     monitor_expect_prompt (NULL, 0); /* get response */
1235 
1236   p = membuf;
1237   val = strtoul (membuf, &p, 16);
1238 
1239   if (val == 0 && membuf == p)
1240     error ("monitor_read_memory_single (0x%x):  bad value from monitor: %s.",
1241 	   memaddr, membuf);
1242 
1243   /* supply register stores in target byte order, so swap here */
1244 
1245   store_unsigned_integer (myaddr, len, val);
1246 
1247   return len;
1248 }
1249 
1250 /* Copy LEN bytes of data from debugger memory at MYADDR to inferior's memory
1251    at MEMADDR.  Returns length moved.  Currently, we only do one byte at a
1252    time.  */
1253 
1254 static int
1255 monitor_read_memory (memaddr, myaddr, len)
1256      CORE_ADDR memaddr;
1257      char *myaddr;
1258      int len;
1259 {
1260   unsigned int val;
1261   unsigned char regbuf[MAX_REGISTER_RAW_SIZE];
1262   char buf[512];
1263   char *p, *p1;
1264   char *name;
1265   int resp_len;
1266   int i;
1267 
1268   if (current_monitor->flags & MO_GETMEM_READ_SINGLE)
1269     return monitor_read_memory_single (memaddr, myaddr, len);
1270 
1271   len = min (len, 16);
1272 
1273   /* See if xfer would cross a 16 byte boundary.  If so, clip it.  */
1274   if (((memaddr ^ (memaddr + len - 1)) & ~0xf) != 0)
1275     len = ((memaddr + len) & ~0xf) - memaddr;
1276 
1277   /* send the memory examine command */
1278 
1279   if (current_monitor->flags & MO_GETMEM_NEEDS_RANGE)
1280     monitor_printf (current_monitor->getmem.cmdb, memaddr, memaddr + len - 1);
1281   else
1282     monitor_printf (current_monitor->getmem.cmdb, memaddr, len);
1283 
1284   /* If TERM is present, we wait for that to show up.  Also, (if TERM
1285      is present), we will send TERM_CMD if that is present.  In any
1286      case, we collect all of the output into buf, and then wait for
1287      the normal prompt.  */
1288 
1289   if (current_monitor->getmem.term)
1290     {
1291       resp_len = monitor_expect (current_monitor->getmem.term, buf, sizeof buf); /* get response */
1292 
1293       if (resp_len <= 0)
1294 	error ("monitor_read_memory (0x%x):  excessive response from monitor: %.*s.",
1295 	       memaddr, resp_len, buf);
1296 
1297       if (current_monitor->getmem.term_cmd)
1298 	{
1299 	  SERIAL_WRITE (monitor_desc, current_monitor->getmem.term_cmd,
1300 			strlen (current_monitor->getmem.term_cmd));
1301 	  monitor_expect_prompt (NULL, 0);
1302 	}
1303     }
1304   else
1305     resp_len = monitor_expect_prompt (buf, sizeof buf); /* get response */
1306 
1307   p = buf;
1308 
1309   /* If RESP_DELIM is specified, we search for that as a leading
1310      delimiter for the values.  Otherwise, we just start searching
1311      from the start of the buf.  */
1312 
1313   if (current_monitor->getmem.resp_delim)
1314     {
1315       int retval, tmp;
1316       struct re_registers resp_strings;
1317 
1318       tmp = strlen (p);
1319       retval = re_search (&getmem_resp_delim_pattern, p, tmp, 0, tmp,
1320 			  &resp_strings);
1321 
1322       if (retval < 0)
1323 	error ("monitor_read_memory (0x%x):  bad response from monitor: %.*s.",
1324 	       memaddr, resp_len, buf);
1325 
1326       p += resp_strings.end[0];
1327 #if 0
1328       p = strstr (p, current_monitor->getmem.resp_delim);
1329       if (!p)
1330 	error ("monitor_read_memory (0x%x):  bad response from monitor: %.*s.",
1331 	       memaddr, resp_len, buf);
1332       p += strlen (current_monitor->getmem.resp_delim);
1333 #endif
1334     }
1335 
1336   for (i = len; i > 0; i--)
1337     {
1338       /* Skip non-hex chars, but bomb on end of string and newlines */
1339 
1340       while (1)
1341 	{
1342 	  if (isxdigit (*p))
1343 	    break;
1344 	  if (*p == '\000' || *p == '\n' || *p == '\r')
1345 	    error ("monitor_read_memory (0x%x):  badly terminated response from monitor: %.*s", memaddr, resp_len, buf);
1346 	  p++;
1347 	}
1348 
1349       val = strtoul (p, &p1, 16);
1350 
1351       if (val == 0 && p == p1)
1352 	error ("monitor_read_memory (0x%x):  bad value from monitor: %.*s.", memaddr,
1353 	       resp_len, buf);
1354 
1355       *myaddr++ = val;
1356 
1357       if (i == 1)
1358 	break;
1359 
1360       p = p1;
1361     }
1362 
1363   return len;
1364 }
1365 
1366 static int
1367 monitor_xfer_memory (memaddr, myaddr, len, write, target)
1368      CORE_ADDR memaddr;
1369      char *myaddr;
1370      int len;
1371      int write;
1372      struct target_ops *target;		/* ignored */
1373 {
1374   return dcache_xfer_memory (remote_dcache, memaddr, myaddr, len, write);
1375 }
1376 
1377 static void
1378 monitor_kill ()
1379 {
1380   return;		/* ignore attempts to kill target system */
1381 }
1382 
1383 /* All we actually do is set the PC to the start address of exec_bfd, and start
1384    the program at that point.  */
1385 
1386 static void
1387 monitor_create_inferior (exec_file, args, env)
1388      char *exec_file;
1389      char *args;
1390      char **env;
1391 {
1392   if (args && (*args != '\000'))
1393     error ("Args are not supported by the monitor.");
1394 
1395   first_time = 1;
1396   clear_proceed_status ();
1397   proceed (bfd_get_start_address (exec_bfd), TARGET_SIGNAL_0, 0);
1398 }
1399 
1400 /* Clean up when a program exits.
1401    The program actually lives on in the remote processor's RAM, and may be
1402    run again without a download.  Don't leave it full of breakpoint
1403    instructions.  */
1404 
1405 static void
1406 monitor_mourn_inferior ()
1407 {
1408   unpush_target (targ_ops);
1409   generic_mourn_inferior ();	/* Do all the proper things now */
1410 }
1411 
1412 #define NUM_MONITOR_BREAKPOINTS 8
1413 
1414 static CORE_ADDR breakaddr[NUM_MONITOR_BREAKPOINTS] = {0};
1415 
1416 /* Tell the monitor to add a breakpoint.  */
1417 
1418 static int
1419 monitor_insert_breakpoint (addr, shadow)
1420      CORE_ADDR addr;
1421      char *shadow;
1422 {
1423   int i;
1424   static unsigned char break_insn[] = BREAKPOINT;
1425 
1426   for (i = 0; i < NUM_MONITOR_BREAKPOINTS; i++)
1427     {
1428       if (breakaddr[i] == 0)
1429 	{
1430 	  breakaddr[i] = addr;
1431 	  monitor_read_memory (addr, shadow, sizeof (break_insn));
1432 	  monitor_printf (current_monitor->set_break, addr);
1433 	  monitor_expect_prompt (NULL, 0);
1434 	  return 0;
1435 	}
1436     }
1437 
1438   error ("Too many breakpoints (> %d) for monitor.", NUM_MONITOR_BREAKPOINTS);
1439 }
1440 
1441 /* Tell the monitor to remove a breakpoint.  */
1442 
1443 static int
1444 monitor_remove_breakpoint (addr, shadow)
1445      CORE_ADDR addr;
1446      char *shadow;
1447 {
1448   int i;
1449 
1450   for (i = 0; i < NUM_MONITOR_BREAKPOINTS; i++)
1451     {
1452       if (breakaddr[i] == addr)
1453 	{
1454 	  breakaddr[i] = 0;
1455 	  /* some monitors remove breakpoints based on the address */
1456 	  if (current_monitor->flags & MO_CLR_BREAK_USES_ADDR)
1457 	    monitor_printf (current_monitor->clr_break, addr);
1458 	  else
1459 	    monitor_printf (current_monitor->clr_break, i);
1460 	  monitor_expect_prompt (NULL, 0);
1461 	  return 0;
1462 	}
1463     }
1464   fprintf_unfiltered (stderr, "Can't find breakpoint associated with 0x%x\n", addr);
1465   return 1;
1466 }
1467 
1468 /* monitor_wait_srec_ack -- wait for the target to send an acknowledgement for
1469    an S-record.  Return non-zero if the ACK is received properly.  */
1470 
1471 static int
1472 monitor_wait_srec_ack ()
1473 {
1474   /* FIXME: eventually we'll want to be able to handle acknowledgements
1475      of something other than a '+' character.  Right now this is only
1476      going to work for EST visionICE.  */
1477   return readchar (timeout) == '+';
1478 }
1479 
1480 /* monitor_load -- download a file. */
1481 
1482 static void
1483 monitor_load (file, from_tty)
1484     char *file;
1485     int  from_tty;
1486 {
1487   dcache_flush (remote_dcache);
1488 
1489   if (current_monitor->load_routine)
1490     current_monitor->load_routine (monitor_desc, file, hashmark);
1491   else
1492     {				/* The default is ascii S-records */
1493       monitor_printf (current_monitor->load);
1494       if (current_monitor->loadresp)
1495 	monitor_expect (current_monitor->loadresp, NULL, 0);
1496 
1497 /* FIXME Should add arg here for load_offset (already done for generic_load) */
1498       load_srec (monitor_desc, file, 32, SREC_ALL, hashmark,
1499 		 current_monitor->flags & MO_SREC_ACK ?
1500 		   monitor_wait_srec_ack : NULL);
1501 
1502       monitor_expect_prompt (NULL, 0);
1503     }
1504 
1505 /* Finally, make the PC point at the start address */
1506 
1507   if (exec_bfd)
1508     write_pc (bfd_get_start_address (exec_bfd));
1509 
1510   inferior_pid = 0;		/* No process now */
1511 
1512 /* This is necessary because many things were based on the PC at the time that
1513    we attached to the monitor, which is no longer valid now that we have loaded
1514    new code (and just changed the PC).  Another way to do this might be to call
1515    normal_stop, except that the stack may not be valid, and things would get
1516    horribly confused... */
1517 
1518   clear_symtab_users ();
1519 }
1520 
1521 static void
1522 monitor_stop ()
1523 {
1524   if ((current_monitor->flags & MO_SEND_BREAK_ON_STOP) != 0)
1525     SERIAL_SEND_BREAK (monitor_desc);
1526   if (current_monitor->stop)
1527     monitor_printf_noecho (current_monitor->stop);
1528 }
1529 
1530 /* Put a command string, in args, out to MONITOR.  Output from MONITOR
1531    is placed on the users terminal until the prompt is seen. FIXME: We
1532    read the characters ourseleves here cause of a nasty echo.  */
1533 
1534 static void
1535 monitor_command (args, from_tty)
1536      char *args;
1537      int from_tty;
1538 {
1539   char *p;
1540   int resp_len;
1541   char buf[1000];
1542 
1543   if (monitor_desc == NULL)
1544     error ("monitor target not open.");
1545 
1546   p = current_monitor->prompt;
1547 
1548   /* Send the command.  Note that if no args were supplied, then we're
1549      just sending the monitor a newline, which is sometimes useful.  */
1550 
1551   monitor_printf ("%s\r", (args ? args : ""));
1552 
1553   resp_len = monitor_expect_prompt (buf, sizeof buf);
1554 
1555   fputs_unfiltered (buf, gdb_stdout); /* Output the response */
1556 }
1557 
1558 /* Convert hex digit A to a number.  */
1559 
1560 static int
1561 from_hex (a)
1562      int a;
1563 {
1564   if (a >= '0' && a <= '9')
1565     return a - '0';
1566   if (a >= 'a' && a <= 'f')
1567     return a - 'a' + 10;
1568   if (a >= 'A' && a <= 'F')
1569     return a - 'A' + 10;
1570 
1571   error ("Reply contains invalid hex digit 0x%x", a);
1572 }
1573 
1574 static struct target_ops monitor_ops =
1575 {
1576   NULL,				/* to_shortname */
1577   NULL,				/* to_longname */
1578   NULL,				/* to_doc */
1579   NULL,				/* to_open */
1580   monitor_close,		/* to_close */
1581   NULL,				/* to_attach */
1582   monitor_detach,		/* to_detach */
1583   monitor_resume,		/* to_resume */
1584   monitor_wait,			/* to_wait */
1585   monitor_fetch_registers,	/* to_fetch_registers */
1586   monitor_store_registers,	/* to_store_registers */
1587   monitor_prepare_to_store,	/* to_prepare_to_store */
1588   monitor_xfer_memory,		/* to_xfer_memory */
1589   monitor_files_info,		/* to_files_info */
1590   monitor_insert_breakpoint,	/* to_insert_breakpoint */
1591   monitor_remove_breakpoint,	/* to_remove_breakpoint */
1592   0,				/* to_terminal_init */
1593   0,				/* to_terminal_inferior */
1594   0,				/* to_terminal_ours_for_output */
1595   0,				/* to_terminal_ours */
1596   0,				/* to_terminal_info */
1597   monitor_kill,			/* to_kill */
1598   monitor_load,			/* to_load */
1599   0,				/* to_lookup_symbol */
1600   monitor_create_inferior,	/* to_create_inferior */
1601   monitor_mourn_inferior,	/* to_mourn_inferior */
1602   0,				/* to_can_run */
1603   0, 				/* to_notice_signals */
1604   0,				/* to_thread_alive */
1605   monitor_stop,			/* to_stop */
1606   process_stratum,		/* to_stratum */
1607   0,				/* to_next */
1608   1,				/* to_has_all_memory */
1609   1,				/* to_has_memory */
1610   1,				/* to_has_stack */
1611   1,				/* to_has_registers */
1612   1,				/* to_has_execution */
1613   0,				/* sections */
1614   0,				/* sections_end */
1615   OPS_MAGIC			/* to_magic */
1616 };
1617 
1618 /* Init the target_ops structure pointed at by OPS */
1619 
1620 void
1621 init_monitor_ops (ops)
1622      struct target_ops *ops;
1623 {
1624   memcpy (ops, &monitor_ops, sizeof monitor_ops);
1625 }
1626 
1627 /* Define additional commands that are usually only used by monitors.  */
1628 
1629 void
1630 _initialize_remote_monitors ()
1631 {
1632   add_show_from_set (add_set_cmd ("hash", no_class, var_boolean,
1633                                   (char *)&hashmark,
1634 				  "Set display of activity while downloading a file.\n\
1635 When enabled, a hashmark \'#\' is displayed.",
1636                                   &setlist),
1637 		     &showlist);
1638 
1639   add_com ("monitor", class_obscure, monitor_command,
1640 	   "Send a command to the debug monitor.");
1641 }
1642