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, ®ister_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 (®ister_strings, 0, sizeof (struct re_registers));
977b725ae77Skettenis
978e93f7393Sniklas if (re_search (®ister_pattern, buf, len, 0, len,
979e93f7393Sniklas ®ister_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