xref: /openbsd-src/gnu/usr.bin/binutils/gdb/monitor.c (revision 63addd46c1e40ca0f49488ddcdc4ab598023b0c1)
1e93f7393Sniklas /* Remote debugging interface for boot monitors, for GDB.
2b725ae77Skettenis 
3b725ae77Skettenis    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
4b725ae77Skettenis    1999, 2000, 2001, 2002 Free Software Foundation, Inc.
5b725ae77Skettenis 
6e93f7393Sniklas    Contributed by Cygnus Support.  Written by Rob Savoye for Cygnus.
7e93f7393Sniklas    Resurrected from the ashes by Stu Grossman.
8e93f7393Sniklas 
9e93f7393Sniklas    This file is part of GDB.
10e93f7393Sniklas 
11e93f7393Sniklas    This program is free software; you can redistribute it and/or modify
12e93f7393Sniklas    it under the terms of the GNU General Public License as published by
13e93f7393Sniklas    the Free Software Foundation; either version 2 of the License, or
14e93f7393Sniklas    (at your option) any later version.
15e93f7393Sniklas 
16e93f7393Sniklas    This program is distributed in the hope that it will be useful,
17e93f7393Sniklas    but WITHOUT ANY WARRANTY; without even the implied warranty of
18e93f7393Sniklas    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19e93f7393Sniklas    GNU General Public License for more details.
20e93f7393Sniklas 
21e93f7393Sniklas    You should have received a copy of the GNU General Public License
22e93f7393Sniklas    along with this program; if not, write to the Free Software
23b725ae77Skettenis    Foundation, Inc., 59 Temple Place - Suite 330,
24b725ae77Skettenis    Boston, MA 02111-1307, USA.  */
25e93f7393Sniklas 
26e93f7393Sniklas /* This file was derived from various remote-* modules. It is a collection
27e93f7393Sniklas    of generic support functions so GDB can talk directly to a ROM based
28e93f7393Sniklas    monitor. This saves use from having to hack an exception based handler
29b725ae77Skettenis    into existence, and makes for quick porting.
30e93f7393Sniklas 
31e93f7393Sniklas    This module talks to a debug monitor called 'MONITOR', which
32e93f7393Sniklas    We communicate with MONITOR via either a direct serial line, or a TCP
33e93f7393Sniklas    (or possibly TELNET) stream to a terminal multiplexor,
34e93f7393Sniklas    which in turn talks to the target board.  */
35e93f7393Sniklas 
36e93f7393Sniklas /* FIXME 32x64: This code assumes that registers and addresses are at
37e93f7393Sniklas    most 32 bits long.  If they can be larger, you will need to declare
38e93f7393Sniklas    values as LONGEST and use %llx or some such to print values when
39e93f7393Sniklas    building commands to send to the monitor.  Since we don't know of
40e93f7393Sniklas    any actual 64-bit targets with ROM monitors that use this code,
41e93f7393Sniklas    it's not an issue right now.  -sts 4/18/96  */
42e93f7393Sniklas 
43e93f7393Sniklas #include "defs.h"
44e93f7393Sniklas #include "gdbcore.h"
45e93f7393Sniklas #include "target.h"
46e93f7393Sniklas #include <signal.h>
47e93f7393Sniklas #include <ctype.h>
48e93f7393Sniklas #include "gdb_string.h"
49e93f7393Sniklas #include <sys/types.h>
50e93f7393Sniklas #include "command.h"
51e93f7393Sniklas #include "serial.h"
52e93f7393Sniklas #include "monitor.h"
53e93f7393Sniklas #include "gdbcmd.h"
54e93f7393Sniklas #include "inferior.h"
55b725ae77Skettenis #include "gdb_regex.h"
56e93f7393Sniklas #include "srec.h"
57b725ae77Skettenis #include "regcache.h"
58e93f7393Sniklas 
59e93f7393Sniklas static char *dev_name;
60e93f7393Sniklas static struct target_ops *targ_ops;
61e93f7393Sniklas 
62b725ae77Skettenis static void monitor_vsprintf (char *sndbuf, char *pattern, va_list args);
63e93f7393Sniklas 
64b725ae77Skettenis static int readchar (int timeout);
65e93f7393Sniklas 
66b725ae77Skettenis static void monitor_fetch_register (int regno);
67b725ae77Skettenis static void monitor_store_register (int regno);
68e93f7393Sniklas 
69b725ae77Skettenis static void monitor_printable_string (char *newstr, char *oldstr, int len);
70b725ae77Skettenis static void monitor_error (char *function, char *message, CORE_ADDR memaddr, int len, char *string, int final_char);
71b725ae77Skettenis static void monitor_detach (char *args, int from_tty);
72b725ae77Skettenis static void monitor_resume (ptid_t ptid, int step, enum target_signal sig);
73b725ae77Skettenis static void monitor_interrupt (int signo);
74b725ae77Skettenis static void monitor_interrupt_twice (int signo);
75b725ae77Skettenis static void monitor_interrupt_query (void);
76b725ae77Skettenis static void monitor_wait_cleanup (void *old_timeout);
77e93f7393Sniklas 
78b725ae77Skettenis static ptid_t monitor_wait (ptid_t ptid, struct target_waitstatus *status);
79b725ae77Skettenis static void monitor_fetch_registers (int regno);
80b725ae77Skettenis static void monitor_store_registers (int regno);
81b725ae77Skettenis static void monitor_prepare_to_store (void);
82b725ae77Skettenis static int monitor_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len,
83b725ae77Skettenis 				int write,
84b725ae77Skettenis 				struct mem_attrib *attrib,
85b725ae77Skettenis 				struct target_ops *target);
86b725ae77Skettenis static void monitor_files_info (struct target_ops *ops);
87b725ae77Skettenis static int monitor_insert_breakpoint (CORE_ADDR addr, char *shadow);
88b725ae77Skettenis static int monitor_remove_breakpoint (CORE_ADDR addr, char *shadow);
89b725ae77Skettenis static void monitor_kill (void);
90b725ae77Skettenis static void monitor_load (char *file, int from_tty);
91b725ae77Skettenis static void monitor_mourn_inferior (void);
92b725ae77Skettenis static void monitor_stop (void);
93e93f7393Sniklas 
94b725ae77Skettenis static int monitor_read_memory (CORE_ADDR addr, char *myaddr, int len);
95b725ae77Skettenis static int monitor_write_memory (CORE_ADDR addr, char *myaddr, int len);
96b725ae77Skettenis static int monitor_write_memory_bytes (CORE_ADDR addr, char *myaddr, int len);
97b725ae77Skettenis static int monitor_write_memory_block (CORE_ADDR memaddr,
98b725ae77Skettenis 				       char *myaddr, int len);
99b725ae77Skettenis static int monitor_expect_regexp (struct re_pattern_buffer *pat,
100b725ae77Skettenis 				  char *buf, int buflen);
101b725ae77Skettenis static void monitor_dump_regs (void);
102b725ae77Skettenis #if 0
103b725ae77Skettenis static int from_hex (int a);
104b725ae77Skettenis static unsigned long get_hex_word (void);
105b725ae77Skettenis #endif
106b725ae77Skettenis static void parse_register_dump (char *, int);
107e93f7393Sniklas 
108e93f7393Sniklas static struct monitor_ops *current_monitor;
109e93f7393Sniklas 
110e93f7393Sniklas static int hashmark;		/* flag set by "set hash" */
111e93f7393Sniklas 
112e93f7393Sniklas static int timeout = 30;
113e93f7393Sniklas 
114e93f7393Sniklas static int in_monitor_wait = 0;	/* Non-zero means we are in monitor_wait() */
115e93f7393Sniklas 
116e93f7393Sniklas static void (*ofunc) ();	/* Old SIGINT signal handler */
117e93f7393Sniklas 
118b725ae77Skettenis static CORE_ADDR *breakaddr;
119b725ae77Skettenis 
120e93f7393Sniklas /* Descriptor for I/O to remote machine.  Initialize it to NULL so
121e93f7393Sniklas    that monitor_open knows that we don't have a file open when the
122e93f7393Sniklas    program starts.  */
123e93f7393Sniklas 
124b725ae77Skettenis static struct serial *monitor_desc = NULL;
125e93f7393Sniklas 
126e93f7393Sniklas /* Pointer to regexp pattern matching data */
127e93f7393Sniklas 
128e93f7393Sniklas static struct re_pattern_buffer register_pattern;
129e93f7393Sniklas static char register_fastmap[256];
130e93f7393Sniklas 
131e93f7393Sniklas static struct re_pattern_buffer getmem_resp_delim_pattern;
132e93f7393Sniklas static char getmem_resp_delim_fastmap[256];
133e93f7393Sniklas 
134b725ae77Skettenis static struct re_pattern_buffer setmem_resp_delim_pattern;
135b725ae77Skettenis static char setmem_resp_delim_fastmap[256];
136b725ae77Skettenis 
137b725ae77Skettenis static struct re_pattern_buffer setreg_resp_delim_pattern;
138b725ae77Skettenis static char setreg_resp_delim_fastmap[256];
139b725ae77Skettenis 
140e93f7393Sniklas static int dump_reg_flag;	/* Non-zero means do a dump_registers cmd when
141e93f7393Sniklas 				   monitor_wait wakes up.  */
142e93f7393Sniklas 
143e93f7393Sniklas static int first_time = 0;	/* is this the first time we're executing after
144e93f7393Sniklas 				   gaving created the child proccess? */
145e93f7393Sniklas 
146b725ae77Skettenis #define TARGET_BUF_SIZE 2048
147b725ae77Skettenis 
148b725ae77Skettenis /* Monitor specific debugging information.  Typically only useful to
149b725ae77Skettenis    the developer of a new monitor interface. */
150b725ae77Skettenis 
151b725ae77Skettenis static void monitor_debug (const char *fmt, ...) ATTR_FORMAT(printf, 1, 2);
152b725ae77Skettenis 
153b725ae77Skettenis static int monitor_debug_p = 0;
154b725ae77Skettenis 
155b725ae77Skettenis /* NOTE: This file alternates between monitor_debug_p and remote_debug
156*63addd46Skettenis    when determining if debug information is printed.  Perhaps this
157b725ae77Skettenis    could be simplified. */
158e93f7393Sniklas 
159e93f7393Sniklas static void
monitor_debug(const char * fmt,...)160b725ae77Skettenis monitor_debug (const char *fmt, ...)
161b725ae77Skettenis {
162b725ae77Skettenis   if (monitor_debug_p)
163b725ae77Skettenis     {
164b725ae77Skettenis       va_list args;
165b725ae77Skettenis       va_start (args, fmt);
166b725ae77Skettenis       vfprintf_filtered (gdb_stdlog, fmt, args);
167b725ae77Skettenis       va_end (args);
168b725ae77Skettenis     }
169b725ae77Skettenis }
170b725ae77Skettenis 
171b725ae77Skettenis 
172b725ae77Skettenis /* Convert a string into a printable representation, Return # byte in
173b725ae77Skettenis    the new string.  When LEN is >0 it specifies the size of the
174b725ae77Skettenis    string.  Otherwize strlen(oldstr) is used. */
175b725ae77Skettenis 
176b725ae77Skettenis static void
monitor_printable_string(char * newstr,char * oldstr,int len)177b725ae77Skettenis monitor_printable_string (char *newstr, char *oldstr, int len)
178e93f7393Sniklas {
179e93f7393Sniklas   int ch;
180b725ae77Skettenis   int i;
181e93f7393Sniklas 
182b725ae77Skettenis   if (len <= 0)
183b725ae77Skettenis     len = strlen (oldstr);
184e93f7393Sniklas 
185b725ae77Skettenis   for (i = 0; i < len; i++)
186e93f7393Sniklas     {
187b725ae77Skettenis       ch = oldstr[i];
188b725ae77Skettenis       switch (ch)
189e93f7393Sniklas 	{
190e93f7393Sniklas 	default:
191e93f7393Sniklas 	  if (isprint (ch))
192b725ae77Skettenis 	    *newstr++ = ch;
193e93f7393Sniklas 
194e93f7393Sniklas 	  else
195b725ae77Skettenis 	    {
196b725ae77Skettenis 	      sprintf (newstr, "\\x%02x", ch & 0xff);
197b725ae77Skettenis 	      newstr += 4;
198b725ae77Skettenis 	    }
199e93f7393Sniklas 	  break;
200e93f7393Sniklas 
201b725ae77Skettenis 	case '\\':
202b725ae77Skettenis 	  *newstr++ = '\\';
203b725ae77Skettenis 	  *newstr++ = '\\';
204b725ae77Skettenis 	  break;
205b725ae77Skettenis 	case '\b':
206b725ae77Skettenis 	  *newstr++ = '\\';
207b725ae77Skettenis 	  *newstr++ = 'b';
208b725ae77Skettenis 	  break;
209b725ae77Skettenis 	case '\f':
210b725ae77Skettenis 	  *newstr++ = '\\';
211b725ae77Skettenis 	  *newstr++ = 't';
212b725ae77Skettenis 	  break;
213b725ae77Skettenis 	case '\n':
214b725ae77Skettenis 	  *newstr++ = '\\';
215b725ae77Skettenis 	  *newstr++ = 'n';
216b725ae77Skettenis 	  break;
217b725ae77Skettenis 	case '\r':
218b725ae77Skettenis 	  *newstr++ = '\\';
219b725ae77Skettenis 	  *newstr++ = 'r';
220b725ae77Skettenis 	  break;
221b725ae77Skettenis 	case '\t':
222b725ae77Skettenis 	  *newstr++ = '\\';
223b725ae77Skettenis 	  *newstr++ = 't';
224b725ae77Skettenis 	  break;
225b725ae77Skettenis 	case '\v':
226b725ae77Skettenis 	  *newstr++ = '\\';
227b725ae77Skettenis 	  *newstr++ = 'v';
228b725ae77Skettenis 	  break;
229e93f7393Sniklas 	}
230e93f7393Sniklas     }
231e93f7393Sniklas 
232b725ae77Skettenis   *newstr++ = '\0';
233e93f7393Sniklas }
234b725ae77Skettenis 
235b725ae77Skettenis /* Print monitor errors with a string, converting the string to printable
236b725ae77Skettenis    representation.  */
237b725ae77Skettenis 
238b725ae77Skettenis static void
monitor_error(char * function,char * message,CORE_ADDR memaddr,int len,char * string,int final_char)239b725ae77Skettenis monitor_error (char *function, char *message,
240b725ae77Skettenis 	       CORE_ADDR memaddr, int len, char *string, int final_char)
241b725ae77Skettenis {
242b725ae77Skettenis   int real_len = (len == 0 && string != (char *) 0) ? strlen (string) : len;
243b725ae77Skettenis   char *safe_string = alloca ((real_len * 4) + 1);
244b725ae77Skettenis   monitor_printable_string (safe_string, string, real_len);
245b725ae77Skettenis 
246b725ae77Skettenis   if (final_char)
247b725ae77Skettenis     error ("%s (0x%s): %s: %s%c", function, paddr_nz (memaddr), message, safe_string, final_char);
248b725ae77Skettenis   else
249b725ae77Skettenis     error ("%s (0x%s): %s: %s", function, paddr_nz (memaddr), message, safe_string);
250e93f7393Sniklas }
251e93f7393Sniklas 
252b725ae77Skettenis /* Convert hex digit A to a number.  */
253b725ae77Skettenis 
254b725ae77Skettenis static int
fromhex(int a)255b725ae77Skettenis fromhex (int a)
256b725ae77Skettenis {
257b725ae77Skettenis   if (a >= '0' && a <= '9')
258b725ae77Skettenis     return a - '0';
259b725ae77Skettenis   else if (a >= 'a' && a <= 'f')
260b725ae77Skettenis     return a - 'a' + 10;
261b725ae77Skettenis   else if (a >= 'A' && a <= 'F')
262b725ae77Skettenis     return a - 'A' + 10;
263b725ae77Skettenis   else
264b725ae77Skettenis     error ("Invalid hex digit %d", a);
265b725ae77Skettenis }
266b725ae77Skettenis 
267b725ae77Skettenis /* monitor_vsprintf - similar to vsprintf but handles 64-bit addresses
268b725ae77Skettenis 
269b725ae77Skettenis    This function exists to get around the problem that many host platforms
270b725ae77Skettenis    don't have a printf that can print 64-bit addresses.  The %A format
271b725ae77Skettenis    specification is recognized as a special case, and causes the argument
272b725ae77Skettenis    to be printed as a 64-bit hexadecimal address.
273b725ae77Skettenis 
274b725ae77Skettenis    Only format specifiers of the form "[0-9]*[a-z]" are recognized.
275b725ae77Skettenis    If it is a '%s' format, the argument is a string; otherwise the
276b725ae77Skettenis    argument is assumed to be a long integer.
277b725ae77Skettenis 
278b725ae77Skettenis    %% is also turned into a single %.
279b725ae77Skettenis  */
280b725ae77Skettenis 
281b725ae77Skettenis static void
monitor_vsprintf(char * sndbuf,char * pattern,va_list args)282b725ae77Skettenis monitor_vsprintf (char *sndbuf, char *pattern, va_list args)
283b725ae77Skettenis {
284b725ae77Skettenis   char format[10];
285b725ae77Skettenis   char fmt;
286b725ae77Skettenis   char *p;
287b725ae77Skettenis   int i;
288b725ae77Skettenis   long arg_int;
289b725ae77Skettenis   CORE_ADDR arg_addr;
290b725ae77Skettenis   char *arg_string;
291b725ae77Skettenis 
292b725ae77Skettenis   for (p = pattern; *p; p++)
293b725ae77Skettenis     {
294b725ae77Skettenis       if (*p == '%')
295b725ae77Skettenis 	{
296b725ae77Skettenis 	  /* Copy the format specifier to a separate buffer.  */
297b725ae77Skettenis 	  format[0] = *p++;
298b725ae77Skettenis 	  for (i = 1; *p >= '0' && *p <= '9' && i < (int) sizeof (format) - 2;
299b725ae77Skettenis 	       i++, p++)
300b725ae77Skettenis 	    format[i] = *p;
301b725ae77Skettenis 	  format[i] = fmt = *p;
302b725ae77Skettenis 	  format[i + 1] = '\0';
303b725ae77Skettenis 
304b725ae77Skettenis 	  /* Fetch the next argument and print it.  */
305b725ae77Skettenis 	  switch (fmt)
306b725ae77Skettenis 	    {
307b725ae77Skettenis 	    case '%':
308b725ae77Skettenis 	      strcpy (sndbuf, "%");
309b725ae77Skettenis 	      break;
310b725ae77Skettenis 	    case 'A':
311b725ae77Skettenis 	      arg_addr = va_arg (args, CORE_ADDR);
312b725ae77Skettenis 	      strcpy (sndbuf, paddr_nz (arg_addr));
313b725ae77Skettenis 	      break;
314b725ae77Skettenis 	    case 's':
315b725ae77Skettenis 	      arg_string = va_arg (args, char *);
316b725ae77Skettenis 	      sprintf (sndbuf, format, arg_string);
317b725ae77Skettenis 	      break;
318b725ae77Skettenis 	    default:
319b725ae77Skettenis 	      arg_int = va_arg (args, long);
320b725ae77Skettenis 	      sprintf (sndbuf, format, arg_int);
321b725ae77Skettenis 	      break;
322b725ae77Skettenis 	    }
323b725ae77Skettenis 	  sndbuf += strlen (sndbuf);
324b725ae77Skettenis 	}
325b725ae77Skettenis       else
326b725ae77Skettenis 	*sndbuf++ = *p;
327b725ae77Skettenis     }
328b725ae77Skettenis   *sndbuf = '\0';
329b725ae77Skettenis }
330b725ae77Skettenis 
331b725ae77Skettenis 
332e93f7393Sniklas /* monitor_printf_noecho -- Send data to monitor, but don't expect an echo.
333e93f7393Sniklas    Works just like printf.  */
334e93f7393Sniklas 
335e93f7393Sniklas void
monitor_printf_noecho(char * pattern,...)336e93f7393Sniklas monitor_printf_noecho (char *pattern,...)
337e93f7393Sniklas {
338e93f7393Sniklas   va_list args;
339e93f7393Sniklas   char sndbuf[2000];
340e93f7393Sniklas   int len;
341e93f7393Sniklas 
342e93f7393Sniklas   va_start (args, pattern);
343e93f7393Sniklas 
344b725ae77Skettenis   monitor_vsprintf (sndbuf, pattern, args);
345e93f7393Sniklas 
346e93f7393Sniklas   len = strlen (sndbuf);
347e93f7393Sniklas   if (len + 1 > sizeof sndbuf)
348b725ae77Skettenis     internal_error (__FILE__, __LINE__, "failed internal consistency check");
349e93f7393Sniklas 
350b725ae77Skettenis   if (monitor_debug_p)
351b725ae77Skettenis     {
352b725ae77Skettenis       char *safe_string = (char *) alloca ((strlen (sndbuf) * 4) + 1);
353b725ae77Skettenis       monitor_printable_string (safe_string, sndbuf, 0);
354b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, "sent[%s]\n", safe_string);
355b725ae77Skettenis     }
356b725ae77Skettenis 
357b725ae77Skettenis   monitor_write (sndbuf, len);
358e93f7393Sniklas }
359e93f7393Sniklas 
360e93f7393Sniklas /* monitor_printf -- Send data to monitor and check the echo.  Works just like
361e93f7393Sniklas    printf.  */
362e93f7393Sniklas 
363e93f7393Sniklas void
monitor_printf(char * pattern,...)364e93f7393Sniklas monitor_printf (char *pattern,...)
365e93f7393Sniklas {
366e93f7393Sniklas   va_list args;
367e93f7393Sniklas   char sndbuf[2000];
368e93f7393Sniklas   int len;
369e93f7393Sniklas 
370e93f7393Sniklas   va_start (args, pattern);
371e93f7393Sniklas 
372b725ae77Skettenis   monitor_vsprintf (sndbuf, pattern, args);
373e93f7393Sniklas 
374e93f7393Sniklas   len = strlen (sndbuf);
375e93f7393Sniklas   if (len + 1 > sizeof sndbuf)
376b725ae77Skettenis     internal_error (__FILE__, __LINE__, "failed internal consistency check");
377e93f7393Sniklas 
378b725ae77Skettenis   if (monitor_debug_p)
379b725ae77Skettenis     {
380b725ae77Skettenis       char *safe_string = (char *) alloca ((len * 4) + 1);
381b725ae77Skettenis       monitor_printable_string (safe_string, sndbuf, 0);
382b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, "sent[%s]\n", safe_string);
383b725ae77Skettenis     }
384b725ae77Skettenis 
385b725ae77Skettenis   monitor_write (sndbuf, len);
386e93f7393Sniklas 
387e93f7393Sniklas   /* We used to expect that the next immediate output was the characters we
388e93f7393Sniklas      just output, but sometimes some extra junk appeared before the characters
389e93f7393Sniklas      we expected, like an extra prompt, or a portmaster sending telnet negotiations.
390e93f7393Sniklas      So, just start searching for what we sent, and skip anything unknown.  */
391b725ae77Skettenis   monitor_debug ("ExpectEcho\n");
392e93f7393Sniklas   monitor_expect (sndbuf, (char *) 0, 0);
393e93f7393Sniklas }
394e93f7393Sniklas 
395e93f7393Sniklas 
396b725ae77Skettenis /* Write characters to the remote system.  */
397b725ae77Skettenis 
398b725ae77Skettenis void
monitor_write(char * buf,int buflen)399b725ae77Skettenis monitor_write (char *buf, int buflen)
400b725ae77Skettenis {
401b725ae77Skettenis   if (serial_write (monitor_desc, buf, buflen))
402b725ae77Skettenis     fprintf_unfiltered (gdb_stderr, "serial_write failed: %s\n",
403b725ae77Skettenis 			safe_strerror (errno));
404b725ae77Skettenis }
405b725ae77Skettenis 
406b725ae77Skettenis 
407b725ae77Skettenis /* Read a binary character from the remote system, doing all the fancy
408b725ae77Skettenis    timeout stuff, but without interpreting the character in any way,
409b725ae77Skettenis    and without printing remote debug information.  */
410b725ae77Skettenis 
411b725ae77Skettenis int
monitor_readchar(void)412b725ae77Skettenis monitor_readchar (void)
413e93f7393Sniklas {
414e93f7393Sniklas   int c;
415e93f7393Sniklas   int looping;
416e93f7393Sniklas 
417e93f7393Sniklas   do
418e93f7393Sniklas     {
419e93f7393Sniklas       looping = 0;
420b725ae77Skettenis       c = serial_readchar (monitor_desc, timeout);
421b725ae77Skettenis 
422b725ae77Skettenis       if (c >= 0)
423b725ae77Skettenis 	c &= 0xff;		/* don't lose bit 7 */
424b725ae77Skettenis     }
425b725ae77Skettenis   while (looping);
426b725ae77Skettenis 
427b725ae77Skettenis   if (c >= 0)
428b725ae77Skettenis     return c;
429b725ae77Skettenis 
430b725ae77Skettenis   if (c == SERIAL_TIMEOUT)
431b725ae77Skettenis     error ("Timeout reading from remote system.");
432b725ae77Skettenis 
433b725ae77Skettenis   perror_with_name ("remote-monitor");
434b725ae77Skettenis }
435b725ae77Skettenis 
436b725ae77Skettenis 
437b725ae77Skettenis /* Read a character from the remote system, doing all the fancy
438b725ae77Skettenis    timeout stuff.  */
439b725ae77Skettenis 
440b725ae77Skettenis static int
readchar(int timeout)441b725ae77Skettenis readchar (int timeout)
442b725ae77Skettenis {
443b725ae77Skettenis   int c;
444b725ae77Skettenis   static enum
445b725ae77Skettenis     {
446b725ae77Skettenis       last_random, last_nl, last_cr, last_crnl
447b725ae77Skettenis     }
448b725ae77Skettenis   state = last_random;
449b725ae77Skettenis   int looping;
450b725ae77Skettenis 
451b725ae77Skettenis   do
452b725ae77Skettenis     {
453b725ae77Skettenis       looping = 0;
454b725ae77Skettenis       c = serial_readchar (monitor_desc, timeout);
455e93f7393Sniklas 
456e93f7393Sniklas       if (c >= 0)
457e93f7393Sniklas 	{
458e93f7393Sniklas 	  c &= 0x7f;
459b725ae77Skettenis 	  /* This seems to interfere with proper function of the
460b725ae77Skettenis 	     input stream */
461b725ae77Skettenis 	  if (monitor_debug_p || remote_debug)
462e93f7393Sniklas 	    {
463e93f7393Sniklas 	      char buf[2];
464e93f7393Sniklas 	      buf[0] = c;
465e93f7393Sniklas 	      buf[1] = '\0';
466b725ae77Skettenis 	      puts_debug ("read -->", buf, "<--");
467e93f7393Sniklas 	    }
468b725ae77Skettenis 
469e93f7393Sniklas 	}
470e93f7393Sniklas 
471e93f7393Sniklas       /* Canonicialize \n\r combinations into one \r */
472e93f7393Sniklas       if ((current_monitor->flags & MO_HANDLE_NL) != 0)
473e93f7393Sniklas 	{
474e93f7393Sniklas 	  if ((c == '\r' && state == last_nl)
475e93f7393Sniklas 	      || (c == '\n' && state == last_cr))
476e93f7393Sniklas 	    {
477e93f7393Sniklas 	      state = last_crnl;
478e93f7393Sniklas 	      looping = 1;
479e93f7393Sniklas 	    }
480e93f7393Sniklas 	  else if (c == '\r')
481e93f7393Sniklas 	    state = last_cr;
482e93f7393Sniklas 	  else if (c != '\n')
483e93f7393Sniklas 	    state = last_random;
484e93f7393Sniklas 	  else
485e93f7393Sniklas 	    {
486e93f7393Sniklas 	      state = last_nl;
487e93f7393Sniklas 	      c = '\r';
488e93f7393Sniklas 	    }
489e93f7393Sniklas 	}
490e93f7393Sniklas     }
491e93f7393Sniklas   while (looping);
492e93f7393Sniklas 
493e93f7393Sniklas   if (c >= 0)
494e93f7393Sniklas     return c;
495e93f7393Sniklas 
496e93f7393Sniklas   if (c == SERIAL_TIMEOUT)
497b725ae77Skettenis #if 0
498b725ae77Skettenis     /* I fail to see how detaching here can be useful */
499e93f7393Sniklas     if (in_monitor_wait)	/* Watchdog went off */
500e93f7393Sniklas       {
501e93f7393Sniklas 	target_mourn_inferior ();
502b725ae77Skettenis 	error ("GDB serial timeout has expired.  Target detached.\n");
503e93f7393Sniklas       }
504e93f7393Sniklas     else
505e93f7393Sniklas #endif
506e93f7393Sniklas       error ("Timeout reading from remote system.");
507e93f7393Sniklas 
508e93f7393Sniklas   perror_with_name ("remote-monitor");
509e93f7393Sniklas }
510e93f7393Sniklas 
511e93f7393Sniklas /* Scan input from the remote system, until STRING is found.  If BUF is non-
512e93f7393Sniklas    zero, then collect input until we have collected either STRING or BUFLEN-1
513e93f7393Sniklas    chars.  In either case we terminate BUF with a 0.  If input overflows BUF
514e93f7393Sniklas    because STRING can't be found, return -1, else return number of chars in BUF
515e93f7393Sniklas    (minus the terminating NUL).  Note that in the non-overflow case, STRING
516e93f7393Sniklas    will be at the end of BUF.  */
517e93f7393Sniklas 
518e93f7393Sniklas int
monitor_expect(char * string,char * buf,int buflen)519b725ae77Skettenis monitor_expect (char *string, char *buf, int buflen)
520e93f7393Sniklas {
521e93f7393Sniklas   char *p = string;
522e93f7393Sniklas   int obuflen = buflen;
523e93f7393Sniklas   int c;
524e93f7393Sniklas 
525b725ae77Skettenis   if (monitor_debug_p)
526b725ae77Skettenis     {
527b725ae77Skettenis       char *safe_string = (char *) alloca ((strlen (string) * 4) + 1);
528b725ae77Skettenis       monitor_printable_string (safe_string, string, 0);
529b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, "MON Expecting '%s'\n", safe_string);
530b725ae77Skettenis     }
531b725ae77Skettenis 
532b725ae77Skettenis   immediate_quit++;
533e93f7393Sniklas   while (1)
534e93f7393Sniklas     {
535e93f7393Sniklas       if (buf)
536e93f7393Sniklas 	{
537e93f7393Sniklas 	  if (buflen < 2)
538e93f7393Sniklas 	    {
539e93f7393Sniklas 	      *buf = '\000';
540b725ae77Skettenis 	      immediate_quit--;
541e93f7393Sniklas 	      return -1;
542e93f7393Sniklas 	    }
543e93f7393Sniklas 
544e93f7393Sniklas 	  c = readchar (timeout);
545e93f7393Sniklas 	  if (c == '\000')
546e93f7393Sniklas 	    continue;
547e93f7393Sniklas 	  *buf++ = c;
548e93f7393Sniklas 	  buflen--;
549e93f7393Sniklas 	}
550e93f7393Sniklas       else
551e93f7393Sniklas 	c = readchar (timeout);
552e93f7393Sniklas 
553e93f7393Sniklas       /* Don't expect any ^C sent to be echoed */
554e93f7393Sniklas 
555e93f7393Sniklas       if (*p == '\003' || c == *p)
556e93f7393Sniklas 	{
557e93f7393Sniklas 	  p++;
558e93f7393Sniklas 	  if (*p == '\0')
559e93f7393Sniklas 	    {
560b725ae77Skettenis 	      immediate_quit--;
561e93f7393Sniklas 
562e93f7393Sniklas 	      if (buf)
563e93f7393Sniklas 		{
564e93f7393Sniklas 		  *buf++ = '\000';
565e93f7393Sniklas 		  return obuflen - buflen;
566e93f7393Sniklas 		}
567e93f7393Sniklas 	      else
568e93f7393Sniklas 		return 0;
569e93f7393Sniklas 	    }
570e93f7393Sniklas 	}
571e93f7393Sniklas       else
572e93f7393Sniklas 	{
573b725ae77Skettenis 	  /* We got a character that doesn't match the string.  We need to
574b725ae77Skettenis 	     back up p, but how far?  If we're looking for "..howdy" and the
575b725ae77Skettenis 	     monitor sends "...howdy"?  There's certainly a match in there,
576b725ae77Skettenis 	     but when we receive the third ".", we won't find it if we just
577b725ae77Skettenis 	     restart the matching at the beginning of the string.
578b725ae77Skettenis 
579b725ae77Skettenis 	     This is a Boyer-Moore kind of situation.  We want to reset P to
580b725ae77Skettenis 	     the end of the longest prefix of STRING that is a suffix of
581b725ae77Skettenis 	     what we've read so far.  In the example above, that would be
582b725ae77Skettenis 	     ".." --- the longest prefix of "..howdy" that is a suffix of
583b725ae77Skettenis 	     "...".  This longest prefix could be the empty string, if C
584b725ae77Skettenis 	     is nowhere to be found in STRING.
585b725ae77Skettenis 
586b725ae77Skettenis 	     If this longest prefix is not the empty string, it must contain
587b725ae77Skettenis 	     C, so let's search from the end of STRING for instances of C,
588b725ae77Skettenis 	     and see if the portion of STRING before that is a suffix of
589b725ae77Skettenis 	     what we read before C.  Actually, we can search backwards from
590b725ae77Skettenis 	     p, since we know no prefix can be longer than that.
591b725ae77Skettenis 
592b725ae77Skettenis 	     Note that we can use STRING itself, along with C, as a record
593b725ae77Skettenis 	     of what we've received so far.  :) */
594b725ae77Skettenis 	  int i;
595b725ae77Skettenis 
596b725ae77Skettenis 	  for (i = (p - string) - 1; i >= 0; i--)
597b725ae77Skettenis 	    if (string[i] == c)
598b725ae77Skettenis 	      {
599b725ae77Skettenis 		/* Is this prefix a suffix of what we've read so far?
600b725ae77Skettenis 		   In other words, does
601b725ae77Skettenis                      string[0 .. i-1] == string[p - i, p - 1]? */
602b725ae77Skettenis 		if (! memcmp (string, p - i, i))
603b725ae77Skettenis 		  {
604b725ae77Skettenis 		    p = string + i + 1;
605b725ae77Skettenis 		    break;
606b725ae77Skettenis 		  }
607b725ae77Skettenis 	      }
608b725ae77Skettenis 	  if (i < 0)
609e93f7393Sniklas 	    p = string;
610e93f7393Sniklas 	}
611e93f7393Sniklas     }
612e93f7393Sniklas }
613e93f7393Sniklas 
614e93f7393Sniklas /* Search for a regexp.  */
615e93f7393Sniklas 
616e93f7393Sniklas static int
monitor_expect_regexp(struct re_pattern_buffer * pat,char * buf,int buflen)617b725ae77Skettenis monitor_expect_regexp (struct re_pattern_buffer *pat, char *buf, int buflen)
618e93f7393Sniklas {
619e93f7393Sniklas   char *mybuf;
620e93f7393Sniklas   char *p;
621b725ae77Skettenis   monitor_debug ("MON Expecting regexp\n");
622e93f7393Sniklas   if (buf)
623e93f7393Sniklas     mybuf = buf;
624e93f7393Sniklas   else
625e93f7393Sniklas     {
626b725ae77Skettenis       mybuf = alloca (TARGET_BUF_SIZE);
627b725ae77Skettenis       buflen = TARGET_BUF_SIZE;
628e93f7393Sniklas     }
629e93f7393Sniklas 
630e93f7393Sniklas   p = mybuf;
631e93f7393Sniklas   while (1)
632e93f7393Sniklas     {
633e93f7393Sniklas       int retval;
634e93f7393Sniklas 
635e93f7393Sniklas       if (p - mybuf >= buflen)
636e93f7393Sniklas 	{			/* Buffer about to overflow */
637e93f7393Sniklas 
638e93f7393Sniklas /* On overflow, we copy the upper half of the buffer to the lower half.  Not
639e93f7393Sniklas    great, but it usually works... */
640e93f7393Sniklas 
641e93f7393Sniklas 	  memcpy (mybuf, mybuf + buflen / 2, buflen / 2);
642e93f7393Sniklas 	  p = mybuf + buflen / 2;
643e93f7393Sniklas 	}
644e93f7393Sniklas 
645e93f7393Sniklas       *p++ = readchar (timeout);
646e93f7393Sniklas 
647e93f7393Sniklas       retval = re_search (pat, mybuf, p - mybuf, 0, p - mybuf, NULL);
648e93f7393Sniklas       if (retval >= 0)
649e93f7393Sniklas 	return 1;
650e93f7393Sniklas     }
651e93f7393Sniklas }
652e93f7393Sniklas 
653e93f7393Sniklas /* Keep discarding input until we see the MONITOR prompt.
654e93f7393Sniklas 
655e93f7393Sniklas    The convention for dealing with the prompt is that you
656e93f7393Sniklas    o give your command
657e93f7393Sniklas    o *then* wait for the prompt.
658e93f7393Sniklas 
659e93f7393Sniklas    Thus the last thing that a procedure does with the serial line will
660e93f7393Sniklas    be an monitor_expect_prompt().  Exception: monitor_resume does not
661e93f7393Sniklas    wait for the prompt, because the terminal is being handed over to
662e93f7393Sniklas    the inferior.  However, the next thing which happens after that is
663e93f7393Sniklas    a monitor_wait which does wait for the prompt.  Note that this
664e93f7393Sniklas    includes abnormal exit, e.g. error().  This is necessary to prevent
665e93f7393Sniklas    getting into states from which we can't recover.  */
666e93f7393Sniklas 
667e93f7393Sniklas int
monitor_expect_prompt(char * buf,int buflen)668b725ae77Skettenis monitor_expect_prompt (char *buf, int buflen)
669e93f7393Sniklas {
670b725ae77Skettenis   monitor_debug ("MON Expecting prompt\n");
671e93f7393Sniklas   return monitor_expect (current_monitor->prompt, buf, buflen);
672e93f7393Sniklas }
673e93f7393Sniklas 
674e93f7393Sniklas /* Get N 32-bit words from remote, each preceded by a space, and put
675e93f7393Sniklas    them in registers starting at REGNO.  */
676e93f7393Sniklas 
677b725ae77Skettenis #if 0
678e93f7393Sniklas static unsigned long
679b725ae77Skettenis get_hex_word (void)
680e93f7393Sniklas {
681e93f7393Sniklas   unsigned long val;
682e93f7393Sniklas   int i;
683e93f7393Sniklas   int ch;
684e93f7393Sniklas 
685e93f7393Sniklas   do
686e93f7393Sniklas     ch = readchar (timeout);
687e93f7393Sniklas   while (isspace (ch));
688e93f7393Sniklas 
689e93f7393Sniklas   val = from_hex (ch);
690e93f7393Sniklas 
691e93f7393Sniklas   for (i = 7; i >= 1; i--)
692e93f7393Sniklas     {
693e93f7393Sniklas       ch = readchar (timeout);
694e93f7393Sniklas       if (!isxdigit (ch))
695e93f7393Sniklas 	break;
696e93f7393Sniklas       val = (val << 4) | from_hex (ch);
697e93f7393Sniklas     }
698e93f7393Sniklas 
699e93f7393Sniklas   return val;
700e93f7393Sniklas }
701b725ae77Skettenis #endif
702e93f7393Sniklas 
703e93f7393Sniklas static void
compile_pattern(char * pattern,struct re_pattern_buffer * compiled_pattern,char * fastmap)704b725ae77Skettenis compile_pattern (char *pattern, struct re_pattern_buffer *compiled_pattern,
705b725ae77Skettenis 		 char *fastmap)
706e93f7393Sniklas {
707e93f7393Sniklas   int tmp;
708b725ae77Skettenis   const char *val;
709e93f7393Sniklas 
710e93f7393Sniklas   compiled_pattern->fastmap = fastmap;
711e93f7393Sniklas 
712e93f7393Sniklas   tmp = re_set_syntax (RE_SYNTAX_EMACS);
713e93f7393Sniklas   val = re_compile_pattern (pattern,
714e93f7393Sniklas 			    strlen (pattern),
715e93f7393Sniklas 			    compiled_pattern);
716e93f7393Sniklas   re_set_syntax (tmp);
717e93f7393Sniklas 
718e93f7393Sniklas   if (val)
719e93f7393Sniklas     error ("compile_pattern: Can't compile pattern string `%s': %s!", pattern, val);
720e93f7393Sniklas 
721e93f7393Sniklas   if (fastmap)
722e93f7393Sniklas     re_compile_fastmap (compiled_pattern);
723e93f7393Sniklas }
724e93f7393Sniklas 
725e93f7393Sniklas /* Open a connection to a remote debugger. NAME is the filename used
726e93f7393Sniklas    for communication.  */
727e93f7393Sniklas 
728e93f7393Sniklas void
monitor_open(char * args,struct monitor_ops * mon_ops,int from_tty)729b725ae77Skettenis monitor_open (char *args, struct monitor_ops *mon_ops, int from_tty)
730e93f7393Sniklas {
731e93f7393Sniklas   char *name;
732e93f7393Sniklas   char **p;
733e93f7393Sniklas 
734e93f7393Sniklas   if (mon_ops->magic != MONITOR_OPS_MAGIC)
735e93f7393Sniklas     error ("Magic number of monitor_ops struct wrong.");
736e93f7393Sniklas 
737e93f7393Sniklas   targ_ops = mon_ops->target;
738e93f7393Sniklas   name = targ_ops->to_shortname;
739e93f7393Sniklas 
740e93f7393Sniklas   if (!args)
741e93f7393Sniklas     error ("Use `target %s DEVICE-NAME' to use a serial port, or \n\
742e93f7393Sniklas `target %s HOST-NAME:PORT-NUMBER' to use a network connection.", name, name);
743e93f7393Sniklas 
744e93f7393Sniklas   target_preopen (from_tty);
745e93f7393Sniklas 
746e93f7393Sniklas   /* Setup pattern for register dump */
747e93f7393Sniklas 
748e93f7393Sniklas   if (mon_ops->register_pattern)
749e93f7393Sniklas     compile_pattern (mon_ops->register_pattern, &register_pattern,
750e93f7393Sniklas 		     register_fastmap);
751e93f7393Sniklas 
752e93f7393Sniklas   if (mon_ops->getmem.resp_delim)
753e93f7393Sniklas     compile_pattern (mon_ops->getmem.resp_delim, &getmem_resp_delim_pattern,
754e93f7393Sniklas 		     getmem_resp_delim_fastmap);
755e93f7393Sniklas 
756b725ae77Skettenis   if (mon_ops->setmem.resp_delim)
757b725ae77Skettenis     compile_pattern (mon_ops->setmem.resp_delim, &setmem_resp_delim_pattern,
758b725ae77Skettenis                      setmem_resp_delim_fastmap);
759b725ae77Skettenis 
760b725ae77Skettenis   if (mon_ops->setreg.resp_delim)
761b725ae77Skettenis     compile_pattern (mon_ops->setreg.resp_delim, &setreg_resp_delim_pattern,
762b725ae77Skettenis                      setreg_resp_delim_fastmap);
763b725ae77Skettenis 
764e93f7393Sniklas   unpush_target (targ_ops);
765e93f7393Sniklas 
766e93f7393Sniklas   if (dev_name)
767b725ae77Skettenis     xfree (dev_name);
768b725ae77Skettenis   dev_name = xstrdup (args);
769e93f7393Sniklas 
770b725ae77Skettenis   monitor_desc = serial_open (dev_name);
771e93f7393Sniklas 
772e93f7393Sniklas   if (!monitor_desc)
773e93f7393Sniklas     perror_with_name (dev_name);
774e93f7393Sniklas 
775e93f7393Sniklas   if (baud_rate != -1)
776e93f7393Sniklas     {
777b725ae77Skettenis       if (serial_setbaudrate (monitor_desc, baud_rate))
778e93f7393Sniklas 	{
779b725ae77Skettenis 	  serial_close (monitor_desc);
780e93f7393Sniklas 	  perror_with_name (dev_name);
781e93f7393Sniklas 	}
782e93f7393Sniklas     }
783e93f7393Sniklas 
784b725ae77Skettenis   serial_raw (monitor_desc);
785e93f7393Sniklas 
786b725ae77Skettenis   serial_flush_input (monitor_desc);
787e93f7393Sniklas 
788e93f7393Sniklas   /* some systems only work with 2 stop bits */
789e93f7393Sniklas 
790b725ae77Skettenis   serial_setstopbits (monitor_desc, mon_ops->stopbits);
791e93f7393Sniklas 
792e93f7393Sniklas   current_monitor = mon_ops;
793e93f7393Sniklas 
794e93f7393Sniklas   /* See if we can wake up the monitor.  First, try sending a stop sequence,
795e93f7393Sniklas      then send the init strings.  Last, remove all breakpoints.  */
796e93f7393Sniklas 
797e93f7393Sniklas   if (current_monitor->stop)
798e93f7393Sniklas     {
799e93f7393Sniklas       monitor_stop ();
800e93f7393Sniklas       if ((current_monitor->flags & MO_NO_ECHO_ON_OPEN) == 0)
801e93f7393Sniklas 	{
802b725ae77Skettenis 	  monitor_debug ("EXP Open echo\n");
803e93f7393Sniklas 	  monitor_expect_prompt (NULL, 0);
804e93f7393Sniklas 	}
805e93f7393Sniklas     }
806e93f7393Sniklas 
807e93f7393Sniklas   /* wake up the monitor and see if it's alive */
808e93f7393Sniklas   for (p = mon_ops->init; *p != NULL; p++)
809e93f7393Sniklas     {
810e93f7393Sniklas       /* Some of the characters we send may not be echoed,
811e93f7393Sniklas          but we hope to get a prompt at the end of it all. */
812e93f7393Sniklas 
813e93f7393Sniklas       if ((current_monitor->flags & MO_NO_ECHO_ON_OPEN) == 0)
814e93f7393Sniklas 	monitor_printf (*p);
815e93f7393Sniklas       else
816e93f7393Sniklas 	monitor_printf_noecho (*p);
817e93f7393Sniklas       monitor_expect_prompt (NULL, 0);
818e93f7393Sniklas     }
819e93f7393Sniklas 
820b725ae77Skettenis   serial_flush_input (monitor_desc);
821b725ae77Skettenis 
822b725ae77Skettenis   /* Alloc breakpoints */
823b725ae77Skettenis   if (mon_ops->set_break != NULL)
824b725ae77Skettenis     {
825b725ae77Skettenis       if (mon_ops->num_breakpoints == 0)
826b725ae77Skettenis 	mon_ops->num_breakpoints = 8;
827b725ae77Skettenis 
828b725ae77Skettenis       breakaddr = (CORE_ADDR *) xmalloc (mon_ops->num_breakpoints * sizeof (CORE_ADDR));
829b725ae77Skettenis       memset (breakaddr, 0, mon_ops->num_breakpoints * sizeof (CORE_ADDR));
830b725ae77Skettenis     }
831e93f7393Sniklas 
832e93f7393Sniklas   /* Remove all breakpoints */
833e93f7393Sniklas 
834e93f7393Sniklas   if (mon_ops->clr_all_break)
835e93f7393Sniklas     {
836e93f7393Sniklas       monitor_printf (mon_ops->clr_all_break);
837e93f7393Sniklas       monitor_expect_prompt (NULL, 0);
838e93f7393Sniklas     }
839e93f7393Sniklas 
840e93f7393Sniklas   if (from_tty)
841e93f7393Sniklas     printf_unfiltered ("Remote target %s connected to %s\n", name, dev_name);
842e93f7393Sniklas 
843e93f7393Sniklas   push_target (targ_ops);
844e93f7393Sniklas 
845b725ae77Skettenis   inferior_ptid = pid_to_ptid (42000);	/* Make run command think we are busy... */
846e93f7393Sniklas 
847e93f7393Sniklas   /* Give monitor_wait something to read */
848e93f7393Sniklas 
849e93f7393Sniklas   monitor_printf (current_monitor->line_term);
850e93f7393Sniklas 
851e93f7393Sniklas   start_remote ();
852e93f7393Sniklas }
853e93f7393Sniklas 
854e93f7393Sniklas /* Close out all files and local state before this target loses
855e93f7393Sniklas    control.  */
856e93f7393Sniklas 
857e93f7393Sniklas void
monitor_close(int quitting)858b725ae77Skettenis monitor_close (int quitting)
859e93f7393Sniklas {
860e93f7393Sniklas   if (monitor_desc)
861b725ae77Skettenis     serial_close (monitor_desc);
862b725ae77Skettenis 
863b725ae77Skettenis   /* Free breakpoint memory */
864b725ae77Skettenis   if (breakaddr != NULL)
865b725ae77Skettenis     {
866b725ae77Skettenis       xfree (breakaddr);
867b725ae77Skettenis       breakaddr = NULL;
868b725ae77Skettenis     }
869b725ae77Skettenis 
870e93f7393Sniklas   monitor_desc = NULL;
871e93f7393Sniklas }
872e93f7393Sniklas 
873e93f7393Sniklas /* Terminate the open connection to the remote debugger.  Use this
874e93f7393Sniklas    when you want to detach and do something else with your gdb.  */
875e93f7393Sniklas 
876e93f7393Sniklas static void
monitor_detach(char * args,int from_tty)877b725ae77Skettenis monitor_detach (char *args, int from_tty)
878e93f7393Sniklas {
879e93f7393Sniklas   pop_target ();		/* calls monitor_close to do the real work */
880e93f7393Sniklas   if (from_tty)
881e93f7393Sniklas     printf_unfiltered ("Ending remote %s debugging\n", target_shortname);
882e93f7393Sniklas }
883e93f7393Sniklas 
884e93f7393Sniklas /* Convert VALSTR into the target byte-ordered value of REGNO and store it.  */
885e93f7393Sniklas 
886e93f7393Sniklas char *
monitor_supply_register(int regno,char * valstr)887b725ae77Skettenis monitor_supply_register (int regno, char *valstr)
888e93f7393Sniklas {
889b725ae77Skettenis   ULONGEST val;
890b725ae77Skettenis   unsigned char regbuf[MAX_REGISTER_SIZE];
891e93f7393Sniklas   char *p;
892e93f7393Sniklas 
893b725ae77Skettenis   val = 0;
894b725ae77Skettenis   p = valstr;
895b725ae77Skettenis   while (p && *p != '\0')
896b725ae77Skettenis     {
897b725ae77Skettenis       if (*p == '\r' || *p == '\n')
898b725ae77Skettenis         {
899b725ae77Skettenis           while (*p != '\0')
900b725ae77Skettenis               p++;
901b725ae77Skettenis           break;
902b725ae77Skettenis         }
903b725ae77Skettenis       if (isspace (*p))
904b725ae77Skettenis         {
905b725ae77Skettenis           p++;
906b725ae77Skettenis           continue;
907b725ae77Skettenis         }
908b725ae77Skettenis       if (!isxdigit (*p) && *p != 'x')
909b725ae77Skettenis         {
910b725ae77Skettenis           break;
911b725ae77Skettenis         }
912b725ae77Skettenis 
913b725ae77Skettenis       val <<= 4;
914b725ae77Skettenis       val += fromhex (*p++);
915b725ae77Skettenis     }
916b725ae77Skettenis   monitor_debug ("Supplying Register %d %s\n", regno, valstr);
917e93f7393Sniklas 
918e93f7393Sniklas   if (val == 0 && valstr == p)
919e93f7393Sniklas     error ("monitor_supply_register (%d):  bad value from monitor: %s.",
920e93f7393Sniklas 	   regno, valstr);
921e93f7393Sniklas 
922e93f7393Sniklas   /* supply register stores in target byte order, so swap here */
923e93f7393Sniklas 
924*63addd46Skettenis   store_unsigned_integer (regbuf, register_size (current_gdbarch, regno), val);
925e93f7393Sniklas 
926*63addd46Skettenis   regcache_raw_supply (current_regcache, regno, regbuf);
927e93f7393Sniklas 
928e93f7393Sniklas   return p;
929e93f7393Sniklas }
930e93f7393Sniklas 
931e93f7393Sniklas /* Tell the remote machine to resume.  */
932e93f7393Sniklas 
933e93f7393Sniklas static void
monitor_resume(ptid_t ptid,int step,enum target_signal sig)934b725ae77Skettenis monitor_resume (ptid_t ptid, int step, enum target_signal sig)
935e93f7393Sniklas {
936e93f7393Sniklas   /* Some monitors require a different command when starting a program */
937b725ae77Skettenis   monitor_debug ("MON resume\n");
938e93f7393Sniklas   if (current_monitor->flags & MO_RUN_FIRST_TIME && first_time == 1)
939e93f7393Sniklas     {
940e93f7393Sniklas       first_time = 0;
941e93f7393Sniklas       monitor_printf ("run\r");
942e93f7393Sniklas       if (current_monitor->flags & MO_NEED_REGDUMP_AFTER_CONT)
943e93f7393Sniklas 	dump_reg_flag = 1;
944e93f7393Sniklas       return;
945e93f7393Sniklas     }
946e93f7393Sniklas   if (step)
947e93f7393Sniklas     monitor_printf (current_monitor->step);
948e93f7393Sniklas   else
949e93f7393Sniklas     {
950b725ae77Skettenis       if (current_monitor->continue_hook)
951b725ae77Skettenis 	(*current_monitor->continue_hook) ();
952b725ae77Skettenis       else
953e93f7393Sniklas 	monitor_printf (current_monitor->cont);
954e93f7393Sniklas       if (current_monitor->flags & MO_NEED_REGDUMP_AFTER_CONT)
955e93f7393Sniklas 	dump_reg_flag = 1;
956e93f7393Sniklas     }
957e93f7393Sniklas }
958e93f7393Sniklas 
959e93f7393Sniklas /* Parse the output of a register dump command.  A monitor specific
960e93f7393Sniklas    regexp is used to extract individual register descriptions of the
961e93f7393Sniklas    form REG=VAL.  Each description is split up into a name and a value
962e93f7393Sniklas    string which are passed down to monitor specific code.  */
963e93f7393Sniklas 
964b725ae77Skettenis static void
parse_register_dump(char * buf,int len)965b725ae77Skettenis parse_register_dump (char *buf, int len)
966e93f7393Sniklas {
967b725ae77Skettenis   monitor_debug ("MON Parsing  register dump\n");
968e93f7393Sniklas   while (1)
969e93f7393Sniklas     {
970e93f7393Sniklas       int regnamelen, vallen;
971e93f7393Sniklas       char *regname, *val;
972e93f7393Sniklas       /* Element 0 points to start of register name, and element 1
973e93f7393Sniklas          points to the start of the register value.  */
974e93f7393Sniklas       struct re_registers register_strings;
975e93f7393Sniklas 
976b725ae77Skettenis       memset (&register_strings, 0, sizeof (struct re_registers));
977b725ae77Skettenis 
978e93f7393Sniklas       if (re_search (&register_pattern, buf, len, 0, len,
979e93f7393Sniklas 		     &register_strings) == -1)
980e93f7393Sniklas 	break;
981e93f7393Sniklas 
982e93f7393Sniklas       regnamelen = register_strings.end[1] - register_strings.start[1];
983e93f7393Sniklas       regname = buf + register_strings.start[1];
984e93f7393Sniklas       vallen = register_strings.end[2] - register_strings.start[2];
985e93f7393Sniklas       val = buf + register_strings.start[2];
986e93f7393Sniklas 
987e93f7393Sniklas       current_monitor->supply_register (regname, regnamelen, val, vallen);
988e93f7393Sniklas 
989e93f7393Sniklas       buf += register_strings.end[0];
990e93f7393Sniklas       len -= register_strings.end[0];
991e93f7393Sniklas     }
992e93f7393Sniklas }
993e93f7393Sniklas 
994e93f7393Sniklas /* Send ^C to target to halt it.  Target will respond, and send us a
995e93f7393Sniklas    packet.  */
996e93f7393Sniklas 
997e93f7393Sniklas static void
monitor_interrupt(int signo)998b725ae77Skettenis monitor_interrupt (int signo)
999e93f7393Sniklas {
1000e93f7393Sniklas   /* If this doesn't work, try more severe steps.  */
1001e93f7393Sniklas   signal (signo, monitor_interrupt_twice);
1002e93f7393Sniklas 
1003b725ae77Skettenis   if (monitor_debug_p || remote_debug)
1004b725ae77Skettenis     fprintf_unfiltered (gdb_stdlog, "monitor_interrupt called\n");
1005e93f7393Sniklas 
1006e93f7393Sniklas   target_stop ();
1007e93f7393Sniklas }
1008e93f7393Sniklas 
1009e93f7393Sniklas /* The user typed ^C twice.  */
1010e93f7393Sniklas 
1011e93f7393Sniklas static void
monitor_interrupt_twice(int signo)1012b725ae77Skettenis monitor_interrupt_twice (int signo)
1013e93f7393Sniklas {
1014e93f7393Sniklas   signal (signo, ofunc);
1015e93f7393Sniklas 
1016e93f7393Sniklas   monitor_interrupt_query ();
1017e93f7393Sniklas 
1018e93f7393Sniklas   signal (signo, monitor_interrupt);
1019e93f7393Sniklas }
1020e93f7393Sniklas 
1021e93f7393Sniklas /* Ask the user what to do when an interrupt is received.  */
1022e93f7393Sniklas 
1023e93f7393Sniklas static void
monitor_interrupt_query(void)1024b725ae77Skettenis monitor_interrupt_query (void)
1025e93f7393Sniklas {
1026e93f7393Sniklas   target_terminal_ours ();
1027e93f7393Sniklas 
1028e93f7393Sniklas   if (query ("Interrupted while waiting for the program.\n\
1029e93f7393Sniklas Give up (and stop debugging it)? "))
1030e93f7393Sniklas     {
1031e93f7393Sniklas       target_mourn_inferior ();
1032b725ae77Skettenis       throw_exception (RETURN_QUIT);
1033e93f7393Sniklas     }
1034e93f7393Sniklas 
1035e93f7393Sniklas   target_terminal_inferior ();
1036e93f7393Sniklas }
1037e93f7393Sniklas 
1038e93f7393Sniklas static void
monitor_wait_cleanup(void * old_timeout)1039b725ae77Skettenis monitor_wait_cleanup (void *old_timeout)
1040e93f7393Sniklas {
1041b725ae77Skettenis   timeout = *(int *) old_timeout;
1042e93f7393Sniklas   signal (SIGINT, ofunc);
1043e93f7393Sniklas   in_monitor_wait = 0;
1044e93f7393Sniklas }
1045e93f7393Sniklas 
1046b725ae77Skettenis 
1047b725ae77Skettenis 
1048b725ae77Skettenis static void
monitor_wait_filter(char * buf,int bufmax,int * ext_resp_len,struct target_waitstatus * status)1049b725ae77Skettenis monitor_wait_filter (char *buf,
1050b725ae77Skettenis 		     int bufmax,
1051b725ae77Skettenis 		     int *ext_resp_len,
1052b725ae77Skettenis 		     struct target_waitstatus *status)
1053b725ae77Skettenis {
1054b725ae77Skettenis   int resp_len;
1055b725ae77Skettenis   do
1056b725ae77Skettenis     {
1057b725ae77Skettenis       resp_len = monitor_expect_prompt (buf, bufmax);
1058b725ae77Skettenis       *ext_resp_len = resp_len;
1059b725ae77Skettenis 
1060b725ae77Skettenis       if (resp_len <= 0)
1061b725ae77Skettenis 	fprintf_unfiltered (gdb_stderr, "monitor_wait:  excessive response from monitor: %s.", buf);
1062b725ae77Skettenis     }
1063b725ae77Skettenis   while (resp_len < 0);
1064b725ae77Skettenis 
1065b725ae77Skettenis   /* Print any output characters that were preceded by ^O.  */
1066b725ae77Skettenis   /* FIXME - This would be great as a user settabgle flag */
1067b725ae77Skettenis   if (monitor_debug_p || remote_debug
1068b725ae77Skettenis       || current_monitor->flags & MO_PRINT_PROGRAM_OUTPUT)
1069b725ae77Skettenis     {
1070b725ae77Skettenis       int i;
1071b725ae77Skettenis 
1072b725ae77Skettenis       for (i = 0; i < resp_len - 1; i++)
1073b725ae77Skettenis 	if (buf[i] == 0x0f)
1074b725ae77Skettenis 	  putchar_unfiltered (buf[++i]);
1075b725ae77Skettenis     }
1076b725ae77Skettenis }
1077b725ae77Skettenis 
1078b725ae77Skettenis 
1079b725ae77Skettenis 
1080e93f7393Sniklas /* Wait until the remote machine stops, then return, storing status in
1081e93f7393Sniklas    status just as `wait' would.  */
1082e93f7393Sniklas 
1083b725ae77Skettenis static ptid_t
monitor_wait(ptid_t ptid,struct target_waitstatus * status)1084b725ae77Skettenis monitor_wait (ptid_t ptid, struct target_waitstatus *status)
1085e93f7393Sniklas {
1086e93f7393Sniklas   int old_timeout = timeout;
1087b725ae77Skettenis   char buf[TARGET_BUF_SIZE];
1088e93f7393Sniklas   int resp_len;
1089e93f7393Sniklas   struct cleanup *old_chain;
1090e93f7393Sniklas 
1091e93f7393Sniklas   status->kind = TARGET_WAITKIND_EXITED;
1092e93f7393Sniklas   status->value.integer = 0;
1093e93f7393Sniklas 
1094b725ae77Skettenis   old_chain = make_cleanup (monitor_wait_cleanup, &old_timeout);
1095b725ae77Skettenis   monitor_debug ("MON wait\n");
1096e93f7393Sniklas 
1097b725ae77Skettenis #if 0
1098b725ae77Skettenis   /* This is somthing other than a maintenance command */
1099e93f7393Sniklas     in_monitor_wait = 1;
1100e93f7393Sniklas   timeout = watchdog > 0 ? watchdog : -1;
1101e93f7393Sniklas #else
1102e93f7393Sniklas   timeout = -1;		/* Don't time out -- user program is running. */
1103e93f7393Sniklas #endif
1104e93f7393Sniklas 
1105e93f7393Sniklas   ofunc = (void (*)()) signal (SIGINT, monitor_interrupt);
1106e93f7393Sniklas 
1107b725ae77Skettenis   if (current_monitor->wait_filter)
1108b725ae77Skettenis     (*current_monitor->wait_filter) (buf, sizeof (buf), &resp_len, status);
1109b725ae77Skettenis   else
1110b725ae77Skettenis     monitor_wait_filter (buf, sizeof (buf), &resp_len, status);
1111b725ae77Skettenis 
1112b725ae77Skettenis #if 0				/* Transferred to monitor wait filter */
1113e93f7393Sniklas   do
1114e93f7393Sniklas     {
1115e93f7393Sniklas       resp_len = monitor_expect_prompt (buf, sizeof (buf));
1116e93f7393Sniklas 
1117e93f7393Sniklas       if (resp_len <= 0)
1118e93f7393Sniklas 	fprintf_unfiltered (gdb_stderr, "monitor_wait:  excessive response from monitor: %s.", buf);
1119e93f7393Sniklas     }
1120e93f7393Sniklas   while (resp_len < 0);
1121e93f7393Sniklas 
1122b725ae77Skettenis   /* Print any output characters that were preceded by ^O.  */
1123b725ae77Skettenis   /* FIXME - This would be great as a user settabgle flag */
1124b725ae77Skettenis   if (monitor_debug_p || remote_debug
1125b725ae77Skettenis       || current_monitor->flags & MO_PRINT_PROGRAM_OUTPUT)
1126b725ae77Skettenis     {
1127b725ae77Skettenis       int i;
1128b725ae77Skettenis 
1129b725ae77Skettenis       for (i = 0; i < resp_len - 1; i++)
1130b725ae77Skettenis 	if (buf[i] == 0x0f)
1131b725ae77Skettenis 	  putchar_unfiltered (buf[++i]);
1132b725ae77Skettenis     }
1133b725ae77Skettenis #endif
1134b725ae77Skettenis 
1135e93f7393Sniklas   signal (SIGINT, ofunc);
1136e93f7393Sniklas 
1137e93f7393Sniklas   timeout = old_timeout;
1138b725ae77Skettenis #if 0
1139e93f7393Sniklas   if (dump_reg_flag && current_monitor->dump_registers)
1140e93f7393Sniklas     {
1141e93f7393Sniklas       dump_reg_flag = 0;
1142e93f7393Sniklas       monitor_printf (current_monitor->dump_registers);
1143e93f7393Sniklas       resp_len = monitor_expect_prompt (buf, sizeof (buf));
1144e93f7393Sniklas     }
1145e93f7393Sniklas 
1146e93f7393Sniklas   if (current_monitor->register_pattern)
1147e93f7393Sniklas     parse_register_dump (buf, resp_len);
1148b725ae77Skettenis #else
1149b725ae77Skettenis   monitor_debug ("Wait fetching registers after stop\n");
1150b725ae77Skettenis   monitor_dump_regs ();
1151b725ae77Skettenis #endif
1152e93f7393Sniklas 
1153e93f7393Sniklas   status->kind = TARGET_WAITKIND_STOPPED;
1154e93f7393Sniklas   status->value.sig = TARGET_SIGNAL_TRAP;
1155e93f7393Sniklas 
1156e93f7393Sniklas   discard_cleanups (old_chain);
1157e93f7393Sniklas 
1158e93f7393Sniklas   in_monitor_wait = 0;
1159e93f7393Sniklas 
1160b725ae77Skettenis   return inferior_ptid;
1161e93f7393Sniklas }
1162e93f7393Sniklas 
1163e93f7393Sniklas /* Fetch register REGNO, or all registers if REGNO is -1. Returns
1164e93f7393Sniklas    errno value.  */
1165e93f7393Sniklas 
1166e93f7393Sniklas static void
monitor_fetch_register(int regno)1167b725ae77Skettenis monitor_fetch_register (int regno)
1168e93f7393Sniklas {
1169b725ae77Skettenis   const char *name;
1170b725ae77Skettenis   char *zerobuf;
1171b725ae77Skettenis   char *regbuf;
1172e93f7393Sniklas   int i;
1173e93f7393Sniklas 
1174b725ae77Skettenis   regbuf  = alloca (MAX_REGISTER_SIZE * 2 + 1);
1175b725ae77Skettenis   zerobuf = alloca (MAX_REGISTER_SIZE);
1176b725ae77Skettenis   memset (zerobuf, 0, MAX_REGISTER_SIZE);
1177e93f7393Sniklas 
1178b725ae77Skettenis   if (current_monitor->regname != NULL)
1179b725ae77Skettenis     name = current_monitor->regname (regno);
1180b725ae77Skettenis   else
1181b725ae77Skettenis     name = current_monitor->regnames[regno];
1182b725ae77Skettenis   monitor_debug ("MON fetchreg %d '%s'\n", regno, name ? name : "(null name)");
1183b725ae77Skettenis 
1184b725ae77Skettenis   if (!name || (*name == '\0'))
1185e93f7393Sniklas     {
1186b725ae77Skettenis       monitor_debug ("No register known for %d\n", regno);
1187*63addd46Skettenis       regcache_raw_supply (current_regcache, regno, zerobuf);
1188e93f7393Sniklas       return;
1189e93f7393Sniklas     }
1190e93f7393Sniklas 
1191e93f7393Sniklas   /* send the register examine command */
1192e93f7393Sniklas 
1193e93f7393Sniklas   monitor_printf (current_monitor->getreg.cmd, name);
1194e93f7393Sniklas 
1195e93f7393Sniklas   /* If RESP_DELIM is specified, we search for that as a leading
1196e93f7393Sniklas      delimiter for the register value.  Otherwise, we just start
1197e93f7393Sniklas      searching from the start of the buf.  */
1198e93f7393Sniklas 
1199e93f7393Sniklas   if (current_monitor->getreg.resp_delim)
1200b725ae77Skettenis     {
1201b725ae77Skettenis       monitor_debug ("EXP getreg.resp_delim\n");
1202e93f7393Sniklas       monitor_expect (current_monitor->getreg.resp_delim, NULL, 0);
1203b725ae77Skettenis       /* Handle case of first 32 registers listed in pairs.  */
1204b725ae77Skettenis       if (current_monitor->flags & MO_32_REGS_PAIRED
1205b725ae77Skettenis 	  && (regno & 1) != 0 && regno < 32)
1206b725ae77Skettenis 	{
1207b725ae77Skettenis 	  monitor_debug ("EXP getreg.resp_delim\n");
1208b725ae77Skettenis 	  monitor_expect (current_monitor->getreg.resp_delim, NULL, 0);
1209b725ae77Skettenis 	}
1210b725ae77Skettenis     }
1211e93f7393Sniklas 
1212e93f7393Sniklas   /* Skip leading spaces and "0x" if MO_HEX_PREFIX flag is set */
1213e93f7393Sniklas   if (current_monitor->flags & MO_HEX_PREFIX)
1214e93f7393Sniklas     {
1215e93f7393Sniklas       int c;
1216e93f7393Sniklas       c = readchar (timeout);
1217e93f7393Sniklas       while (c == ' ')
1218e93f7393Sniklas 	c = readchar (timeout);
1219e93f7393Sniklas       if ((c == '0') && ((c = readchar (timeout)) == 'x'))
1220e93f7393Sniklas 	;
1221e93f7393Sniklas       else
1222e93f7393Sniklas 	error ("Bad value returned from monitor while fetching register %x.",
1223e93f7393Sniklas 	       regno);
1224e93f7393Sniklas     }
1225e93f7393Sniklas 
1226e93f7393Sniklas   /* Read upto the maximum number of hex digits for this register, skipping
1227e93f7393Sniklas      spaces, but stop reading if something else is seen.  Some monitors
1228e93f7393Sniklas      like to drop leading zeros.  */
1229e93f7393Sniklas 
1230*63addd46Skettenis   for (i = 0; i < register_size (current_gdbarch, regno) * 2; i++)
1231e93f7393Sniklas     {
1232e93f7393Sniklas       int c;
1233e93f7393Sniklas       c = readchar (timeout);
1234e93f7393Sniklas       while (c == ' ')
1235e93f7393Sniklas 	c = readchar (timeout);
1236e93f7393Sniklas 
1237e93f7393Sniklas       if (!isxdigit (c))
1238e93f7393Sniklas 	break;
1239e93f7393Sniklas 
1240e93f7393Sniklas       regbuf[i] = c;
1241e93f7393Sniklas     }
1242e93f7393Sniklas 
1243e93f7393Sniklas   regbuf[i] = '\000';		/* terminate the number */
1244b725ae77Skettenis   monitor_debug ("REGVAL '%s'\n", regbuf);
1245e93f7393Sniklas 
1246e93f7393Sniklas   /* If TERM is present, we wait for that to show up.  Also, (if TERM
1247e93f7393Sniklas      is present), we will send TERM_CMD if that is present.  In any
1248e93f7393Sniklas      case, we collect all of the output into buf, and then wait for
1249e93f7393Sniklas      the normal prompt.  */
1250e93f7393Sniklas 
1251e93f7393Sniklas   if (current_monitor->getreg.term)
1252e93f7393Sniklas     {
1253b725ae77Skettenis       monitor_debug ("EXP getreg.term\n");
1254e93f7393Sniklas       monitor_expect (current_monitor->getreg.term, NULL, 0);		/* get response */
1255b725ae77Skettenis     }
1256e93f7393Sniklas 
1257e93f7393Sniklas   if (current_monitor->getreg.term_cmd)
1258e93f7393Sniklas     {
1259b725ae77Skettenis       monitor_debug ("EMIT getreg.term.cmd\n");
1260e93f7393Sniklas       monitor_printf (current_monitor->getreg.term_cmd);
1261e93f7393Sniklas     }
1262b725ae77Skettenis   if (!current_monitor->getreg.term ||	/* Already expected or */
1263b725ae77Skettenis       current_monitor->getreg.term_cmd)		/* ack expected */
1264e93f7393Sniklas     monitor_expect_prompt (NULL, 0);	/* get response */
1265e93f7393Sniklas 
1266e93f7393Sniklas   monitor_supply_register (regno, regbuf);
1267e93f7393Sniklas }
1268e93f7393Sniklas 
1269b725ae77Skettenis /* Sometimes, it takes several commands to dump the registers */
1270b725ae77Skettenis /* This is a primitive for use by variations of monitor interfaces in
1271b725ae77Skettenis    case they need to compose the operation.
1272b725ae77Skettenis  */
1273b725ae77Skettenis int
monitor_dump_reg_block(char * block_cmd)1274b725ae77Skettenis monitor_dump_reg_block (char *block_cmd)
1275e93f7393Sniklas {
1276b725ae77Skettenis   char buf[TARGET_BUF_SIZE];
1277e93f7393Sniklas   int resp_len;
1278b725ae77Skettenis   monitor_printf (block_cmd);
1279b725ae77Skettenis   resp_len = monitor_expect_prompt (buf, sizeof (buf));
1280b725ae77Skettenis   parse_register_dump (buf, resp_len);
1281b725ae77Skettenis   return 1;
1282b725ae77Skettenis }
1283e93f7393Sniklas 
1284b725ae77Skettenis 
1285b725ae77Skettenis /* Read the remote registers into the block regs.  */
1286b725ae77Skettenis /* Call the specific function if it has been provided */
1287b725ae77Skettenis 
1288b725ae77Skettenis static void
monitor_dump_regs(void)1289b725ae77Skettenis monitor_dump_regs (void)
1290b725ae77Skettenis {
1291b725ae77Skettenis   char buf[TARGET_BUF_SIZE];
1292b725ae77Skettenis   int resp_len;
1293b725ae77Skettenis   if (current_monitor->dumpregs)
1294b725ae77Skettenis     (*(current_monitor->dumpregs)) ();	/* call supplied function */
1295b725ae77Skettenis   else if (current_monitor->dump_registers)	/* default version */
1296e93f7393Sniklas     {
1297e93f7393Sniklas       monitor_printf (current_monitor->dump_registers);
1298e93f7393Sniklas       resp_len = monitor_expect_prompt (buf, sizeof (buf));
1299e93f7393Sniklas       parse_register_dump (buf, resp_len);
1300e93f7393Sniklas     }
1301e93f7393Sniklas   else
1302b725ae77Skettenis     internal_error (__FILE__, __LINE__, "failed internal consistency check");			/* Need some way to read registers */
1303e93f7393Sniklas }
1304e93f7393Sniklas 
1305e93f7393Sniklas static void
monitor_fetch_registers(int regno)1306b725ae77Skettenis monitor_fetch_registers (int regno)
1307e93f7393Sniklas {
1308b725ae77Skettenis   monitor_debug ("MON fetchregs\n");
1309e93f7393Sniklas   if (current_monitor->getreg.cmd)
1310e93f7393Sniklas     {
1311e93f7393Sniklas       if (regno >= 0)
1312e93f7393Sniklas 	{
1313e93f7393Sniklas 	  monitor_fetch_register (regno);
1314e93f7393Sniklas 	  return;
1315e93f7393Sniklas 	}
1316e93f7393Sniklas 
1317e93f7393Sniklas       for (regno = 0; regno < NUM_REGS; regno++)
1318e93f7393Sniklas 	monitor_fetch_register (regno);
1319e93f7393Sniklas     }
1320b725ae77Skettenis   else
1321b725ae77Skettenis     {
1322e93f7393Sniklas       monitor_dump_regs ();
1323e93f7393Sniklas     }
1324e93f7393Sniklas }
1325e93f7393Sniklas 
1326e93f7393Sniklas /* Store register REGNO, or all if REGNO == 0.  Return errno value.  */
1327e93f7393Sniklas 
1328e93f7393Sniklas static void
monitor_store_register(int regno)1329b725ae77Skettenis monitor_store_register (int regno)
1330e93f7393Sniklas {
1331b725ae77Skettenis   const char *name;
1332b725ae77Skettenis   ULONGEST val;
1333e93f7393Sniklas 
1334b725ae77Skettenis   if (current_monitor->regname != NULL)
1335b725ae77Skettenis     name = current_monitor->regname (regno);
1336b725ae77Skettenis   else
1337e93f7393Sniklas     name = current_monitor->regnames[regno];
1338b725ae77Skettenis 
1339b725ae77Skettenis   if (!name || (*name == '\0'))
1340b725ae77Skettenis     {
1341b725ae77Skettenis       monitor_debug ("MON Cannot store unknown register\n");
1342e93f7393Sniklas       return;
1343b725ae77Skettenis     }
1344e93f7393Sniklas 
1345e93f7393Sniklas   val = read_register (regno);
1346b725ae77Skettenis   monitor_debug ("MON storeg %d %s\n", regno,
1347*63addd46Skettenis 		 phex (val, register_size (current_gdbarch, regno)));
1348e93f7393Sniklas 
1349e93f7393Sniklas   /* send the register deposit command */
1350e93f7393Sniklas 
1351e93f7393Sniklas   if (current_monitor->flags & MO_REGISTER_VALUE_FIRST)
1352e93f7393Sniklas     monitor_printf (current_monitor->setreg.cmd, val, name);
1353b725ae77Skettenis   else if (current_monitor->flags & MO_SETREG_INTERACTIVE)
1354b725ae77Skettenis     monitor_printf (current_monitor->setreg.cmd, name);
1355e93f7393Sniklas   else
1356e93f7393Sniklas     monitor_printf (current_monitor->setreg.cmd, name, val);
1357e93f7393Sniklas 
1358b725ae77Skettenis   if (current_monitor->setreg.resp_delim)
1359b725ae77Skettenis     {
1360b725ae77Skettenis       monitor_debug ("EXP setreg.resp_delim\n");
1361b725ae77Skettenis       monitor_expect_regexp (&setreg_resp_delim_pattern, NULL, 0);
1362b725ae77Skettenis       if (current_monitor->flags & MO_SETREG_INTERACTIVE)
1363b725ae77Skettenis 	monitor_printf ("%s\r", paddr_nz (val));
1364b725ae77Skettenis     }
1365b725ae77Skettenis   if (current_monitor->setreg.term)
1366b725ae77Skettenis     {
1367b725ae77Skettenis       monitor_debug ("EXP setreg.term\n");
1368b725ae77Skettenis       monitor_expect (current_monitor->setreg.term, NULL, 0);
1369b725ae77Skettenis       if (current_monitor->flags & MO_SETREG_INTERACTIVE)
1370b725ae77Skettenis 	monitor_printf ("%s\r", paddr_nz (val));
1371e93f7393Sniklas       monitor_expect_prompt (NULL, 0);
1372e93f7393Sniklas     }
1373b725ae77Skettenis   else
1374b725ae77Skettenis     monitor_expect_prompt (NULL, 0);
1375b725ae77Skettenis   if (current_monitor->setreg.term_cmd)		/* Mode exit required */
1376b725ae77Skettenis     {
1377b725ae77Skettenis       monitor_debug ("EXP setreg_termcmd\n");
1378b725ae77Skettenis       monitor_printf ("%s", current_monitor->setreg.term_cmd);
1379b725ae77Skettenis       monitor_expect_prompt (NULL, 0);
1380b725ae77Skettenis     }
1381b725ae77Skettenis }				/* monitor_store_register */
1382e93f7393Sniklas 
1383e93f7393Sniklas /* Store the remote registers.  */
1384e93f7393Sniklas 
1385e93f7393Sniklas static void
monitor_store_registers(int regno)1386b725ae77Skettenis monitor_store_registers (int regno)
1387e93f7393Sniklas {
1388e93f7393Sniklas   if (regno >= 0)
1389e93f7393Sniklas     {
1390e93f7393Sniklas       monitor_store_register (regno);
1391e93f7393Sniklas       return;
1392e93f7393Sniklas     }
1393e93f7393Sniklas 
1394e93f7393Sniklas   for (regno = 0; regno < NUM_REGS; regno++)
1395e93f7393Sniklas     monitor_store_register (regno);
1396e93f7393Sniklas }
1397e93f7393Sniklas 
1398e93f7393Sniklas /* Get ready to modify the registers array.  On machines which store
1399e93f7393Sniklas    individual registers, this doesn't need to do anything.  On machines
1400e93f7393Sniklas    which store all the registers in one fell swoop, this makes sure
1401e93f7393Sniklas    that registers contains all the registers from the program being
1402e93f7393Sniklas    debugged.  */
1403e93f7393Sniklas 
1404e93f7393Sniklas static void
monitor_prepare_to_store(void)1405b725ae77Skettenis monitor_prepare_to_store (void)
1406e93f7393Sniklas {
1407e93f7393Sniklas   /* Do nothing, since we can store individual regs */
1408e93f7393Sniklas }
1409e93f7393Sniklas 
1410e93f7393Sniklas static void
monitor_files_info(struct target_ops * ops)1411b725ae77Skettenis monitor_files_info (struct target_ops *ops)
1412e93f7393Sniklas {
1413e93f7393Sniklas   printf_unfiltered ("\tAttached to %s at %d baud.\n", dev_name, baud_rate);
1414e93f7393Sniklas }
1415e93f7393Sniklas 
1416e93f7393Sniklas static int
monitor_write_memory(CORE_ADDR memaddr,char * myaddr,int len)1417b725ae77Skettenis monitor_write_memory (CORE_ADDR memaddr, char *myaddr, int len)
1418e93f7393Sniklas {
1419b725ae77Skettenis   unsigned int val, hostval;
1420e93f7393Sniklas   char *cmd;
1421e93f7393Sniklas   int i;
1422e93f7393Sniklas 
1423b725ae77Skettenis   monitor_debug ("MON write %d %s\n", len, paddr (memaddr));
1424b725ae77Skettenis 
1425b725ae77Skettenis   if (current_monitor->flags & MO_ADDR_BITS_REMOVE)
1426b725ae77Skettenis     memaddr = ADDR_BITS_REMOVE (memaddr);
1427b725ae77Skettenis 
1428e93f7393Sniklas   /* Use memory fill command for leading 0 bytes.  */
1429e93f7393Sniklas 
1430e93f7393Sniklas   if (current_monitor->fill)
1431e93f7393Sniklas     {
1432e93f7393Sniklas       for (i = 0; i < len; i++)
1433e93f7393Sniklas 	if (myaddr[i] != 0)
1434e93f7393Sniklas 	  break;
1435e93f7393Sniklas 
1436e93f7393Sniklas       if (i > 4)		/* More than 4 zeros is worth doing */
1437e93f7393Sniklas 	{
1438b725ae77Skettenis 	  monitor_debug ("MON FILL %d\n", i);
1439e93f7393Sniklas 	  if (current_monitor->flags & MO_FILL_USES_ADDR)
1440b725ae77Skettenis 	    monitor_printf (current_monitor->fill, memaddr, (memaddr + i) - 1, 0);
1441e93f7393Sniklas 	  else
1442e93f7393Sniklas 	    monitor_printf (current_monitor->fill, memaddr, i, 0);
1443e93f7393Sniklas 
1444e93f7393Sniklas 	  monitor_expect_prompt (NULL, 0);
1445e93f7393Sniklas 
1446e93f7393Sniklas 	  return i;
1447e93f7393Sniklas 	}
1448e93f7393Sniklas     }
1449e93f7393Sniklas 
1450e93f7393Sniklas #if 0
1451e93f7393Sniklas   /* Can't actually use long longs if VAL is an int (nice idea, though).  */
1452e93f7393Sniklas   if ((memaddr & 0x7) == 0 && len >= 8 && current_monitor->setmem.cmdll)
1453e93f7393Sniklas     {
1454e93f7393Sniklas       len = 8;
1455e93f7393Sniklas       cmd = current_monitor->setmem.cmdll;
1456e93f7393Sniklas     }
1457e93f7393Sniklas   else
1458e93f7393Sniklas #endif
1459e93f7393Sniklas   if ((memaddr & 0x3) == 0 && len >= 4 && current_monitor->setmem.cmdl)
1460e93f7393Sniklas     {
1461e93f7393Sniklas       len = 4;
1462e93f7393Sniklas       cmd = current_monitor->setmem.cmdl;
1463e93f7393Sniklas     }
1464e93f7393Sniklas   else if ((memaddr & 0x1) == 0 && len >= 2 && current_monitor->setmem.cmdw)
1465e93f7393Sniklas     {
1466e93f7393Sniklas       len = 2;
1467e93f7393Sniklas       cmd = current_monitor->setmem.cmdw;
1468e93f7393Sniklas     }
1469e93f7393Sniklas   else
1470e93f7393Sniklas     {
1471e93f7393Sniklas       len = 1;
1472e93f7393Sniklas       cmd = current_monitor->setmem.cmdb;
1473e93f7393Sniklas     }
1474e93f7393Sniklas 
1475e93f7393Sniklas   val = extract_unsigned_integer (myaddr, len);
1476e93f7393Sniklas 
1477b725ae77Skettenis   if (len == 4)
1478b725ae77Skettenis     {
1479b725ae77Skettenis       hostval = *(unsigned int *) myaddr;
1480b725ae77Skettenis       monitor_debug ("Hostval(%08x) val(%08x)\n", hostval, val);
1481b725ae77Skettenis     }
1482b725ae77Skettenis 
1483b725ae77Skettenis 
1484e93f7393Sniklas   if (current_monitor->flags & MO_NO_ECHO_ON_SETMEM)
1485e93f7393Sniklas     monitor_printf_noecho (cmd, memaddr, val);
1486b725ae77Skettenis   else if (current_monitor->flags & MO_SETMEM_INTERACTIVE)
1487b725ae77Skettenis     {
1488b725ae77Skettenis 
1489b725ae77Skettenis       monitor_printf_noecho (cmd, memaddr);
1490b725ae77Skettenis 
1491b725ae77Skettenis       if (current_monitor->setmem.resp_delim)
1492b725ae77Skettenis         {
1493b725ae77Skettenis           monitor_debug ("EXP setmem.resp_delim");
1494b725ae77Skettenis           monitor_expect_regexp (&setmem_resp_delim_pattern, NULL, 0);
1495b725ae77Skettenis 	  monitor_printf ("%x\r", val);
1496b725ae77Skettenis        }
1497b725ae77Skettenis       if (current_monitor->setmem.term)
1498b725ae77Skettenis 	{
1499b725ae77Skettenis 	  monitor_debug ("EXP setmem.term");
1500b725ae77Skettenis 	  monitor_expect (current_monitor->setmem.term, NULL, 0);
1501b725ae77Skettenis 	  monitor_printf ("%x\r", val);
1502b725ae77Skettenis 	}
1503b725ae77Skettenis       if (current_monitor->setmem.term_cmd)
1504b725ae77Skettenis 	{			/* Emit this to get out of the memory editing state */
1505b725ae77Skettenis 	  monitor_printf ("%s", current_monitor->setmem.term_cmd);
1506b725ae77Skettenis 	  /* Drop through to expecting a prompt */
1507b725ae77Skettenis 	}
1508b725ae77Skettenis     }
1509e93f7393Sniklas   else
1510e93f7393Sniklas     monitor_printf (cmd, memaddr, val);
1511e93f7393Sniklas 
1512e93f7393Sniklas   monitor_expect_prompt (NULL, 0);
1513e93f7393Sniklas 
1514e93f7393Sniklas   return len;
1515e93f7393Sniklas }
1516e93f7393Sniklas 
1517b725ae77Skettenis 
1518b725ae77Skettenis static int
monitor_write_memory_bytes(CORE_ADDR memaddr,char * myaddr,int len)1519b725ae77Skettenis monitor_write_memory_bytes (CORE_ADDR memaddr, char *myaddr, int len)
1520b725ae77Skettenis {
1521b725ae77Skettenis   unsigned char val;
1522b725ae77Skettenis   int written = 0;
1523b725ae77Skettenis   if (len == 0)
1524b725ae77Skettenis     return 0;
1525b725ae77Skettenis   /* Enter the sub mode */
1526b725ae77Skettenis   monitor_printf (current_monitor->setmem.cmdb, memaddr);
1527b725ae77Skettenis   monitor_expect_prompt (NULL, 0);
1528b725ae77Skettenis   while (len)
1529b725ae77Skettenis     {
1530b725ae77Skettenis       val = *myaddr;
1531b725ae77Skettenis       monitor_printf ("%x\r", val);
1532b725ae77Skettenis       myaddr++;
1533b725ae77Skettenis       memaddr++;
1534b725ae77Skettenis       written++;
1535b725ae77Skettenis       /* If we wanted to, here we could validate the address */
1536b725ae77Skettenis       monitor_expect_prompt (NULL, 0);
1537b725ae77Skettenis       len--;
1538b725ae77Skettenis     }
1539b725ae77Skettenis   /* Now exit the sub mode */
1540b725ae77Skettenis   monitor_printf (current_monitor->getreg.term_cmd);
1541b725ae77Skettenis   monitor_expect_prompt (NULL, 0);
1542b725ae77Skettenis   return written;
1543b725ae77Skettenis }
1544b725ae77Skettenis 
1545b725ae77Skettenis 
1546b725ae77Skettenis static void
longlongendswap(unsigned char * a)1547b725ae77Skettenis longlongendswap (unsigned char *a)
1548b725ae77Skettenis {
1549b725ae77Skettenis   int i, j;
1550b725ae77Skettenis   unsigned char x;
1551b725ae77Skettenis   i = 0;
1552b725ae77Skettenis   j = 7;
1553b725ae77Skettenis   while (i < 4)
1554b725ae77Skettenis     {
1555b725ae77Skettenis       x = *(a + i);
1556b725ae77Skettenis       *(a + i) = *(a + j);
1557b725ae77Skettenis       *(a + j) = x;
1558b725ae77Skettenis       i++, j--;
1559b725ae77Skettenis     }
1560b725ae77Skettenis }
1561b725ae77Skettenis /* Format 32 chars of long long value, advance the pointer */
1562b725ae77Skettenis static char *hexlate = "0123456789abcdef";
1563b725ae77Skettenis static char *
longlong_hexchars(unsigned long long value,char * outbuff)1564b725ae77Skettenis longlong_hexchars (unsigned long long value,
1565b725ae77Skettenis 		   char *outbuff)
1566b725ae77Skettenis {
1567b725ae77Skettenis   if (value == 0)
1568b725ae77Skettenis     {
1569b725ae77Skettenis       *outbuff++ = '0';
1570b725ae77Skettenis       return outbuff;
1571b725ae77Skettenis     }
1572b725ae77Skettenis   else
1573b725ae77Skettenis     {
1574b725ae77Skettenis       static unsigned char disbuf[8];	/* disassembly buffer */
1575b725ae77Skettenis       unsigned char *scan, *limit;	/* loop controls */
1576b725ae77Skettenis       unsigned char c, nib;
1577b725ae77Skettenis       int leadzero = 1;
1578b725ae77Skettenis       scan = disbuf;
1579b725ae77Skettenis       limit = scan + 8;
1580b725ae77Skettenis       {
1581b725ae77Skettenis 	unsigned long long *dp;
1582b725ae77Skettenis 	dp = (unsigned long long *) scan;
1583b725ae77Skettenis 	*dp = value;
1584b725ae77Skettenis       }
1585b725ae77Skettenis       longlongendswap (disbuf);	/* FIXME: ONly on big endian hosts */
1586b725ae77Skettenis       while (scan < limit)
1587b725ae77Skettenis 	{
1588b725ae77Skettenis 	  c = *scan++;		/* a byte of our long long value */
1589b725ae77Skettenis 	  if (leadzero)
1590b725ae77Skettenis 	    {
1591b725ae77Skettenis 	      if (c == 0)
1592b725ae77Skettenis 		continue;
1593b725ae77Skettenis 	      else
1594b725ae77Skettenis 		leadzero = 0;	/* henceforth we print even zeroes */
1595b725ae77Skettenis 	    }
1596b725ae77Skettenis 	  nib = c >> 4;		/* high nibble bits */
1597b725ae77Skettenis 	  *outbuff++ = hexlate[nib];
1598b725ae77Skettenis 	  nib = c & 0x0f;	/* low nibble bits */
1599b725ae77Skettenis 	  *outbuff++ = hexlate[nib];
1600b725ae77Skettenis 	}
1601b725ae77Skettenis       return outbuff;
1602b725ae77Skettenis     }
1603b725ae77Skettenis }				/* longlong_hexchars */
1604b725ae77Skettenis 
1605b725ae77Skettenis 
1606b725ae77Skettenis 
1607b725ae77Skettenis /* I am only going to call this when writing virtual byte streams.
1608b725ae77Skettenis    Which possably entails endian conversions
1609b725ae77Skettenis  */
1610b725ae77Skettenis static int
monitor_write_memory_longlongs(CORE_ADDR memaddr,char * myaddr,int len)1611b725ae77Skettenis monitor_write_memory_longlongs (CORE_ADDR memaddr, char *myaddr, int len)
1612b725ae77Skettenis {
1613b725ae77Skettenis   static char hexstage[20];	/* At least 16 digits required, plus null */
1614b725ae77Skettenis   char *endstring;
1615b725ae77Skettenis   long long *llptr;
1616b725ae77Skettenis   long long value;
1617b725ae77Skettenis   int written = 0;
1618b725ae77Skettenis   llptr = (unsigned long long *) myaddr;
1619b725ae77Skettenis   if (len == 0)
1620b725ae77Skettenis     return 0;
1621b725ae77Skettenis   monitor_printf (current_monitor->setmem.cmdll, memaddr);
1622b725ae77Skettenis   monitor_expect_prompt (NULL, 0);
1623b725ae77Skettenis   while (len >= 8)
1624b725ae77Skettenis     {
1625b725ae77Skettenis       value = *llptr;
1626b725ae77Skettenis       endstring = longlong_hexchars (*llptr, hexstage);
1627b725ae77Skettenis       *endstring = '\0';	/* NUll terminate for printf */
1628b725ae77Skettenis       monitor_printf ("%s\r", hexstage);
1629b725ae77Skettenis       llptr++;
1630b725ae77Skettenis       memaddr += 8;
1631b725ae77Skettenis       written += 8;
1632b725ae77Skettenis       /* If we wanted to, here we could validate the address */
1633b725ae77Skettenis       monitor_expect_prompt (NULL, 0);
1634b725ae77Skettenis       len -= 8;
1635b725ae77Skettenis     }
1636b725ae77Skettenis   /* Now exit the sub mode */
1637b725ae77Skettenis   monitor_printf (current_monitor->getreg.term_cmd);
1638b725ae77Skettenis   monitor_expect_prompt (NULL, 0);
1639b725ae77Skettenis   return written;
1640b725ae77Skettenis }				/* */
1641b725ae77Skettenis 
1642b725ae77Skettenis 
1643b725ae77Skettenis 
1644b725ae77Skettenis /* ----- MONITOR_WRITE_MEMORY_BLOCK ---------------------------- */
1645b725ae77Skettenis /* This is for the large blocks of memory which may occur in downloading.
1646b725ae77Skettenis    And for monitors which use interactive entry,
1647b725ae77Skettenis    And for monitors which do not have other downloading methods.
1648b725ae77Skettenis    Without this, we will end up calling monitor_write_memory many times
1649b725ae77Skettenis    and do the entry and exit of the sub mode many times
1650b725ae77Skettenis    This currently assumes...
1651b725ae77Skettenis    MO_SETMEM_INTERACTIVE
1652b725ae77Skettenis    ! MO_NO_ECHO_ON_SETMEM
1653b725ae77Skettenis    To use this, the you have to patch the monitor_cmds block with
1654b725ae77Skettenis    this function. Otherwise, its not tuned up for use by all
1655b725ae77Skettenis    monitor variations.
1656b725ae77Skettenis  */
1657b725ae77Skettenis 
1658b725ae77Skettenis static int
monitor_write_memory_block(CORE_ADDR memaddr,char * myaddr,int len)1659b725ae77Skettenis monitor_write_memory_block (CORE_ADDR memaddr, char *myaddr, int len)
1660b725ae77Skettenis {
1661b725ae77Skettenis   int written;
1662b725ae77Skettenis   written = 0;
1663b725ae77Skettenis   /* FIXME: This would be a good place to put the zero test */
1664b725ae77Skettenis #if 1
1665b725ae77Skettenis   if ((len > 8) && (((len & 0x07)) == 0) && current_monitor->setmem.cmdll)
1666b725ae77Skettenis     {
1667b725ae77Skettenis       return monitor_write_memory_longlongs (memaddr, myaddr, len);
1668b725ae77Skettenis     }
1669b725ae77Skettenis #endif
1670b725ae77Skettenis   written = monitor_write_memory_bytes (memaddr, myaddr, len);
1671b725ae77Skettenis   return written;
1672b725ae77Skettenis }
1673b725ae77Skettenis 
1674e93f7393Sniklas /* This is an alternate form of monitor_read_memory which is used for monitors
1675e93f7393Sniklas    which can only read a single byte/word/etc. at a time.  */
1676e93f7393Sniklas 
1677e93f7393Sniklas static int
monitor_read_memory_single(CORE_ADDR memaddr,char * myaddr,int len)1678b725ae77Skettenis monitor_read_memory_single (CORE_ADDR memaddr, char *myaddr, int len)
1679e93f7393Sniklas {
1680e93f7393Sniklas   unsigned int val;
1681e93f7393Sniklas   char membuf[sizeof (int) * 2 + 1];
1682e93f7393Sniklas   char *p;
1683e93f7393Sniklas   char *cmd;
1684e93f7393Sniklas 
1685b725ae77Skettenis   monitor_debug ("MON read single\n");
1686e93f7393Sniklas #if 0
1687e93f7393Sniklas   /* Can't actually use long longs (nice idea, though).  In fact, the
1688e93f7393Sniklas      call to strtoul below will fail if it tries to convert a value
1689e93f7393Sniklas      that's too big to fit in a long.  */
1690e93f7393Sniklas   if ((memaddr & 0x7) == 0 && len >= 8 && current_monitor->getmem.cmdll)
1691e93f7393Sniklas     {
1692e93f7393Sniklas       len = 8;
1693e93f7393Sniklas       cmd = current_monitor->getmem.cmdll;
1694e93f7393Sniklas     }
1695e93f7393Sniklas   else
1696e93f7393Sniklas #endif
1697e93f7393Sniklas   if ((memaddr & 0x3) == 0 && len >= 4 && current_monitor->getmem.cmdl)
1698e93f7393Sniklas     {
1699e93f7393Sniklas       len = 4;
1700e93f7393Sniklas       cmd = current_monitor->getmem.cmdl;
1701e93f7393Sniklas     }
1702e93f7393Sniklas   else if ((memaddr & 0x1) == 0 && len >= 2 && current_monitor->getmem.cmdw)
1703e93f7393Sniklas     {
1704e93f7393Sniklas       len = 2;
1705e93f7393Sniklas       cmd = current_monitor->getmem.cmdw;
1706e93f7393Sniklas     }
1707e93f7393Sniklas   else
1708e93f7393Sniklas     {
1709e93f7393Sniklas       len = 1;
1710e93f7393Sniklas       cmd = current_monitor->getmem.cmdb;
1711e93f7393Sniklas     }
1712e93f7393Sniklas 
1713e93f7393Sniklas   /* Send the examine command.  */
1714e93f7393Sniklas 
1715e93f7393Sniklas   monitor_printf (cmd, memaddr);
1716e93f7393Sniklas 
1717e93f7393Sniklas   /* If RESP_DELIM is specified, we search for that as a leading
1718e93f7393Sniklas      delimiter for the memory value.  Otherwise, we just start
1719e93f7393Sniklas      searching from the start of the buf.  */
1720e93f7393Sniklas 
1721e93f7393Sniklas   if (current_monitor->getmem.resp_delim)
1722b725ae77Skettenis     {
1723b725ae77Skettenis       monitor_debug ("EXP getmem.resp_delim\n");
1724e93f7393Sniklas       monitor_expect_regexp (&getmem_resp_delim_pattern, NULL, 0);
1725b725ae77Skettenis     }
1726e93f7393Sniklas 
1727e93f7393Sniklas   /* Now, read the appropriate number of hex digits for this loc,
1728e93f7393Sniklas      skipping spaces.  */
1729e93f7393Sniklas 
1730e93f7393Sniklas   /* Skip leading spaces and "0x" if MO_HEX_PREFIX flag is set. */
1731e93f7393Sniklas   if (current_monitor->flags & MO_HEX_PREFIX)
1732e93f7393Sniklas     {
1733e93f7393Sniklas       int c;
1734e93f7393Sniklas 
1735e93f7393Sniklas       c = readchar (timeout);
1736e93f7393Sniklas       while (c == ' ')
1737e93f7393Sniklas 	c = readchar (timeout);
1738e93f7393Sniklas       if ((c == '0') && ((c = readchar (timeout)) == 'x'))
1739e93f7393Sniklas 	;
1740e93f7393Sniklas       else
1741b725ae77Skettenis 	monitor_error ("monitor_read_memory_single",
1742b725ae77Skettenis 		       "bad response from monitor",
1743b725ae77Skettenis 		       memaddr, 0, NULL, 0);
1744e93f7393Sniklas     }
1745b725ae77Skettenis 
1746b725ae77Skettenis   {
1747b725ae77Skettenis     int i;
1748e93f7393Sniklas     for (i = 0; i < len * 2; i++)
1749e93f7393Sniklas       {
1750e93f7393Sniklas 	int c;
1751e93f7393Sniklas 
1752e93f7393Sniklas 	while (1)
1753e93f7393Sniklas 	  {
1754e93f7393Sniklas 	    c = readchar (timeout);
1755e93f7393Sniklas 	    if (isxdigit (c))
1756e93f7393Sniklas 	      break;
1757e93f7393Sniklas 	    if (c == ' ')
1758e93f7393Sniklas 	      continue;
1759e93f7393Sniklas 
1760b725ae77Skettenis 	    monitor_error ("monitor_read_memory_single",
1761b725ae77Skettenis 			   "bad response from monitor",
1762b725ae77Skettenis 			   memaddr, i, membuf, 0);
1763e93f7393Sniklas 	  }
1764e93f7393Sniklas       membuf[i] = c;
1765e93f7393Sniklas     }
1766e93f7393Sniklas     membuf[i] = '\000';		/* terminate the number */
1767b725ae77Skettenis   }
1768e93f7393Sniklas 
1769e93f7393Sniklas /* If TERM is present, we wait for that to show up.  Also, (if TERM is
1770e93f7393Sniklas    present), we will send TERM_CMD if that is present.  In any case, we collect
1771e93f7393Sniklas    all of the output into buf, and then wait for the normal prompt.  */
1772e93f7393Sniklas 
1773e93f7393Sniklas   if (current_monitor->getmem.term)
1774e93f7393Sniklas     {
1775e93f7393Sniklas       monitor_expect (current_monitor->getmem.term, NULL, 0);	/* get response */
1776e93f7393Sniklas 
1777e93f7393Sniklas       if (current_monitor->getmem.term_cmd)
1778e93f7393Sniklas 	{
1779e93f7393Sniklas 	  monitor_printf (current_monitor->getmem.term_cmd);
1780e93f7393Sniklas 	  monitor_expect_prompt (NULL, 0);
1781e93f7393Sniklas 	}
1782e93f7393Sniklas     }
1783e93f7393Sniklas   else
1784e93f7393Sniklas     monitor_expect_prompt (NULL, 0);	/* get response */
1785e93f7393Sniklas 
1786e93f7393Sniklas   p = membuf;
1787e93f7393Sniklas   val = strtoul (membuf, &p, 16);
1788e93f7393Sniklas 
1789e93f7393Sniklas   if (val == 0 && membuf == p)
1790b725ae77Skettenis     monitor_error ("monitor_read_memory_single",
1791b725ae77Skettenis 		   "bad value from monitor",
1792b725ae77Skettenis 		   memaddr, 0, membuf, 0);
1793e93f7393Sniklas 
1794e93f7393Sniklas   /* supply register stores in target byte order, so swap here */
1795e93f7393Sniklas 
1796e93f7393Sniklas   store_unsigned_integer (myaddr, len, val);
1797e93f7393Sniklas 
1798e93f7393Sniklas   return len;
1799e93f7393Sniklas }
1800e93f7393Sniklas 
1801b725ae77Skettenis /* Copy LEN bytes of data from debugger memory at MYADDR to inferior's
1802b725ae77Skettenis    memory at MEMADDR.  Returns length moved.  Currently, we do no more
1803b725ae77Skettenis    than 16 bytes at a time.  */
1804e93f7393Sniklas 
1805e93f7393Sniklas static int
monitor_read_memory(CORE_ADDR memaddr,char * myaddr,int len)1806b725ae77Skettenis monitor_read_memory (CORE_ADDR memaddr, char *myaddr, int len)
1807e93f7393Sniklas {
1808e93f7393Sniklas   unsigned int val;
1809e93f7393Sniklas   char buf[512];
1810e93f7393Sniklas   char *p, *p1;
1811e93f7393Sniklas   int resp_len;
1812e93f7393Sniklas   int i;
1813b725ae77Skettenis   CORE_ADDR dumpaddr;
1814b725ae77Skettenis 
1815b725ae77Skettenis   if (len <= 0)
1816b725ae77Skettenis     {
1817b725ae77Skettenis       monitor_debug ("Zero length call to monitor_read_memory\n");
1818b725ae77Skettenis       return 0;
1819b725ae77Skettenis     }
1820b725ae77Skettenis 
1821b725ae77Skettenis   monitor_debug ("MON read block ta(%s) ha(%lx) %d\n",
1822b725ae77Skettenis 		 paddr_nz (memaddr), (long) myaddr, len);
1823b725ae77Skettenis 
1824b725ae77Skettenis   if (current_monitor->flags & MO_ADDR_BITS_REMOVE)
1825b725ae77Skettenis     memaddr = ADDR_BITS_REMOVE (memaddr);
1826e93f7393Sniklas 
1827e93f7393Sniklas   if (current_monitor->flags & MO_GETMEM_READ_SINGLE)
1828e93f7393Sniklas     return monitor_read_memory_single (memaddr, myaddr, len);
1829e93f7393Sniklas 
1830e93f7393Sniklas   len = min (len, 16);
1831e93f7393Sniklas 
1832b725ae77Skettenis   /* Some dumpers align the first data with the preceeding 16
1833b725ae77Skettenis      byte boundary. Some print blanks and start at the
1834b725ae77Skettenis      requested boundary. EXACT_DUMPADDR
1835b725ae77Skettenis    */
1836b725ae77Skettenis 
1837b725ae77Skettenis   dumpaddr = (current_monitor->flags & MO_EXACT_DUMPADDR)
1838b725ae77Skettenis     ? memaddr : memaddr & ~0x0f;
1839b725ae77Skettenis 
1840e93f7393Sniklas   /* See if xfer would cross a 16 byte boundary.  If so, clip it.  */
1841e93f7393Sniklas   if (((memaddr ^ (memaddr + len - 1)) & ~0xf) != 0)
1842e93f7393Sniklas     len = ((memaddr + len) & ~0xf) - memaddr;
1843e93f7393Sniklas 
1844e93f7393Sniklas   /* send the memory examine command */
1845e93f7393Sniklas 
1846e93f7393Sniklas   if (current_monitor->flags & MO_GETMEM_NEEDS_RANGE)
1847b725ae77Skettenis     monitor_printf (current_monitor->getmem.cmdb, memaddr, memaddr + len);
1848b725ae77Skettenis   else if (current_monitor->flags & MO_GETMEM_16_BOUNDARY)
1849b725ae77Skettenis     monitor_printf (current_monitor->getmem.cmdb, dumpaddr);
1850e93f7393Sniklas   else
1851e93f7393Sniklas     monitor_printf (current_monitor->getmem.cmdb, memaddr, len);
1852e93f7393Sniklas 
1853e93f7393Sniklas   /* If TERM is present, we wait for that to show up.  Also, (if TERM
1854e93f7393Sniklas      is present), we will send TERM_CMD if that is present.  In any
1855e93f7393Sniklas      case, we collect all of the output into buf, and then wait for
1856e93f7393Sniklas      the normal prompt.  */
1857e93f7393Sniklas 
1858e93f7393Sniklas   if (current_monitor->getmem.term)
1859e93f7393Sniklas     {
1860e93f7393Sniklas       resp_len = monitor_expect (current_monitor->getmem.term, buf, sizeof buf);	/* get response */
1861e93f7393Sniklas 
1862e93f7393Sniklas       if (resp_len <= 0)
1863b725ae77Skettenis 	monitor_error ("monitor_read_memory",
1864b725ae77Skettenis 		       "excessive response from monitor",
1865b725ae77Skettenis 		       memaddr, resp_len, buf, 0);
1866e93f7393Sniklas 
1867e93f7393Sniklas       if (current_monitor->getmem.term_cmd)
1868e93f7393Sniklas 	{
1869b725ae77Skettenis 	  serial_write (monitor_desc, current_monitor->getmem.term_cmd,
1870e93f7393Sniklas 			strlen (current_monitor->getmem.term_cmd));
1871e93f7393Sniklas 	  monitor_expect_prompt (NULL, 0);
1872e93f7393Sniklas 	}
1873e93f7393Sniklas     }
1874e93f7393Sniklas   else
1875e93f7393Sniklas     resp_len = monitor_expect_prompt (buf, sizeof buf);		/* get response */
1876e93f7393Sniklas 
1877e93f7393Sniklas   p = buf;
1878e93f7393Sniklas 
1879e93f7393Sniklas   /* If RESP_DELIM is specified, we search for that as a leading
1880e93f7393Sniklas      delimiter for the values.  Otherwise, we just start searching
1881e93f7393Sniklas      from the start of the buf.  */
1882e93f7393Sniklas 
1883e93f7393Sniklas   if (current_monitor->getmem.resp_delim)
1884e93f7393Sniklas     {
1885e93f7393Sniklas       int retval, tmp;
1886e93f7393Sniklas       struct re_registers resp_strings;
1887b725ae77Skettenis       monitor_debug ("MON getmem.resp_delim %s\n", current_monitor->getmem.resp_delim);
1888e93f7393Sniklas 
1889b725ae77Skettenis       memset (&resp_strings, 0, sizeof (struct re_registers));
1890e93f7393Sniklas       tmp = strlen (p);
1891e93f7393Sniklas       retval = re_search (&getmem_resp_delim_pattern, p, tmp, 0, tmp,
1892e93f7393Sniklas 			  &resp_strings);
1893e93f7393Sniklas 
1894e93f7393Sniklas       if (retval < 0)
1895b725ae77Skettenis 	monitor_error ("monitor_read_memory",
1896b725ae77Skettenis 		       "bad response from monitor",
1897b725ae77Skettenis 		       memaddr, resp_len, buf, 0);
1898e93f7393Sniklas 
1899e93f7393Sniklas       p += resp_strings.end[0];
1900e93f7393Sniklas #if 0
1901e93f7393Sniklas       p = strstr (p, current_monitor->getmem.resp_delim);
1902e93f7393Sniklas       if (!p)
1903b725ae77Skettenis 	monitor_error ("monitor_read_memory",
1904b725ae77Skettenis 		       "bad response from monitor",
1905b725ae77Skettenis 		       memaddr, resp_len, buf, 0);
1906e93f7393Sniklas       p += strlen (current_monitor->getmem.resp_delim);
1907e93f7393Sniklas #endif
1908e93f7393Sniklas     }
1909b725ae77Skettenis   monitor_debug ("MON scanning  %d ,%lx '%s'\n", len, (long) p, p);
1910b725ae77Skettenis   if (current_monitor->flags & MO_GETMEM_16_BOUNDARY)
1911b725ae77Skettenis     {
1912b725ae77Skettenis       char c;
1913b725ae77Skettenis       int fetched = 0;
1914b725ae77Skettenis       i = len;
1915b725ae77Skettenis       c = *p;
1916b725ae77Skettenis 
1917b725ae77Skettenis 
1918b725ae77Skettenis       while (!(c == '\000' || c == '\n' || c == '\r') && i > 0)
1919b725ae77Skettenis 	{
1920b725ae77Skettenis 	  if (isxdigit (c))
1921b725ae77Skettenis 	    {
1922b725ae77Skettenis 	      if ((dumpaddr >= memaddr) && (i > 0))
1923b725ae77Skettenis 		{
1924b725ae77Skettenis 		  val = fromhex (c) * 16 + fromhex (*(p + 1));
1925b725ae77Skettenis 		  *myaddr++ = val;
1926b725ae77Skettenis 		  if (monitor_debug_p || remote_debug)
1927b725ae77Skettenis 		    fprintf_unfiltered (gdb_stdlog, "[%02x]", val);
1928b725ae77Skettenis 		  --i;
1929b725ae77Skettenis 		  fetched++;
1930b725ae77Skettenis 		}
1931b725ae77Skettenis 	      ++dumpaddr;
1932b725ae77Skettenis 	      ++p;
1933b725ae77Skettenis 	    }
1934b725ae77Skettenis 	  ++p;			/* skip a blank or other non hex char */
1935b725ae77Skettenis 	  c = *p;
1936b725ae77Skettenis 	}
1937b725ae77Skettenis       if (fetched == 0)
1938b725ae77Skettenis 	error ("Failed to read via monitor");
1939b725ae77Skettenis       if (monitor_debug_p || remote_debug)
1940b725ae77Skettenis 	fprintf_unfiltered (gdb_stdlog, "\n");
1941b725ae77Skettenis       return fetched;		/* Return the number of bytes actually read */
1942b725ae77Skettenis     }
1943b725ae77Skettenis   monitor_debug ("MON scanning bytes\n");
1944e93f7393Sniklas 
1945e93f7393Sniklas   for (i = len; i > 0; i--)
1946e93f7393Sniklas     {
1947e93f7393Sniklas       /* Skip non-hex chars, but bomb on end of string and newlines */
1948e93f7393Sniklas 
1949e93f7393Sniklas       while (1)
1950e93f7393Sniklas 	{
1951e93f7393Sniklas 	  if (isxdigit (*p))
1952e93f7393Sniklas 	    break;
1953b725ae77Skettenis 
1954e93f7393Sniklas 	  if (*p == '\000' || *p == '\n' || *p == '\r')
1955b725ae77Skettenis 	    monitor_error ("monitor_read_memory",
1956b725ae77Skettenis 			   "badly terminated response from monitor",
1957b725ae77Skettenis 			   memaddr, resp_len, buf, 0);
1958e93f7393Sniklas 	  p++;
1959e93f7393Sniklas 	}
1960e93f7393Sniklas 
1961e93f7393Sniklas       val = strtoul (p, &p1, 16);
1962e93f7393Sniklas 
1963e93f7393Sniklas       if (val == 0 && p == p1)
1964b725ae77Skettenis 	monitor_error ("monitor_read_memory",
1965b725ae77Skettenis 		       "bad value from monitor",
1966b725ae77Skettenis 		       memaddr, resp_len, buf, 0);
1967e93f7393Sniklas 
1968e93f7393Sniklas       *myaddr++ = val;
1969e93f7393Sniklas 
1970e93f7393Sniklas       if (i == 1)
1971e93f7393Sniklas 	break;
1972e93f7393Sniklas 
1973e93f7393Sniklas       p = p1;
1974e93f7393Sniklas     }
1975e93f7393Sniklas 
1976e93f7393Sniklas   return len;
1977e93f7393Sniklas }
1978e93f7393Sniklas 
1979b725ae77Skettenis /* Transfer LEN bytes between target address MEMADDR and GDB address
1980b725ae77Skettenis    MYADDR.  Returns 0 for success, errno code for failure. TARGET is
1981b725ae77Skettenis    unused. */
1982b725ae77Skettenis 
1983e93f7393Sniklas static int
monitor_xfer_memory(CORE_ADDR memaddr,char * myaddr,int len,int write,struct mem_attrib * attrib,struct target_ops * target)1984b725ae77Skettenis monitor_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
1985b725ae77Skettenis 		     struct mem_attrib *attrib, struct target_ops *target)
1986e93f7393Sniklas {
1987b725ae77Skettenis   int res;
1988b725ae77Skettenis 
1989b725ae77Skettenis   if (write)
1990b725ae77Skettenis     {
1991b725ae77Skettenis       if (current_monitor->flags & MO_HAS_BLOCKWRITES)
1992b725ae77Skettenis 	res = monitor_write_memory_block(memaddr, myaddr, len);
1993b725ae77Skettenis       else
1994b725ae77Skettenis 	res = monitor_write_memory(memaddr, myaddr, len);
1995b725ae77Skettenis     }
1996b725ae77Skettenis   else
1997b725ae77Skettenis     {
1998b725ae77Skettenis       res = monitor_read_memory(memaddr, myaddr, len);
1999b725ae77Skettenis     }
2000b725ae77Skettenis 
2001b725ae77Skettenis   return res;
2002e93f7393Sniklas }
2003e93f7393Sniklas 
2004e93f7393Sniklas static void
monitor_kill(void)2005b725ae77Skettenis monitor_kill (void)
2006e93f7393Sniklas {
2007e93f7393Sniklas   return;			/* ignore attempts to kill target system */
2008e93f7393Sniklas }
2009e93f7393Sniklas 
2010e93f7393Sniklas /* All we actually do is set the PC to the start address of exec_bfd, and start
2011e93f7393Sniklas    the program at that point.  */
2012e93f7393Sniklas 
2013e93f7393Sniklas static void
monitor_create_inferior(char * exec_file,char * args,char ** env,int from_tty)2014*63addd46Skettenis monitor_create_inferior (char *exec_file, char *args, char **env,
2015*63addd46Skettenis 			 int from_tty)
2016e93f7393Sniklas {
2017e93f7393Sniklas   if (args && (*args != '\000'))
2018e93f7393Sniklas     error ("Args are not supported by the monitor.");
2019e93f7393Sniklas 
2020e93f7393Sniklas   first_time = 1;
2021e93f7393Sniklas   clear_proceed_status ();
2022e93f7393Sniklas   proceed (bfd_get_start_address (exec_bfd), TARGET_SIGNAL_0, 0);
2023e93f7393Sniklas }
2024e93f7393Sniklas 
2025e93f7393Sniklas /* Clean up when a program exits.
2026e93f7393Sniklas    The program actually lives on in the remote processor's RAM, and may be
2027e93f7393Sniklas    run again without a download.  Don't leave it full of breakpoint
2028e93f7393Sniklas    instructions.  */
2029e93f7393Sniklas 
2030e93f7393Sniklas static void
monitor_mourn_inferior(void)2031b725ae77Skettenis monitor_mourn_inferior (void)
2032e93f7393Sniklas {
2033e93f7393Sniklas   unpush_target (targ_ops);
2034e93f7393Sniklas   generic_mourn_inferior ();	/* Do all the proper things now */
2035e93f7393Sniklas }
2036e93f7393Sniklas 
2037e93f7393Sniklas /* Tell the monitor to add a breakpoint.  */
2038e93f7393Sniklas 
2039e93f7393Sniklas static int
monitor_insert_breakpoint(CORE_ADDR addr,char * shadow)2040b725ae77Skettenis monitor_insert_breakpoint (CORE_ADDR addr, char *shadow)
2041e93f7393Sniklas {
2042e93f7393Sniklas   int i;
2043b725ae77Skettenis   const unsigned char *bp;
2044b725ae77Skettenis   int bplen;
2045e93f7393Sniklas 
2046b725ae77Skettenis   monitor_debug ("MON inst bkpt %s\n", paddr (addr));
2047b725ae77Skettenis   if (current_monitor->set_break == NULL)
2048b725ae77Skettenis     error ("No set_break defined for this monitor");
2049b725ae77Skettenis 
2050b725ae77Skettenis   if (current_monitor->flags & MO_ADDR_BITS_REMOVE)
2051b725ae77Skettenis     addr = ADDR_BITS_REMOVE (addr);
2052b725ae77Skettenis 
2053b725ae77Skettenis   /* Determine appropriate breakpoint size for this address.  */
2054b725ae77Skettenis   bp = gdbarch_breakpoint_from_pc (current_gdbarch, &addr, &bplen);
2055b725ae77Skettenis 
2056b725ae77Skettenis   for (i = 0; i < current_monitor->num_breakpoints; i++)
2057e93f7393Sniklas     {
2058e93f7393Sniklas       if (breakaddr[i] == 0)
2059e93f7393Sniklas 	{
2060e93f7393Sniklas 	  breakaddr[i] = addr;
2061b725ae77Skettenis 	  monitor_read_memory (addr, shadow, bplen);
2062e93f7393Sniklas 	  monitor_printf (current_monitor->set_break, addr);
2063e93f7393Sniklas 	  monitor_expect_prompt (NULL, 0);
2064e93f7393Sniklas 	  return 0;
2065e93f7393Sniklas 	}
2066e93f7393Sniklas     }
2067e93f7393Sniklas 
2068b725ae77Skettenis   error ("Too many breakpoints (> %d) for monitor.", current_monitor->num_breakpoints);
2069e93f7393Sniklas }
2070e93f7393Sniklas 
2071e93f7393Sniklas /* Tell the monitor to remove a breakpoint.  */
2072e93f7393Sniklas 
2073e93f7393Sniklas static int
monitor_remove_breakpoint(CORE_ADDR addr,char * shadow)2074b725ae77Skettenis monitor_remove_breakpoint (CORE_ADDR addr, char *shadow)
2075e93f7393Sniklas {
2076e93f7393Sniklas   int i;
2077e93f7393Sniklas 
2078b725ae77Skettenis   monitor_debug ("MON rmbkpt %s\n", paddr (addr));
2079b725ae77Skettenis   if (current_monitor->clr_break == NULL)
2080b725ae77Skettenis     error ("No clr_break defined for this monitor");
2081b725ae77Skettenis 
2082b725ae77Skettenis   if (current_monitor->flags & MO_ADDR_BITS_REMOVE)
2083b725ae77Skettenis     addr = ADDR_BITS_REMOVE (addr);
2084b725ae77Skettenis 
2085b725ae77Skettenis   for (i = 0; i < current_monitor->num_breakpoints; i++)
2086e93f7393Sniklas     {
2087e93f7393Sniklas       if (breakaddr[i] == addr)
2088e93f7393Sniklas 	{
2089e93f7393Sniklas 	  breakaddr[i] = 0;
2090e93f7393Sniklas 	  /* some monitors remove breakpoints based on the address */
2091e93f7393Sniklas 	  if (current_monitor->flags & MO_CLR_BREAK_USES_ADDR)
2092e93f7393Sniklas 	    monitor_printf (current_monitor->clr_break, addr);
2093b725ae77Skettenis 	  else if (current_monitor->flags & MO_CLR_BREAK_1_BASED)
2094b725ae77Skettenis 	    monitor_printf (current_monitor->clr_break, i + 1);
2095e93f7393Sniklas 	  else
2096e93f7393Sniklas 	    monitor_printf (current_monitor->clr_break, i);
2097e93f7393Sniklas 	  monitor_expect_prompt (NULL, 0);
2098e93f7393Sniklas 	  return 0;
2099e93f7393Sniklas 	}
2100e93f7393Sniklas     }
2101b725ae77Skettenis   fprintf_unfiltered (gdb_stderr,
2102b725ae77Skettenis 		      "Can't find breakpoint associated with 0x%s\n",
2103b725ae77Skettenis 		      paddr_nz (addr));
2104e93f7393Sniklas   return 1;
2105e93f7393Sniklas }
2106e93f7393Sniklas 
2107e93f7393Sniklas /* monitor_wait_srec_ack -- wait for the target to send an acknowledgement for
2108e93f7393Sniklas    an S-record.  Return non-zero if the ACK is received properly.  */
2109e93f7393Sniklas 
2110e93f7393Sniklas static int
monitor_wait_srec_ack(void)2111b725ae77Skettenis monitor_wait_srec_ack (void)
2112e93f7393Sniklas {
2113b725ae77Skettenis   int ch;
2114b725ae77Skettenis 
2115b725ae77Skettenis   if (current_monitor->flags & MO_SREC_ACK_PLUS)
2116b725ae77Skettenis     {
2117b725ae77Skettenis       return (readchar (timeout) == '+');
2118b725ae77Skettenis     }
2119b725ae77Skettenis   else if (current_monitor->flags & MO_SREC_ACK_ROTATE)
2120b725ae77Skettenis     {
2121b725ae77Skettenis       /* Eat two backspaces, a "rotating" char (|/-\), and a space.  */
2122b725ae77Skettenis       if ((ch = readchar (1)) < 0)
2123b725ae77Skettenis 	return 0;
2124b725ae77Skettenis       if ((ch = readchar (1)) < 0)
2125b725ae77Skettenis 	return 0;
2126b725ae77Skettenis       if ((ch = readchar (1)) < 0)
2127b725ae77Skettenis 	return 0;
2128b725ae77Skettenis       if ((ch = readchar (1)) < 0)
2129b725ae77Skettenis 	return 0;
2130b725ae77Skettenis     }
2131b725ae77Skettenis   return 1;
2132e93f7393Sniklas }
2133e93f7393Sniklas 
2134e93f7393Sniklas /* monitor_load -- download a file. */
2135e93f7393Sniklas 
2136e93f7393Sniklas static void
monitor_load(char * file,int from_tty)2137b725ae77Skettenis monitor_load (char *file, int from_tty)
2138e93f7393Sniklas {
2139b725ae77Skettenis   monitor_debug ("MON load\n");
2140e93f7393Sniklas 
2141e93f7393Sniklas   if (current_monitor->load_routine)
2142e93f7393Sniklas     current_monitor->load_routine (monitor_desc, file, hashmark);
2143e93f7393Sniklas   else
2144e93f7393Sniklas     {				/* The default is ascii S-records */
2145b725ae77Skettenis       int n;
2146b725ae77Skettenis       unsigned long load_offset;
2147b725ae77Skettenis       char buf[128];
2148b725ae77Skettenis 
2149b725ae77Skettenis       /* enable user to specify address for downloading as 2nd arg to load */
2150b725ae77Skettenis       n = sscanf (file, "%s 0x%lx", buf, &load_offset);
2151b725ae77Skettenis       if (n > 1)
2152b725ae77Skettenis 	file = buf;
2153b725ae77Skettenis       else
2154b725ae77Skettenis 	load_offset = 0;
2155b725ae77Skettenis 
2156e93f7393Sniklas       monitor_printf (current_monitor->load);
2157e93f7393Sniklas       if (current_monitor->loadresp)
2158e93f7393Sniklas 	monitor_expect (current_monitor->loadresp, NULL, 0);
2159e93f7393Sniklas 
2160b725ae77Skettenis       load_srec (monitor_desc, file, (bfd_vma) load_offset,
2161b725ae77Skettenis 		 32, SREC_ALL, hashmark,
2162e93f7393Sniklas 		 current_monitor->flags & MO_SREC_ACK ?
2163e93f7393Sniklas 		 monitor_wait_srec_ack : NULL);
2164e93f7393Sniklas 
2165e93f7393Sniklas       monitor_expect_prompt (NULL, 0);
2166e93f7393Sniklas     }
2167e93f7393Sniklas 
2168e93f7393Sniklas   /* Finally, make the PC point at the start address */
2169e93f7393Sniklas   if (exec_bfd)
2170e93f7393Sniklas     write_pc (bfd_get_start_address (exec_bfd));
2171e93f7393Sniklas 
2172b725ae77Skettenis   /* There used to be code here which would clear inferior_ptid and
2173b725ae77Skettenis      call clear_symtab_users.  None of that should be necessary:
2174b725ae77Skettenis      monitor targets should behave like remote protocol targets, and
2175b725ae77Skettenis      since generic_load does none of those things, this function
2176b725ae77Skettenis      shouldn't either.
2177e93f7393Sniklas 
2178b725ae77Skettenis      Furthermore, clearing inferior_ptid is *incorrect*.  After doing
2179b725ae77Skettenis      a load, we still have a valid connection to the monitor, with a
2180b725ae77Skettenis      live processor state to fiddle with.  The user can type
2181b725ae77Skettenis      `continue' or `jump *start' and make the program run.  If they do
2182b725ae77Skettenis      these things, however, GDB will be talking to a running program
2183b725ae77Skettenis      while inferior_ptid is null_ptid; this makes things like
2184b725ae77Skettenis      reinit_frame_cache very confused.  */
2185e93f7393Sniklas }
2186e93f7393Sniklas 
2187e93f7393Sniklas static void
monitor_stop(void)2188b725ae77Skettenis monitor_stop (void)
2189e93f7393Sniklas {
2190b725ae77Skettenis   monitor_debug ("MON stop\n");
2191e93f7393Sniklas   if ((current_monitor->flags & MO_SEND_BREAK_ON_STOP) != 0)
2192b725ae77Skettenis     serial_send_break (monitor_desc);
2193e93f7393Sniklas   if (current_monitor->stop)
2194e93f7393Sniklas     monitor_printf_noecho (current_monitor->stop);
2195e93f7393Sniklas }
2196e93f7393Sniklas 
2197b725ae77Skettenis /* Put a COMMAND string out to MONITOR.  Output from MONITOR is placed
2198b725ae77Skettenis    in OUTPUT until the prompt is seen. FIXME: We read the characters
2199b725ae77Skettenis    ourseleves here cause of a nasty echo.  */
2200e93f7393Sniklas 
2201e93f7393Sniklas static void
monitor_rcmd(char * command,struct ui_file * outbuf)2202b725ae77Skettenis monitor_rcmd (char *command,
2203b725ae77Skettenis 	      struct ui_file *outbuf)
2204e93f7393Sniklas {
2205e93f7393Sniklas   char *p;
2206e93f7393Sniklas   int resp_len;
2207e93f7393Sniklas   char buf[1000];
2208e93f7393Sniklas 
2209e93f7393Sniklas   if (monitor_desc == NULL)
2210e93f7393Sniklas     error ("monitor target not open.");
2211e93f7393Sniklas 
2212e93f7393Sniklas   p = current_monitor->prompt;
2213e93f7393Sniklas 
2214e93f7393Sniklas   /* Send the command.  Note that if no args were supplied, then we're
2215e93f7393Sniklas      just sending the monitor a newline, which is sometimes useful.  */
2216e93f7393Sniklas 
2217b725ae77Skettenis   monitor_printf ("%s\r", (command ? command : ""));
2218e93f7393Sniklas 
2219e93f7393Sniklas   resp_len = monitor_expect_prompt (buf, sizeof buf);
2220e93f7393Sniklas 
2221b725ae77Skettenis   fputs_unfiltered (buf, outbuf);	/* Output the response */
2222e93f7393Sniklas }
2223e93f7393Sniklas 
2224e93f7393Sniklas /* Convert hex digit A to a number.  */
2225e93f7393Sniklas 
2226b725ae77Skettenis #if 0
2227e93f7393Sniklas static int
2228b725ae77Skettenis from_hex (int a)
2229e93f7393Sniklas {
2230e93f7393Sniklas   if (a >= '0' && a <= '9')
2231e93f7393Sniklas     return a - '0';
2232e93f7393Sniklas   if (a >= 'a' && a <= 'f')
2233e93f7393Sniklas     return a - 'a' + 10;
2234e93f7393Sniklas   if (a >= 'A' && a <= 'F')
2235e93f7393Sniklas     return a - 'A' + 10;
2236e93f7393Sniklas 
2237e93f7393Sniklas   error ("Reply contains invalid hex digit 0x%x", a);
2238e93f7393Sniklas }
2239b725ae77Skettenis #endif
2240e93f7393Sniklas 
2241b725ae77Skettenis char *
monitor_get_dev_name(void)2242b725ae77Skettenis monitor_get_dev_name (void)
2243e93f7393Sniklas {
2244b725ae77Skettenis   return dev_name;
2245b725ae77Skettenis }
2246b725ae77Skettenis 
2247b725ae77Skettenis static struct target_ops monitor_ops;
2248b725ae77Skettenis 
2249b725ae77Skettenis static void
init_base_monitor_ops(void)2250b725ae77Skettenis init_base_monitor_ops (void)
2251b725ae77Skettenis {
2252b725ae77Skettenis   monitor_ops.to_close = monitor_close;
2253b725ae77Skettenis   monitor_ops.to_detach = monitor_detach;
2254b725ae77Skettenis   monitor_ops.to_resume = monitor_resume;
2255b725ae77Skettenis   monitor_ops.to_wait = monitor_wait;
2256b725ae77Skettenis   monitor_ops.to_fetch_registers = monitor_fetch_registers;
2257b725ae77Skettenis   monitor_ops.to_store_registers = monitor_store_registers;
2258b725ae77Skettenis   monitor_ops.to_prepare_to_store = monitor_prepare_to_store;
2259*63addd46Skettenis   monitor_ops.deprecated_xfer_memory = monitor_xfer_memory;
2260b725ae77Skettenis   monitor_ops.to_files_info = monitor_files_info;
2261b725ae77Skettenis   monitor_ops.to_insert_breakpoint = monitor_insert_breakpoint;
2262b725ae77Skettenis   monitor_ops.to_remove_breakpoint = monitor_remove_breakpoint;
2263b725ae77Skettenis   monitor_ops.to_kill = monitor_kill;
2264b725ae77Skettenis   monitor_ops.to_load = monitor_load;
2265b725ae77Skettenis   monitor_ops.to_create_inferior = monitor_create_inferior;
2266b725ae77Skettenis   monitor_ops.to_mourn_inferior = monitor_mourn_inferior;
2267b725ae77Skettenis   monitor_ops.to_stop = monitor_stop;
2268b725ae77Skettenis   monitor_ops.to_rcmd = monitor_rcmd;
2269b725ae77Skettenis   monitor_ops.to_stratum = process_stratum;
2270b725ae77Skettenis   monitor_ops.to_has_all_memory = 1;
2271b725ae77Skettenis   monitor_ops.to_has_memory = 1;
2272b725ae77Skettenis   monitor_ops.to_has_stack = 1;
2273b725ae77Skettenis   monitor_ops.to_has_registers = 1;
2274b725ae77Skettenis   monitor_ops.to_has_execution = 1;
2275b725ae77Skettenis   monitor_ops.to_magic = OPS_MAGIC;
2276b725ae77Skettenis }				/* init_base_monitor_ops */
2277e93f7393Sniklas 
2278e93f7393Sniklas /* Init the target_ops structure pointed at by OPS */
2279e93f7393Sniklas 
2280e93f7393Sniklas void
init_monitor_ops(struct target_ops * ops)2281b725ae77Skettenis init_monitor_ops (struct target_ops *ops)
2282e93f7393Sniklas {
2283b725ae77Skettenis   if (monitor_ops.to_magic != OPS_MAGIC)
2284b725ae77Skettenis     init_base_monitor_ops ();
2285b725ae77Skettenis 
2286e93f7393Sniklas   memcpy (ops, &monitor_ops, sizeof monitor_ops);
2287e93f7393Sniklas }
2288e93f7393Sniklas 
2289e93f7393Sniklas /* Define additional commands that are usually only used by monitors.  */
2290e93f7393Sniklas 
2291b725ae77Skettenis extern initialize_file_ftype _initialize_remote_monitors; /* -Wmissing-prototypes */
2292b725ae77Skettenis 
2293e93f7393Sniklas void
_initialize_remote_monitors(void)2294b725ae77Skettenis _initialize_remote_monitors (void)
2295e93f7393Sniklas {
2296b725ae77Skettenis   init_base_monitor_ops ();
2297*63addd46Skettenis   deprecated_add_show_from_set
2298*63addd46Skettenis     (add_set_cmd ("hash", no_class, var_boolean,
2299e93f7393Sniklas 		  (char *) &hashmark,
2300e93f7393Sniklas 		  "Set display of activity while downloading a file.\n\
2301e93f7393Sniklas When enabled, a hashmark \'#\' is displayed.",
2302e93f7393Sniklas 		  &setlist),
2303e93f7393Sniklas      &showlist);
2304e93f7393Sniklas 
2305*63addd46Skettenis   deprecated_add_show_from_set
2306b725ae77Skettenis     (add_set_cmd ("monitor", no_class, var_zinteger,
2307b725ae77Skettenis 		  (char *) &monitor_debug_p,
2308b725ae77Skettenis 		  "Set debugging of remote monitor communication.\n\
2309b725ae77Skettenis When enabled, communication between GDB and the remote monitor\n\
2310b725ae77Skettenis is displayed.", &setdebuglist),
2311b725ae77Skettenis      &showdebuglist);
2312e93f7393Sniklas }
2313