X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gdb%2Fmonitor.c;h=d9e7b0a47872032fc8a7df8a3cf16c72ed754b72;hb=875896e3e6880ec4c27b4fdfc37ae44881e11ca8;hp=db76f4159ff2ade642de72d042649a70a22bb948;hpb=23a6d36940157c674aedaf5a9d4b38676ea0d9e9;p=platform%2Fupstream%2Fbinutils.git
diff --git a/gdb/monitor.c b/gdb/monitor.c
index db76f41..d9e7b0a 100644
--- a/gdb/monitor.c
+++ b/gdb/monitor.c
@@ -1,7 +1,6 @@
/* Remote debugging interface for boot monitors, for GDB.
- Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
- 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1990-2014 Free Software Foundation, Inc.
Contributed by Cygnus Support. Written by Rob Savoye for Cygnus.
Resurrected from the ashes by Stu Grossman.
@@ -10,7 +9,7 @@
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
@@ -19,13 +18,11 @@
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
+ along with this program. If not, see . */
-/* This file was derived from various remote-* modules. It is a collection
+/* This file was derived from various remote-* modules. It is a collection
of generic support functions so GDB can talk directly to a ROM based
- monitor. This saves use from having to hack an exception based handler
+ monitor. This saves use from having to hack an exception based handler
into existence, and makes for quick porting.
This module talks to a debug monitor called 'MONITOR', which
@@ -45,75 +42,40 @@
#include "target.h"
#include
#include
-#include "gdb_string.h"
#include
#include "command.h"
#include "serial.h"
#include "monitor.h"
#include "gdbcmd.h"
#include "inferior.h"
+#include "infrun.h"
#include "gdb_regex.h"
#include "srec.h"
#include "regcache.h"
+#include "gdbthread.h"
+#include "readline/readline.h"
static char *dev_name;
static struct target_ops *targ_ops;
-static void monitor_vsprintf (char *sndbuf, char *pattern, va_list args);
-
-static int readchar (int timeout);
-
-static void monitor_fetch_register (int regno);
-static void monitor_store_register (int regno);
-
-static void monitor_printable_string (char *newstr, char *oldstr, int len);
-static void monitor_error (char *function, char *message, CORE_ADDR memaddr, int len, char *string, int final_char);
-static void monitor_detach (char *args, int from_tty);
-static void monitor_resume (ptid_t ptid, int step, enum target_signal sig);
-static void monitor_interrupt (int signo);
-static void monitor_interrupt_twice (int signo);
static void monitor_interrupt_query (void);
-static void monitor_wait_cleanup (void *old_timeout);
-
-static ptid_t monitor_wait (ptid_t ptid, struct target_waitstatus *status);
-static void monitor_fetch_registers (int regno);
-static void monitor_store_registers (int regno);
-static void monitor_prepare_to_store (void);
-static int monitor_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len,
- int write,
- struct mem_attrib *attrib,
- struct target_ops *target);
-static void monitor_files_info (struct target_ops *ops);
-static int monitor_insert_breakpoint (CORE_ADDR addr, char *shadow);
-static int monitor_remove_breakpoint (CORE_ADDR addr, char *shadow);
-static void monitor_kill (void);
-static void monitor_load (char *file, int from_tty);
-static void monitor_mourn_inferior (void);
-static void monitor_stop (void);
-
-static int monitor_read_memory (CORE_ADDR addr, char *myaddr, int len);
-static int monitor_write_memory (CORE_ADDR addr, char *myaddr, int len);
-static int monitor_write_memory_bytes (CORE_ADDR addr, char *myaddr, int len);
-static int monitor_write_memory_block (CORE_ADDR memaddr,
- char *myaddr, int len);
-static int monitor_expect_regexp (struct re_pattern_buffer *pat,
- char *buf, int buflen);
-static void monitor_dump_regs (void);
+static void monitor_interrupt_twice (int);
+static void monitor_stop (struct target_ops *self, ptid_t);
+static void monitor_dump_regs (struct regcache *regcache);
+
#if 0
static int from_hex (int a);
-static unsigned long get_hex_word (void);
#endif
-static void parse_register_dump (char *, int);
static struct monitor_ops *current_monitor;
-static int hashmark; /* flag set by "set hash" */
+static int hashmark; /* flag set by "set hash". */
static int timeout = 30;
-static int in_monitor_wait = 0; /* Non-zero means we are in monitor_wait() */
+static int in_monitor_wait = 0; /* Non-zero means we are in monitor_wait(). */
-static void (*ofunc) (); /* Old SIGINT signal handler */
+static void (*ofunc) (); /* Old SIGINT signal handler. */
static CORE_ADDR *breakaddr;
@@ -123,7 +85,7 @@ static CORE_ADDR *breakaddr;
static struct serial *monitor_desc = NULL;
-/* Pointer to regexp pattern matching data */
+/* Pointer to regexp pattern matching data. */
static struct re_pattern_buffer register_pattern;
static char register_fastmap[256];
@@ -140,21 +102,29 @@ static char setreg_resp_delim_fastmap[256];
static int dump_reg_flag; /* Non-zero means do a dump_registers cmd when
monitor_wait wakes up. */
-static int first_time = 0; /* is this the first time we're executing after
- gaving created the child proccess? */
+static int first_time = 0; /* Is this the first time we're
+ executing after gaving created the
+ child proccess? */
+
+
+/* This is the ptid we use while we're connected to a monitor. Its
+ value is arbitrary, as monitor targets don't have a notion of
+ processes or threads, but we need something non-null to place in
+ inferior_ptid. */
+static ptid_t monitor_ptid;
#define TARGET_BUF_SIZE 2048
/* Monitor specific debugging information. Typically only useful to
- the developer of a new monitor interface. */
+ the developer of a new monitor interface. */
-static void monitor_debug (const char *fmt, ...) ATTR_FORMAT(printf, 1, 2);
+static void monitor_debug (const char *fmt, ...) ATTRIBUTE_PRINTF (1, 2);
-static int monitor_debug_p = 0;
+static unsigned int monitor_debug_p = 0;
/* NOTE: This file alternates between monitor_debug_p and remote_debug
when determining if debug information is printed. Perhaps this
- could be simplified. */
+ could be simplified. */
static void
monitor_debug (const char *fmt, ...)
@@ -162,6 +132,7 @@ monitor_debug (const char *fmt, ...)
if (monitor_debug_p)
{
va_list args;
+
va_start (args, fmt);
vfprintf_filtered (gdb_stdlog, fmt, args);
va_end (args);
@@ -171,7 +142,7 @@ monitor_debug (const char *fmt, ...)
/* Convert a string into a printable representation, Return # byte in
the new string. When LEN is >0 it specifies the size of the
- string. Otherwize strlen(oldstr) is used. */
+ string. Otherwize strlen(oldstr) is used. */
static void
monitor_printable_string (char *newstr, char *oldstr, int len)
@@ -241,12 +212,17 @@ monitor_error (char *function, char *message,
{
int real_len = (len == 0 && string != (char *) 0) ? strlen (string) : len;
char *safe_string = alloca ((real_len * 4) + 1);
+
monitor_printable_string (safe_string, string, real_len);
if (final_char)
- error ("%s (0x%s): %s: %s%c", function, paddr_nz (memaddr), message, safe_string, final_char);
+ error (_("%s (%s): %s: %s%c"),
+ function, paddress (target_gdbarch (), memaddr),
+ message, safe_string, final_char);
else
- error ("%s (0x%s): %s: %s", function, paddr_nz (memaddr), message, safe_string);
+ error (_("%s (%s): %s: %s"),
+ function, paddress (target_gdbarch (), memaddr),
+ message, safe_string);
}
/* Convert hex digit A to a number. */
@@ -261,7 +237,7 @@ fromhex (int a)
else if (a >= 'A' && a <= 'F')
return a - 'A' + 10;
else
- error ("Invalid hex digit %d", a);
+ error (_("Invalid hex digit %d"), a);
}
/* monitor_vsprintf - similar to vsprintf but handles 64-bit addresses
@@ -275,12 +251,12 @@ fromhex (int a)
If it is a '%s' format, the argument is a string; otherwise the
argument is assumed to be a long integer.
- %% is also turned into a single %.
- */
+ %% is also turned into a single %. */
static void
monitor_vsprintf (char *sndbuf, char *pattern, va_list args)
{
+ int addr_bit = gdbarch_addr_bit (target_gdbarch ());
char format[10];
char fmt;
char *p;
@@ -309,7 +285,7 @@ monitor_vsprintf (char *sndbuf, char *pattern, va_list args)
break;
case 'A':
arg_addr = va_arg (args, CORE_ADDR);
- strcpy (sndbuf, paddr_nz (arg_addr));
+ strcpy (sndbuf, phex_nz (arg_addr, addr_bit / 8));
break;
case 's':
arg_string = va_arg (args, char *);
@@ -345,11 +321,13 @@ monitor_printf_noecho (char *pattern,...)
len = strlen (sndbuf);
if (len + 1 > sizeof sndbuf)
- internal_error (__FILE__, __LINE__, "failed internal consistency check");
+ internal_error (__FILE__, __LINE__,
+ _("failed internal consistency check"));
if (monitor_debug_p)
{
char *safe_string = (char *) alloca ((strlen (sndbuf) * 4) + 1);
+
monitor_printable_string (safe_string, sndbuf, 0);
fprintf_unfiltered (gdb_stdlog, "sent[%s]\n", safe_string);
}
@@ -373,21 +351,24 @@ monitor_printf (char *pattern,...)
len = strlen (sndbuf);
if (len + 1 > sizeof sndbuf)
- internal_error (__FILE__, __LINE__, "failed internal consistency check");
+ internal_error (__FILE__, __LINE__,
+ _("failed internal consistency check"));
if (monitor_debug_p)
{
char *safe_string = (char *) alloca ((len * 4) + 1);
+
monitor_printable_string (safe_string, sndbuf, 0);
fprintf_unfiltered (gdb_stdlog, "sent[%s]\n", safe_string);
}
monitor_write (sndbuf, len);
- /* We used to expect that the next immediate output was the characters we
- just output, but sometimes some extra junk appeared before the characters
- we expected, like an extra prompt, or a portmaster sending telnet negotiations.
- So, just start searching for what we sent, and skip anything unknown. */
+ /* We used to expect that the next immediate output was the
+ characters we just output, but sometimes some extra junk appeared
+ before the characters we expected, like an extra prompt, or a
+ portmaster sending telnet negotiations. So, just start searching
+ for what we sent, and skip anything unknown. */
monitor_debug ("ExpectEcho\n");
monitor_expect (sndbuf, (char *) 0, 0);
}
@@ -428,9 +409,9 @@ monitor_readchar (void)
return c;
if (c == SERIAL_TIMEOUT)
- error ("Timeout reading from remote system.");
+ error (_("Timeout reading from remote system."));
- perror_with_name ("remote-monitor");
+ perror_with_name (_("remote-monitor"));
}
@@ -457,10 +438,11 @@ readchar (int timeout)
{
c &= 0x7f;
/* This seems to interfere with proper function of the
- input stream */
+ input stream. */
if (monitor_debug_p || remote_debug)
{
char buf[2];
+
buf[0] = c;
buf[1] = '\0';
puts_debug ("read -->", buf, "<--");
@@ -468,7 +450,7 @@ readchar (int timeout)
}
- /* Canonicialize \n\r combinations into one \r */
+ /* Canonicialize \n\r combinations into one \r. */
if ((current_monitor->flags & MO_HANDLE_NL) != 0)
{
if ((c == '\r' && state == last_nl)
@@ -495,17 +477,17 @@ readchar (int timeout)
if (c == SERIAL_TIMEOUT)
#if 0
- /* I fail to see how detaching here can be useful */
- if (in_monitor_wait) /* Watchdog went off */
+ /* I fail to see how detaching here can be useful. */
+ if (in_monitor_wait) /* Watchdog went off. */
{
target_mourn_inferior ();
- error ("GDB serial timeout has expired. Target detached.\n");
+ error (_("GDB serial timeout has expired. Target detached."));
}
else
#endif
- error ("Timeout reading from remote system.");
+ error (_("Timeout reading from remote system."));
- perror_with_name ("remote-monitor");
+ perror_with_name (_("remote-monitor"));
}
/* Scan input from the remote system, until STRING is found. If BUF is non-
@@ -530,6 +512,7 @@ monitor_expect (char *string, char *buf, int buflen)
}
immediate_quit++;
+ QUIT;
while (1)
{
if (buf)
@@ -550,7 +533,7 @@ monitor_expect (char *string, char *buf, int buflen)
else
c = readchar (timeout);
- /* Don't expect any ^C sent to be echoed */
+ /* Don't expect any ^C sent to be echoed. */
if (*p == '\003' || c == *p)
{
@@ -590,7 +573,7 @@ monitor_expect (char *string, char *buf, int buflen)
p, since we know no prefix can be longer than that.
Note that we can use STRING itself, along with C, as a record
- of what we've received so far. :) */
+ of what we've received so far. :) */
int i;
for (i = (p - string) - 1; i >= 0; i--)
@@ -598,7 +581,7 @@ monitor_expect (char *string, char *buf, int buflen)
{
/* Is this prefix a suffix of what we've read so far?
In other words, does
- string[0 .. i-1] == string[p - i, p - 1]? */
+ string[0 .. i-1] == string[p - i, p - 1]? */
if (! memcmp (string, p - i, i))
{
p = string + i + 1;
@@ -618,6 +601,7 @@ monitor_expect_regexp (struct re_pattern_buffer *pat, char *buf, int buflen)
{
char *mybuf;
char *p;
+
monitor_debug ("MON Expecting regexp\n");
if (buf)
mybuf = buf;
@@ -633,10 +617,10 @@ monitor_expect_regexp (struct re_pattern_buffer *pat, char *buf, int buflen)
int retval;
if (p - mybuf >= buflen)
- { /* Buffer about to overflow */
+ { /* Buffer about to overflow. */
/* On overflow, we copy the upper half of the buffer to the lower half. Not
- great, but it usually works... */
+ great, but it usually works... */
memcpy (mybuf, mybuf + buflen / 2, buflen / 2);
p = mybuf + buflen / 2;
@@ -716,34 +700,36 @@ compile_pattern (char *pattern, struct re_pattern_buffer *compiled_pattern,
re_set_syntax (tmp);
if (val)
- error ("compile_pattern: Can't compile pattern string `%s': %s!", pattern, val);
+ error (_("compile_pattern: Can't compile pattern string `%s': %s!"),
+ pattern, val);
if (fastmap)
re_compile_fastmap (compiled_pattern);
}
-/* Open a connection to a remote debugger. NAME is the filename used
+/* Open a connection to a remote debugger. NAME is the filename used
for communication. */
void
-monitor_open (char *args, struct monitor_ops *mon_ops, int from_tty)
+monitor_open (const char *args, struct monitor_ops *mon_ops, int from_tty)
{
- char *name;
+ const char *name;
char **p;
+ struct inferior *inf;
if (mon_ops->magic != MONITOR_OPS_MAGIC)
- error ("Magic number of monitor_ops struct wrong.");
+ error (_("Magic number of monitor_ops struct wrong."));
targ_ops = mon_ops->target;
name = targ_ops->to_shortname;
if (!args)
- error ("Use `target %s DEVICE-NAME' to use a serial port, or \n\
-`target %s HOST-NAME:PORT-NUMBER' to use a network connection.", name, name);
+ error (_("Use `target %s DEVICE-NAME' to use a serial port, or\n\
+`target %s HOST-NAME:PORT-NUMBER' to use a network connection."), name, name);
target_preopen (from_tty);
- /* Setup pattern for register dump */
+ /* Setup pattern for register dump. */
if (mon_ops->register_pattern)
compile_pattern (mon_ops->register_pattern, ®ister_pattern,
@@ -785,7 +771,7 @@ monitor_open (char *args, struct monitor_ops *mon_ops, int from_tty)
serial_flush_input (monitor_desc);
- /* some systems only work with 2 stop bits */
+ /* some systems only work with 2 stop bits. */
serial_setstopbits (monitor_desc, mon_ops->stopbits);
@@ -796,7 +782,7 @@ monitor_open (char *args, struct monitor_ops *mon_ops, int from_tty)
if (current_monitor->stop)
{
- monitor_stop ();
+ monitor_stop (targ_ops, inferior_ptid);
if ((current_monitor->flags & MO_NO_ECHO_ON_OPEN) == 0)
{
monitor_debug ("EXP Open echo\n");
@@ -804,11 +790,11 @@ monitor_open (char *args, struct monitor_ops *mon_ops, int from_tty)
}
}
- /* wake up the monitor and see if it's alive */
+ /* wake up the monitor and see if it's alive. */
for (p = mon_ops->init; *p != NULL; p++)
{
/* Some of the characters we send may not be echoed,
- but we hope to get a prompt at the end of it all. */
+ but we hope to get a prompt at the end of it all. */
if ((current_monitor->flags & MO_NO_ECHO_ON_OPEN) == 0)
monitor_printf (*p);
@@ -825,11 +811,12 @@ monitor_open (char *args, struct monitor_ops *mon_ops, int from_tty)
if (mon_ops->num_breakpoints == 0)
mon_ops->num_breakpoints = 8;
- breakaddr = (CORE_ADDR *) xmalloc (mon_ops->num_breakpoints * sizeof (CORE_ADDR));
+ breakaddr = (CORE_ADDR *)
+ xmalloc (mon_ops->num_breakpoints * sizeof (CORE_ADDR));
memset (breakaddr, 0, mon_ops->num_breakpoints * sizeof (CORE_ADDR));
}
- /* Remove all breakpoints */
+ /* Remove all breakpoints. */
if (mon_ops->clr_all_break)
{
@@ -838,29 +825,39 @@ monitor_open (char *args, struct monitor_ops *mon_ops, int from_tty)
}
if (from_tty)
- printf_unfiltered ("Remote target %s connected to %s\n", name, dev_name);
+ printf_unfiltered (_("Remote target %s connected to %s\n"),
+ name, dev_name);
push_target (targ_ops);
- inferior_ptid = pid_to_ptid (42000); /* Make run command think we are busy... */
+ /* Start afresh. */
+ init_thread_list ();
- /* Give monitor_wait something to read */
+ /* Make run command think we are busy... */
+ inferior_ptid = monitor_ptid;
+ inf = current_inferior ();
+ inferior_appeared (inf, ptid_get_pid (inferior_ptid));
+ add_thread_silent (inferior_ptid);
+
+ /* Give monitor_wait something to read. */
monitor_printf (current_monitor->line_term);
- start_remote ();
+ init_wait_for_inferior ();
+
+ start_remote (from_tty);
}
/* Close out all files and local state before this target loses
control. */
void
-monitor_close (int quitting)
+monitor_close (struct target_ops *self)
{
if (monitor_desc)
serial_close (monitor_desc);
- /* Free breakpoint memory */
+ /* Free breakpoint memory. */
if (breakaddr != NULL)
{
xfree (breakaddr);
@@ -868,24 +865,29 @@ monitor_close (int quitting)
}
monitor_desc = NULL;
+
+ delete_thread_silent (monitor_ptid);
+ delete_inferior_silent (ptid_get_pid (monitor_ptid));
}
/* Terminate the open connection to the remote debugger. Use this
when you want to detach and do something else with your gdb. */
static void
-monitor_detach (char *args, int from_tty)
+monitor_detach (struct target_ops *ops, const char *args, int from_tty)
{
- pop_target (); /* calls monitor_close to do the real work */
+ unpush_target (ops); /* calls monitor_close to do the real work. */
if (from_tty)
- printf_unfiltered ("Ending remote %s debugging\n", target_shortname);
+ printf_unfiltered (_("Ending remote %s debugging\n"), target_shortname);
}
/* Convert VALSTR into the target byte-ordered value of REGNO and store it. */
char *
-monitor_supply_register (int regno, char *valstr)
+monitor_supply_register (struct regcache *regcache, int regno, char *valstr)
{
+ struct gdbarch *gdbarch = get_regcache_arch (regcache);
+ enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
ULONGEST val;
unsigned char regbuf[MAX_REGISTER_SIZE];
char *p;
@@ -916,14 +918,15 @@ monitor_supply_register (int regno, char *valstr)
monitor_debug ("Supplying Register %d %s\n", regno, valstr);
if (val == 0 && valstr == p)
- error ("monitor_supply_register (%d): bad value from monitor: %s.",
+ error (_("monitor_supply_register (%d): bad value from monitor: %s."),
regno, valstr);
- /* supply register stores in target byte order, so swap here */
+ /* supply register stores in target byte order, so swap here. */
- store_unsigned_integer (regbuf, DEPRECATED_REGISTER_RAW_SIZE (regno), val);
+ store_unsigned_integer (regbuf, register_size (gdbarch, regno), byte_order,
+ val);
- regcache_raw_supply (current_regcache, regno, regbuf);
+ regcache_raw_supply (regcache, regno, regbuf);
return p;
}
@@ -931,9 +934,10 @@ monitor_supply_register (int regno, char *valstr)
/* Tell the remote machine to resume. */
static void
-monitor_resume (ptid_t ptid, int step, enum target_signal sig)
+monitor_resume (struct target_ops *ops,
+ ptid_t ptid, int step, enum gdb_signal sig)
{
- /* Some monitors require a different command when starting a program */
+ /* Some monitors require a different command when starting a program. */
monitor_debug ("MON resume\n");
if (current_monitor->flags & MO_RUN_FIRST_TIME && first_time == 1)
{
@@ -962,13 +966,14 @@ monitor_resume (ptid_t ptid, int step, enum target_signal sig)
string which are passed down to monitor specific code. */
static void
-parse_register_dump (char *buf, int len)
+parse_register_dump (struct regcache *regcache, char *buf, int len)
{
monitor_debug ("MON Parsing register dump\n");
while (1)
{
int regnamelen, vallen;
char *regname, *val;
+
/* Element 0 points to start of register name, and element 1
points to the start of the register value. */
struct re_registers register_strings;
@@ -984,7 +989,8 @@ parse_register_dump (char *buf, int len)
vallen = register_strings.end[2] - register_strings.start[2];
val = buf + register_strings.start[2];
- current_monitor->supply_register (regname, regnamelen, val, vallen);
+ current_monitor->supply_register (regcache, regname, regnamelen,
+ val, vallen);
buf += register_strings.end[0];
len -= register_strings.end[0];
@@ -1003,7 +1009,7 @@ monitor_interrupt (int signo)
if (monitor_debug_p || remote_debug)
fprintf_unfiltered (gdb_stdlog, "monitor_interrupt called\n");
- target_stop ();
+ target_stop (inferior_ptid);
}
/* The user typed ^C twice. */
@@ -1025,11 +1031,11 @@ monitor_interrupt_query (void)
{
target_terminal_ours ();
- if (query ("Interrupted while waiting for the program.\n\
-Give up (and stop debugging it)? "))
+ if (query (_("Interrupted while waiting for the program.\n\
+Give up (and stop debugging it)? ")))
{
target_mourn_inferior ();
- throw_exception (RETURN_QUIT);
+ quit ();
}
target_terminal_inferior ();
@@ -1052,18 +1058,21 @@ monitor_wait_filter (char *buf,
struct target_waitstatus *status)
{
int resp_len;
+
do
{
resp_len = monitor_expect_prompt (buf, bufmax);
*ext_resp_len = resp_len;
if (resp_len <= 0)
- fprintf_unfiltered (gdb_stderr, "monitor_wait: excessive response from monitor: %s.", buf);
+ fprintf_unfiltered (gdb_stderr,
+ "monitor_wait: excessive "
+ "response from monitor: %s.", buf);
}
while (resp_len < 0);
/* Print any output characters that were preceded by ^O. */
- /* FIXME - This would be great as a user settabgle flag */
+ /* FIXME - This would be great as a user settabgle flag. */
if (monitor_debug_p || remote_debug
|| current_monitor->flags & MO_PRINT_PROGRAM_OUTPUT)
{
@@ -1081,7 +1090,8 @@ monitor_wait_filter (char *buf,
status just as `wait' would. */
static ptid_t
-monitor_wait (ptid_t ptid, struct target_waitstatus *status)
+monitor_wait (struct target_ops *ops,
+ ptid_t ptid, struct target_waitstatus *status, int options)
{
int old_timeout = timeout;
char buf[TARGET_BUF_SIZE];
@@ -1095,11 +1105,11 @@ monitor_wait (ptid_t ptid, struct target_waitstatus *status)
monitor_debug ("MON wait\n");
#if 0
- /* This is somthing other than a maintenance command */
+ /* This is somthing other than a maintenance command. */
in_monitor_wait = 1;
timeout = watchdog > 0 ? watchdog : -1;
#else
- timeout = -1; /* Don't time out -- user program is running. */
+ timeout = -1; /* Don't time out -- user program is running. */
#endif
ofunc = (void (*)()) signal (SIGINT, monitor_interrupt);
@@ -1109,18 +1119,20 @@ monitor_wait (ptid_t ptid, struct target_waitstatus *status)
else
monitor_wait_filter (buf, sizeof (buf), &resp_len, status);
-#if 0 /* Transferred to monitor wait filter */
+#if 0 /* Transferred to monitor wait filter. */
do
{
resp_len = monitor_expect_prompt (buf, sizeof (buf));
if (resp_len <= 0)
- fprintf_unfiltered (gdb_stderr, "monitor_wait: excessive response from monitor: %s.", buf);
+ fprintf_unfiltered (gdb_stderr,
+ "monitor_wait: excessive "
+ "response from monitor: %s.", buf);
}
while (resp_len < 0);
/* Print any output characters that were preceded by ^O. */
- /* FIXME - This would be great as a user settabgle flag */
+ /* FIXME - This would be great as a user settabgle flag. */
if (monitor_debug_p || remote_debug
|| current_monitor->flags & MO_PRINT_PROGRAM_OUTPUT)
{
@@ -1144,14 +1156,14 @@ monitor_wait (ptid_t ptid, struct target_waitstatus *status)
}
if (current_monitor->register_pattern)
- parse_register_dump (buf, resp_len);
+ parse_register_dump (get_current_regcache (), buf, resp_len);
#else
monitor_debug ("Wait fetching registers after stop\n");
- monitor_dump_regs ();
+ monitor_dump_regs (get_current_regcache ());
#endif
status->kind = TARGET_WAITKIND_STOPPED;
- status->value.sig = TARGET_SIGNAL_TRAP;
+ status->value.sig = GDB_SIGNAL_TRAP;
discard_cleanups (old_chain);
@@ -1160,11 +1172,11 @@ monitor_wait (ptid_t ptid, struct target_waitstatus *status)
return inferior_ptid;
}
-/* Fetch register REGNO, or all registers if REGNO is -1. Returns
+/* Fetch register REGNO, or all registers if REGNO is -1. Returns
errno value. */
static void
-monitor_fetch_register (int regno)
+monitor_fetch_register (struct regcache *regcache, int regno)
{
const char *name;
char *zerobuf;
@@ -1184,11 +1196,11 @@ monitor_fetch_register (int regno)
if (!name || (*name == '\0'))
{
monitor_debug ("No register known for %d\n", regno);
- regcache_raw_supply (current_regcache, regno, zerobuf);
+ regcache_raw_supply (regcache, regno, zerobuf);
return;
}
- /* send the register examine command */
+ /* Send the register examine command. */
monitor_printf (current_monitor->getreg.cmd, name);
@@ -1209,17 +1221,19 @@ monitor_fetch_register (int regno)
}
}
- /* Skip leading spaces and "0x" if MO_HEX_PREFIX flag is set */
+ /* Skip leading spaces and "0x" if MO_HEX_PREFIX flag is set. */
if (current_monitor->flags & MO_HEX_PREFIX)
{
int c;
+
c = readchar (timeout);
while (c == ' ')
c = readchar (timeout);
if ((c == '0') && ((c = readchar (timeout)) == 'x'))
;
else
- error ("Bad value returned from monitor while fetching register %x.",
+ error (_("Bad value returned from monitor "
+ "while fetching register %x."),
regno);
}
@@ -1227,9 +1241,10 @@ monitor_fetch_register (int regno)
spaces, but stop reading if something else is seen. Some monitors
like to drop leading zeros. */
- for (i = 0; i < DEPRECATED_REGISTER_RAW_SIZE (regno) * 2; i++)
+ for (i = 0; i < register_size (get_regcache_arch (regcache), regno) * 2; i++)
{
int c;
+
c = readchar (timeout);
while (c == ' ')
c = readchar (timeout);
@@ -1240,7 +1255,7 @@ monitor_fetch_register (int regno)
regbuf[i] = c;
}
- regbuf[i] = '\000'; /* terminate the number */
+ regbuf[i] = '\000'; /* Terminate the number. */
monitor_debug ("REGVAL '%s'\n", regbuf);
/* If TERM is present, we wait for that to show up. Also, (if TERM
@@ -1251,7 +1266,8 @@ monitor_fetch_register (int regno)
if (current_monitor->getreg.term)
{
monitor_debug ("EXP getreg.term\n");
- monitor_expect (current_monitor->getreg.term, NULL, 0); /* get response */
+ monitor_expect (current_monitor->getreg.term, NULL, 0); /* Get
+ response. */
}
if (current_monitor->getreg.term_cmd)
@@ -1260,74 +1276,81 @@ monitor_fetch_register (int regno)
monitor_printf (current_monitor->getreg.term_cmd);
}
if (!current_monitor->getreg.term || /* Already expected or */
- current_monitor->getreg.term_cmd) /* ack expected */
- monitor_expect_prompt (NULL, 0); /* get response */
+ current_monitor->getreg.term_cmd) /* ack expected. */
+ monitor_expect_prompt (NULL, 0); /* Get response. */
- monitor_supply_register (regno, regbuf);
+ monitor_supply_register (regcache, regno, regbuf);
}
-/* Sometimes, it takes several commands to dump the registers */
+/* Sometimes, it takes several commands to dump the registers. */
/* This is a primitive for use by variations of monitor interfaces in
- case they need to compose the operation.
- */
+ case they need to compose the operation. */
+
int
-monitor_dump_reg_block (char *block_cmd)
+monitor_dump_reg_block (struct regcache *regcache, char *block_cmd)
{
char buf[TARGET_BUF_SIZE];
int resp_len;
+
monitor_printf (block_cmd);
resp_len = monitor_expect_prompt (buf, sizeof (buf));
- parse_register_dump (buf, resp_len);
+ parse_register_dump (regcache, buf, resp_len);
return 1;
}
/* Read the remote registers into the block regs. */
-/* Call the specific function if it has been provided */
+/* Call the specific function if it has been provided. */
static void
-monitor_dump_regs (void)
+monitor_dump_regs (struct regcache *regcache)
{
char buf[TARGET_BUF_SIZE];
int resp_len;
+
if (current_monitor->dumpregs)
- (*(current_monitor->dumpregs)) (); /* call supplied function */
- else if (current_monitor->dump_registers) /* default version */
+ (*(current_monitor->dumpregs)) (regcache); /* Call supplied function. */
+ else if (current_monitor->dump_registers) /* Default version. */
{
monitor_printf (current_monitor->dump_registers);
resp_len = monitor_expect_prompt (buf, sizeof (buf));
- parse_register_dump (buf, resp_len);
+ parse_register_dump (regcache, buf, resp_len);
}
else
- internal_error (__FILE__, __LINE__, "failed internal consistency check"); /* Need some way to read registers */
+ /* Need some way to read registers. */
+ internal_error (__FILE__, __LINE__,
+ _("failed internal consistency check"));
}
static void
-monitor_fetch_registers (int regno)
+monitor_fetch_registers (struct target_ops *ops,
+ struct regcache *regcache, int regno)
{
monitor_debug ("MON fetchregs\n");
if (current_monitor->getreg.cmd)
{
if (regno >= 0)
{
- monitor_fetch_register (regno);
+ monitor_fetch_register (regcache, regno);
return;
}
- for (regno = 0; regno < NUM_REGS; regno++)
- monitor_fetch_register (regno);
+ for (regno = 0; regno < gdbarch_num_regs (get_regcache_arch (regcache));
+ regno++)
+ monitor_fetch_register (regcache, regno);
}
else
{
- monitor_dump_regs ();
+ monitor_dump_regs (regcache);
}
}
/* Store register REGNO, or all if REGNO == 0. Return errno value. */
static void
-monitor_store_register (int regno)
+monitor_store_register (struct regcache *regcache, int regno)
{
+ int reg_size = register_size (get_regcache_arch (regcache), regno);
const char *name;
ULONGEST val;
@@ -1342,11 +1365,10 @@ monitor_store_register (int regno)
return;
}
- val = read_register (regno);
- monitor_debug ("MON storeg %d %s\n", regno,
- phex (val, DEPRECATED_REGISTER_RAW_SIZE (regno)));
+ regcache_cooked_read_unsigned (regcache, regno, &val);
+ monitor_debug ("MON storeg %d %s\n", regno, phex (val, reg_size));
- /* send the register deposit command */
+ /* Send the register deposit command. */
if (current_monitor->flags & MO_REGISTER_VALUE_FIRST)
monitor_printf (current_monitor->setreg.cmd, val, name);
@@ -1360,19 +1382,19 @@ monitor_store_register (int regno)
monitor_debug ("EXP setreg.resp_delim\n");
monitor_expect_regexp (&setreg_resp_delim_pattern, NULL, 0);
if (current_monitor->flags & MO_SETREG_INTERACTIVE)
- monitor_printf ("%s\r", paddr_nz (val));
+ monitor_printf ("%s\r", phex_nz (val, reg_size));
}
if (current_monitor->setreg.term)
{
monitor_debug ("EXP setreg.term\n");
monitor_expect (current_monitor->setreg.term, NULL, 0);
if (current_monitor->flags & MO_SETREG_INTERACTIVE)
- monitor_printf ("%s\r", paddr_nz (val));
+ monitor_printf ("%s\r", phex_nz (val, reg_size));
monitor_expect_prompt (NULL, 0);
}
else
monitor_expect_prompt (NULL, 0);
- if (current_monitor->setreg.term_cmd) /* Mode exit required */
+ if (current_monitor->setreg.term_cmd) /* Mode exit required. */
{
monitor_debug ("EXP setreg_termcmd\n");
monitor_printf ("%s", current_monitor->setreg.term_cmd);
@@ -1383,16 +1405,18 @@ monitor_store_register (int regno)
/* Store the remote registers. */
static void
-monitor_store_registers (int regno)
+monitor_store_registers (struct target_ops *ops,
+ struct regcache *regcache, int regno)
{
if (regno >= 0)
{
- monitor_store_register (regno);
+ monitor_store_register (regcache, regno);
return;
}
- for (regno = 0; regno < NUM_REGS; regno++)
- monitor_store_register (regno);
+ for (regno = 0; regno < gdbarch_num_regs (get_regcache_arch (regcache));
+ regno++)
+ monitor_store_register (regcache, regno);
}
/* Get ready to modify the registers array. On machines which store
@@ -1402,28 +1426,29 @@ monitor_store_registers (int regno)
debugged. */
static void
-monitor_prepare_to_store (void)
+monitor_prepare_to_store (struct target_ops *self, struct regcache *regcache)
{
- /* Do nothing, since we can store individual regs */
+ /* Do nothing, since we can store individual regs. */
}
static void
monitor_files_info (struct target_ops *ops)
{
- printf_unfiltered ("\tAttached to %s at %d baud.\n", dev_name, baud_rate);
+ printf_unfiltered (_("\tAttached to %s at %d baud.\n"), dev_name, baud_rate);
}
static int
-monitor_write_memory (CORE_ADDR memaddr, char *myaddr, int len)
+monitor_write_memory (CORE_ADDR memaddr, const gdb_byte *myaddr, int len)
{
+ enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
unsigned int val, hostval;
char *cmd;
int i;
- monitor_debug ("MON write %d %s\n", len, paddr (memaddr));
+ monitor_debug ("MON write %d %s\n", len, paddress (target_gdbarch (), memaddr));
if (current_monitor->flags & MO_ADDR_BITS_REMOVE)
- memaddr = ADDR_BITS_REMOVE (memaddr);
+ memaddr = gdbarch_addr_bits_remove (target_gdbarch (), memaddr);
/* Use memory fill command for leading 0 bytes. */
@@ -1433,11 +1458,12 @@ monitor_write_memory (CORE_ADDR memaddr, char *myaddr, int len)
if (myaddr[i] != 0)
break;
- if (i > 4) /* More than 4 zeros is worth doing */
+ if (i > 4) /* More than 4 zeros is worth doing. */
{
monitor_debug ("MON FILL %d\n", i);
if (current_monitor->flags & MO_FILL_USES_ADDR)
- monitor_printf (current_monitor->fill, memaddr, (memaddr + i) - 1, 0);
+ monitor_printf (current_monitor->fill, memaddr,
+ (memaddr + i) - 1, 0);
else
monitor_printf (current_monitor->fill, memaddr, i, 0);
@@ -1472,7 +1498,7 @@ monitor_write_memory (CORE_ADDR memaddr, char *myaddr, int len)
cmd = current_monitor->setmem.cmdb;
}
- val = extract_unsigned_integer (myaddr, len);
+ val = extract_unsigned_integer (myaddr, len, byte_order);
if (len == 4)
{
@@ -1485,7 +1511,6 @@ monitor_write_memory (CORE_ADDR memaddr, char *myaddr, int len)
monitor_printf_noecho (cmd, memaddr, val);
else if (current_monitor->flags & MO_SETMEM_INTERACTIVE)
{
-
monitor_printf_noecho (cmd, memaddr);
if (current_monitor->setmem.resp_delim)
@@ -1501,9 +1526,9 @@ monitor_write_memory (CORE_ADDR memaddr, char *myaddr, int len)
monitor_printf ("%x\r", val);
}
if (current_monitor->setmem.term_cmd)
- { /* Emit this to get out of the memory editing state */
+ { /* Emit this to get out of the memory editing state. */
monitor_printf ("%s", current_monitor->setmem.term_cmd);
- /* Drop through to expecting a prompt */
+ /* Drop through to expecting a prompt. */
}
}
else
@@ -1516,13 +1541,14 @@ monitor_write_memory (CORE_ADDR memaddr, char *myaddr, int len)
static int
-monitor_write_memory_bytes (CORE_ADDR memaddr, char *myaddr, int len)
+monitor_write_memory_bytes (CORE_ADDR memaddr, const gdb_byte *myaddr, int len)
{
unsigned char val;
int written = 0;
+
if (len == 0)
return 0;
- /* Enter the sub mode */
+ /* Enter the sub mode. */
monitor_printf (current_monitor->setmem.cmdb, memaddr);
monitor_expect_prompt (NULL, 0);
while (len)
@@ -1532,11 +1558,11 @@ monitor_write_memory_bytes (CORE_ADDR memaddr, char *myaddr, int len)
myaddr++;
memaddr++;
written++;
- /* If we wanted to, here we could validate the address */
+ /* If we wanted to, here we could validate the address. */
monitor_expect_prompt (NULL, 0);
len--;
}
- /* Now exit the sub mode */
+ /* Now exit the sub mode. */
monitor_printf (current_monitor->getreg.term_cmd);
monitor_expect_prompt (NULL, 0);
return written;
@@ -1548,6 +1574,7 @@ longlongendswap (unsigned char *a)
{
int i, j;
unsigned char x;
+
i = 0;
j = 7;
while (i < 4)
@@ -1558,7 +1585,7 @@ longlongendswap (unsigned char *a)
i++, j--;
}
}
-/* Format 32 chars of long long value, advance the pointer */
+/* Format 32 chars of long long value, advance the pointer. */
static char *hexlate = "0123456789abcdef";
static char *
longlong_hexchars (unsigned long long value,
@@ -1575,23 +1602,25 @@ longlong_hexchars (unsigned long long value,
unsigned char *scan, *limit; /* loop controls */
unsigned char c, nib;
int leadzero = 1;
+
scan = disbuf;
limit = scan + 8;
{
unsigned long long *dp;
+
dp = (unsigned long long *) scan;
*dp = value;
}
- longlongendswap (disbuf); /* FIXME: ONly on big endian hosts */
+ longlongendswap (disbuf); /* FIXME: ONly on big endian hosts. */
while (scan < limit)
{
- c = *scan++; /* a byte of our long long value */
+ c = *scan++; /* A byte of our long long value. */
if (leadzero)
{
if (c == 0)
continue;
else
- leadzero = 0; /* henceforth we print even zeroes */
+ leadzero = 0; /* Henceforth we print even zeroes. */
}
nib = c >> 4; /* high nibble bits */
*outbuff++ = hexlate[nib];
@@ -1605,17 +1634,18 @@ longlong_hexchars (unsigned long long value,
/* I am only going to call this when writing virtual byte streams.
- Which possably entails endian conversions
- */
+ Which possably entails endian conversions. */
+
static int
-monitor_write_memory_longlongs (CORE_ADDR memaddr, char *myaddr, int len)
+monitor_write_memory_longlongs (CORE_ADDR memaddr, const gdb_byte *myaddr, int len)
{
- static char hexstage[20]; /* At least 16 digits required, plus null */
+ static char hexstage[20]; /* At least 16 digits required, plus null. */
char *endstring;
long long *llptr;
long long value;
int written = 0;
- llptr = (unsigned long long *) myaddr;
+
+ llptr = (long long *) myaddr;
if (len == 0)
return 0;
monitor_printf (current_monitor->setmem.cmdll, memaddr);
@@ -1624,16 +1654,16 @@ monitor_write_memory_longlongs (CORE_ADDR memaddr, char *myaddr, int len)
{
value = *llptr;
endstring = longlong_hexchars (*llptr, hexstage);
- *endstring = '\0'; /* NUll terminate for printf */
+ *endstring = '\0'; /* NUll terminate for printf. */
monitor_printf ("%s\r", hexstage);
llptr++;
memaddr += 8;
written += 8;
- /* If we wanted to, here we could validate the address */
+ /* If we wanted to, here we could validate the address. */
monitor_expect_prompt (NULL, 0);
len -= 8;
}
- /* Now exit the sub mode */
+ /* Now exit the sub mode. */
monitor_printf (current_monitor->getreg.term_cmd);
monitor_expect_prompt (NULL, 0);
return written;
@@ -1651,16 +1681,16 @@ monitor_write_memory_longlongs (CORE_ADDR memaddr, char *myaddr, int len)
MO_SETMEM_INTERACTIVE
! MO_NO_ECHO_ON_SETMEM
To use this, the you have to patch the monitor_cmds block with
- this function. Otherwise, its not tuned up for use by all
- monitor variations.
- */
+ this function. Otherwise, its not tuned up for use by all
+ monitor variations. */
static int
-monitor_write_memory_block (CORE_ADDR memaddr, char *myaddr, int len)
+monitor_write_memory_block (CORE_ADDR memaddr, const gdb_byte *myaddr, int len)
{
int written;
+
written = 0;
- /* FIXME: This would be a good place to put the zero test */
+ /* FIXME: This would be a good place to put the zero test. */
#if 1
if ((len > 8) && (((len & 0x07)) == 0) && current_monitor->setmem.cmdll)
{
@@ -1675,8 +1705,9 @@ monitor_write_memory_block (CORE_ADDR memaddr, char *myaddr, int len)
which can only read a single byte/word/etc. at a time. */
static int
-monitor_read_memory_single (CORE_ADDR memaddr, char *myaddr, int len)
+monitor_read_memory_single (CORE_ADDR memaddr, gdb_byte *myaddr, int len)
{
+ enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
unsigned int val;
char membuf[sizeof (int) * 2 + 1];
char *p;
@@ -1727,7 +1758,7 @@ monitor_read_memory_single (CORE_ADDR memaddr, char *myaddr, int len)
/* Now, read the appropriate number of hex digits for this loc,
skipping spaces. */
- /* Skip leading spaces and "0x" if MO_HEX_PREFIX flag is set. */
+ /* Skip leading spaces and "0x" if MO_HEX_PREFIX flag is set. */
if (current_monitor->flags & MO_HEX_PREFIX)
{
int c;
@@ -1745,6 +1776,7 @@ monitor_read_memory_single (CORE_ADDR memaddr, char *myaddr, int len)
{
int i;
+
for (i = 0; i < len * 2; i++)
{
int c;
@@ -1763,7 +1795,7 @@ monitor_read_memory_single (CORE_ADDR memaddr, char *myaddr, int len)
}
membuf[i] = c;
}
- membuf[i] = '\000'; /* terminate the number */
+ membuf[i] = '\000'; /* Terminate the number. */
}
/* If TERM is present, we wait for that to show up. Also, (if TERM is
@@ -1772,7 +1804,8 @@ monitor_read_memory_single (CORE_ADDR memaddr, char *myaddr, int len)
if (current_monitor->getmem.term)
{
- monitor_expect (current_monitor->getmem.term, NULL, 0); /* get response */
+ monitor_expect (current_monitor->getmem.term, NULL, 0); /* Get
+ response. */
if (current_monitor->getmem.term_cmd)
{
@@ -1781,7 +1814,7 @@ monitor_read_memory_single (CORE_ADDR memaddr, char *myaddr, int len)
}
}
else
- monitor_expect_prompt (NULL, 0); /* get response */
+ monitor_expect_prompt (NULL, 0); /* Get response. */
p = membuf;
val = strtoul (membuf, &p, 16);
@@ -1791,9 +1824,9 @@ monitor_read_memory_single (CORE_ADDR memaddr, char *myaddr, int len)
"bad value from monitor",
memaddr, 0, membuf, 0);
- /* supply register stores in target byte order, so swap here */
+ /* supply register stores in target byte order, so swap here. */
- store_unsigned_integer (myaddr, len, val);
+ store_unsigned_integer (myaddr, len, byte_order, val);
return len;
}
@@ -1803,7 +1836,7 @@ monitor_read_memory_single (CORE_ADDR memaddr, char *myaddr, int len)
than 16 bytes at a time. */
static int
-monitor_read_memory (CORE_ADDR memaddr, char *myaddr, int len)
+monitor_read_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len)
{
unsigned int val;
char buf[512];
@@ -1818,21 +1851,21 @@ monitor_read_memory (CORE_ADDR memaddr, char *myaddr, int len)
return 0;
}
- monitor_debug ("MON read block ta(%s) ha(%lx) %d\n",
- paddr_nz (memaddr), (long) myaddr, len);
+ monitor_debug ("MON read block ta(%s) ha(%s) %d\n",
+ paddress (target_gdbarch (), memaddr),
+ host_address_to_string (myaddr), len);
if (current_monitor->flags & MO_ADDR_BITS_REMOVE)
- memaddr = ADDR_BITS_REMOVE (memaddr);
+ memaddr = gdbarch_addr_bits_remove (target_gdbarch (), memaddr);
if (current_monitor->flags & MO_GETMEM_READ_SINGLE)
return monitor_read_memory_single (memaddr, myaddr, len);
len = min (len, 16);
- /* Some dumpers align the first data with the preceeding 16
- byte boundary. Some print blanks and start at the
- requested boundary. EXACT_DUMPADDR
- */
+ /* Some dumpers align the first data with the preceding 16
+ byte boundary. Some print blanks and start at the
+ requested boundary. EXACT_DUMPADDR */
dumpaddr = (current_monitor->flags & MO_EXACT_DUMPADDR)
? memaddr : memaddr & ~0x0f;
@@ -1841,7 +1874,7 @@ monitor_read_memory (CORE_ADDR memaddr, char *myaddr, int len)
if (((memaddr ^ (memaddr + len - 1)) & ~0xf) != 0)
len = ((memaddr + len) & ~0xf) - memaddr;
- /* send the memory examine command */
+ /* Send the memory examine command. */
if (current_monitor->flags & MO_GETMEM_NEEDS_RANGE)
monitor_printf (current_monitor->getmem.cmdb, memaddr, memaddr + len);
@@ -1857,7 +1890,8 @@ monitor_read_memory (CORE_ADDR memaddr, char *myaddr, int len)
if (current_monitor->getmem.term)
{
- resp_len = monitor_expect (current_monitor->getmem.term, buf, sizeof buf); /* get response */
+ resp_len = monitor_expect (current_monitor->getmem.term,
+ buf, sizeof buf); /* Get response. */
if (resp_len <= 0)
monitor_error ("monitor_read_memory",
@@ -1872,7 +1906,7 @@ monitor_read_memory (CORE_ADDR memaddr, char *myaddr, int len)
}
}
else
- resp_len = monitor_expect_prompt (buf, sizeof buf); /* get response */
+ resp_len = monitor_expect_prompt (buf, sizeof buf); /* Get response. */
p = buf;
@@ -1884,7 +1918,9 @@ monitor_read_memory (CORE_ADDR memaddr, char *myaddr, int len)
{
int retval, tmp;
struct re_registers resp_strings;
- monitor_debug ("MON getmem.resp_delim %s\n", current_monitor->getmem.resp_delim);
+
+ monitor_debug ("MON getmem.resp_delim %s\n",
+ current_monitor->getmem.resp_delim);
memset (&resp_strings, 0, sizeof (struct re_registers));
tmp = strlen (p);
@@ -1906,7 +1942,8 @@ monitor_read_memory (CORE_ADDR memaddr, char *myaddr, int len)
p += strlen (current_monitor->getmem.resp_delim);
#endif
}
- monitor_debug ("MON scanning %d ,%lx '%s'\n", len, (long) p, p);
+ monitor_debug ("MON scanning %d ,%s '%s'\n", len,
+ host_address_to_string (p), p);
if (current_monitor->flags & MO_GETMEM_16_BOUNDARY)
{
char c;
@@ -1931,20 +1968,21 @@ monitor_read_memory (CORE_ADDR memaddr, char *myaddr, int len)
++dumpaddr;
++p;
}
- ++p; /* skip a blank or other non hex char */
+ ++p; /* Skip a blank or other non hex char. */
c = *p;
}
if (fetched == 0)
- error ("Failed to read via monitor");
+ error (_("Failed to read via monitor"));
if (monitor_debug_p || remote_debug)
fprintf_unfiltered (gdb_stdlog, "\n");
- return fetched; /* Return the number of bytes actually read */
+ return fetched; /* Return the number of bytes actually
+ read. */
}
monitor_debug ("MON scanning bytes\n");
for (i = len; i > 0; i--)
{
- /* Skip non-hex chars, but bomb on end of string and newlines */
+ /* Skip non-hex chars, but bomb on end of string and newlines. */
while (1)
{
@@ -1976,50 +2014,73 @@ monitor_read_memory (CORE_ADDR memaddr, char *myaddr, int len)
return len;
}
-/* Transfer LEN bytes between target address MEMADDR and GDB address
- MYADDR. Returns 0 for success, errno code for failure. TARGET is
- unused. */
+/* Helper for monitor_xfer_partial that handles memory transfers.
+ Arguments are like target_xfer_partial. */
-static int
-monitor_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
- struct mem_attrib *attrib, struct target_ops *target)
+static enum target_xfer_status
+monitor_xfer_memory (gdb_byte *readbuf, const gdb_byte *writebuf,
+ ULONGEST memaddr, ULONGEST len, ULONGEST *xfered_len)
{
int res;
- if (write)
+ if (writebuf != NULL)
{
if (current_monitor->flags & MO_HAS_BLOCKWRITES)
- res = monitor_write_memory_block(memaddr, myaddr, len);
+ res = monitor_write_memory_block (memaddr, writebuf, len);
else
- res = monitor_write_memory(memaddr, myaddr, len);
+ res = monitor_write_memory (memaddr, writebuf, len);
+ }
+ else
+ {
+ res = monitor_read_memory (memaddr, readbuf, len);
}
+
+ if (res <= 0)
+ return TARGET_XFER_E_IO;
else
{
- res = monitor_read_memory(memaddr, myaddr, len);
+ *xfered_len = (ULONGEST) res;
+ return TARGET_XFER_OK;
}
+}
+
+/* Target to_xfer_partial implementation. */
+
+static enum target_xfer_status
+monitor_xfer_partial (struct target_ops *ops, enum target_object object,
+ const char *annex, gdb_byte *readbuf,
+ const gdb_byte *writebuf, ULONGEST offset, ULONGEST len,
+ ULONGEST *xfered_len)
+{
+ switch (object)
+ {
+ case TARGET_OBJECT_MEMORY:
+ return monitor_xfer_memory (readbuf, writebuf, offset, len, xfered_len);
- return res;
+ default:
+ return TARGET_XFER_E_IO;
+ }
}
static void
-monitor_kill (void)
+monitor_kill (struct target_ops *ops)
{
- return; /* ignore attempts to kill target system */
+ return; /* Ignore attempts to kill target system. */
}
-/* All we actually do is set the PC to the start address of exec_bfd, and start
- the program at that point. */
+/* All we actually do is set the PC to the start address of exec_bfd. */
static void
-monitor_create_inferior (char *exec_file, char *args, char **env,
- int from_tty)
+monitor_create_inferior (struct target_ops *ops, char *exec_file,
+ char *args, char **env, int from_tty)
{
if (args && (*args != '\000'))
- error ("Args are not supported by the monitor.");
+ error (_("Args are not supported by the monitor."));
first_time = 1;
- clear_proceed_status ();
- proceed (bfd_get_start_address (exec_bfd), TARGET_SIGNAL_0, 0);
+ clear_proceed_status (0);
+ regcache_write_pc (get_current_regcache (),
+ bfd_get_start_address (exec_bfd));
}
/* Clean up when a program exits.
@@ -2028,66 +2089,69 @@ monitor_create_inferior (char *exec_file, char *args, char **env,
instructions. */
static void
-monitor_mourn_inferior (void)
+monitor_mourn_inferior (struct target_ops *ops)
{
unpush_target (targ_ops);
- generic_mourn_inferior (); /* Do all the proper things now */
+ generic_mourn_inferior (); /* Do all the proper things now. */
+ delete_thread_silent (monitor_ptid);
}
/* Tell the monitor to add a breakpoint. */
static int
-monitor_insert_breakpoint (CORE_ADDR addr, char *shadow)
+monitor_insert_breakpoint (struct target_ops *ops, struct gdbarch *gdbarch,
+ struct bp_target_info *bp_tgt)
{
+ CORE_ADDR addr = bp_tgt->placed_address = bp_tgt->reqstd_address;
int i;
- const unsigned char *bp;
int bplen;
- monitor_debug ("MON inst bkpt %s\n", paddr (addr));
+ monitor_debug ("MON inst bkpt %s\n", paddress (gdbarch, addr));
if (current_monitor->set_break == NULL)
- error ("No set_break defined for this monitor");
+ error (_("No set_break defined for this monitor"));
if (current_monitor->flags & MO_ADDR_BITS_REMOVE)
- addr = ADDR_BITS_REMOVE (addr);
+ addr = gdbarch_addr_bits_remove (gdbarch, addr);
/* Determine appropriate breakpoint size for this address. */
- bp = gdbarch_breakpoint_from_pc (current_gdbarch, &addr, &bplen);
+ gdbarch_breakpoint_from_pc (gdbarch, &addr, &bplen);
+ bp_tgt->placed_address = addr;
+ bp_tgt->placed_size = bplen;
for (i = 0; i < current_monitor->num_breakpoints; i++)
{
if (breakaddr[i] == 0)
{
breakaddr[i] = addr;
- monitor_read_memory (addr, shadow, bplen);
monitor_printf (current_monitor->set_break, addr);
monitor_expect_prompt (NULL, 0);
return 0;
}
}
- error ("Too many breakpoints (> %d) for monitor.", current_monitor->num_breakpoints);
+ error (_("Too many breakpoints (> %d) for monitor."),
+ current_monitor->num_breakpoints);
}
/* Tell the monitor to remove a breakpoint. */
static int
-monitor_remove_breakpoint (CORE_ADDR addr, char *shadow)
+monitor_remove_breakpoint (struct target_ops *ops, struct gdbarch *gdbarch,
+ struct bp_target_info *bp_tgt)
{
+ CORE_ADDR addr = bp_tgt->placed_address;
int i;
- monitor_debug ("MON rmbkpt %s\n", paddr (addr));
+ monitor_debug ("MON rmbkpt %s\n", paddress (gdbarch, addr));
if (current_monitor->clr_break == NULL)
- error ("No clr_break defined for this monitor");
-
- if (current_monitor->flags & MO_ADDR_BITS_REMOVE)
- addr = ADDR_BITS_REMOVE (addr);
+ error (_("No clr_break defined for this monitor"));
for (i = 0; i < current_monitor->num_breakpoints; i++)
{
if (breakaddr[i] == addr)
{
breakaddr[i] = 0;
- /* some monitors remove breakpoints based on the address */
+ /* Some monitors remove breakpoints based on the address. */
if (current_monitor->flags & MO_CLR_BREAK_USES_ADDR)
monitor_printf (current_monitor->clr_break, addr);
else if (current_monitor->flags & MO_CLR_BREAK_1_BASED)
@@ -2099,8 +2163,8 @@ monitor_remove_breakpoint (CORE_ADDR addr, char *shadow)
}
}
fprintf_unfiltered (gdb_stderr,
- "Can't find breakpoint associated with 0x%s\n",
- paddr_nz (addr));
+ "Can't find breakpoint associated with %s\n",
+ paddress (gdbarch, addr));
return 1;
}
@@ -2131,43 +2195,60 @@ monitor_wait_srec_ack (void)
return 1;
}
-/* monitor_load -- download a file. */
+/* monitor_load -- download a file. */
static void
-monitor_load (char *file, int from_tty)
+monitor_load (struct target_ops *self, const char *args, int from_tty)
{
+ CORE_ADDR load_offset = 0;
+ char **argv;
+ struct cleanup *old_cleanups;
+ char *filename;
+
monitor_debug ("MON load\n");
- if (current_monitor->load_routine)
- current_monitor->load_routine (monitor_desc, file, hashmark);
- else
- { /* The default is ascii S-records */
- int n;
- unsigned long load_offset;
- char buf[128];
-
- /* enable user to specify address for downloading as 2nd arg to load */
- n = sscanf (file, "%s 0x%lx", buf, &load_offset);
- if (n > 1)
- file = buf;
- else
- load_offset = 0;
+ if (args == NULL)
+ error_no_arg (_("file to load"));
- monitor_printf (current_monitor->load);
- if (current_monitor->loadresp)
- monitor_expect (current_monitor->loadresp, NULL, 0);
+ argv = gdb_buildargv (args);
+ old_cleanups = make_cleanup_freeargv (argv);
- load_srec (monitor_desc, file, (bfd_vma) load_offset,
- 32, SREC_ALL, hashmark,
- current_monitor->flags & MO_SREC_ACK ?
- monitor_wait_srec_ack : NULL);
+ filename = tilde_expand (argv[0]);
+ make_cleanup (xfree, filename);
- monitor_expect_prompt (NULL, 0);
+ /* Enable user to specify address for downloading as 2nd arg to load. */
+ if (argv[1] != NULL)
+ {
+ const char *endptr;
+
+ load_offset = strtoulst (argv[1], &endptr, 0);
+
+ /* If the last word was not a valid number then
+ treat it as a file name with spaces in. */
+ if (argv[1] == endptr)
+ error (_("Invalid download offset:%s."), argv[1]);
+
+ if (argv[2] != NULL)
+ error (_("Too many parameters."));
}
- /* Finally, make the PC point at the start address */
+ monitor_printf (current_monitor->load);
+ if (current_monitor->loadresp)
+ monitor_expect (current_monitor->loadresp, NULL, 0);
+
+ load_srec (monitor_desc, filename, load_offset,
+ 32, SREC_ALL, hashmark,
+ current_monitor->flags & MO_SREC_ACK ?
+ monitor_wait_srec_ack : NULL);
+
+ monitor_expect_prompt (NULL, 0);
+
+ do_cleanups (old_cleanups);
+
+ /* Finally, make the PC point at the start address. */
if (exec_bfd)
- write_pc (bfd_get_start_address (exec_bfd));
+ regcache_write_pc (get_current_regcache (),
+ bfd_get_start_address (exec_bfd));
/* There used to be code here which would clear inferior_ptid and
call clear_symtab_users. None of that should be necessary:
@@ -2185,7 +2266,7 @@ monitor_load (char *file, int from_tty)
}
static void
-monitor_stop (void)
+monitor_stop (struct target_ops *self, ptid_t ptid)
{
monitor_debug ("MON stop\n");
if ((current_monitor->flags & MO_SEND_BREAK_ON_STOP) != 0)
@@ -2195,11 +2276,11 @@ monitor_stop (void)
}
/* Put a COMMAND string out to MONITOR. Output from MONITOR is placed
- in OUTPUT until the prompt is seen. FIXME: We read the characters
+ in OUTPUT until the prompt is seen. FIXME: We read the characters
ourseleves here cause of a nasty echo. */
static void
-monitor_rcmd (char *command,
+monitor_rcmd (struct target_ops *self, const char *command,
struct ui_file *outbuf)
{
char *p;
@@ -2207,7 +2288,7 @@ monitor_rcmd (char *command,
char buf[1000];
if (monitor_desc == NULL)
- error ("monitor target not open.");
+ error (_("monitor target not open."));
p = current_monitor->prompt;
@@ -2218,7 +2299,7 @@ monitor_rcmd (char *command,
resp_len = monitor_expect_prompt (buf, sizeof buf);
- fputs_unfiltered (buf, outbuf); /* Output the response */
+ fputs_unfiltered (buf, outbuf); /* Output the response. */
}
/* Convert hex digit A to a number. */
@@ -2234,7 +2315,7 @@ from_hex (int a)
if (a >= 'A' && a <= 'F')
return a - 'A' + 10;
- error ("Reply contains invalid hex digit 0x%x", a);
+ error (_("Reply contains invalid hex digit 0x%x"), a);
}
#endif
@@ -2244,6 +2325,35 @@ monitor_get_dev_name (void)
return dev_name;
}
+/* Check to see if a thread is still alive. */
+
+static int
+monitor_thread_alive (struct target_ops *ops, ptid_t ptid)
+{
+ if (ptid_equal (ptid, monitor_ptid))
+ /* The monitor's task is always alive. */
+ return 1;
+
+ return 0;
+}
+
+/* Convert a thread ID to a string. Returns the string in a static
+ buffer. */
+
+static char *
+monitor_pid_to_str (struct target_ops *ops, ptid_t ptid)
+{
+ static char buf[64];
+
+ if (ptid_equal (monitor_ptid, ptid))
+ {
+ xsnprintf (buf, sizeof buf, "Thread ");
+ return buf;
+ }
+
+ return normal_pid_to_str (ptid);
+}
+
static struct target_ops monitor_ops;
static void
@@ -2256,7 +2366,7 @@ init_base_monitor_ops (void)
monitor_ops.to_fetch_registers = monitor_fetch_registers;
monitor_ops.to_store_registers = monitor_store_registers;
monitor_ops.to_prepare_to_store = monitor_prepare_to_store;
- monitor_ops.to_xfer_memory = monitor_xfer_memory;
+ monitor_ops.to_xfer_partial = monitor_xfer_partial;
monitor_ops.to_files_info = monitor_files_info;
monitor_ops.to_insert_breakpoint = monitor_insert_breakpoint;
monitor_ops.to_remove_breakpoint = monitor_remove_breakpoint;
@@ -2266,16 +2376,19 @@ init_base_monitor_ops (void)
monitor_ops.to_mourn_inferior = monitor_mourn_inferior;
monitor_ops.to_stop = monitor_stop;
monitor_ops.to_rcmd = monitor_rcmd;
+ monitor_ops.to_log_command = serial_log_command;
+ monitor_ops.to_thread_alive = monitor_thread_alive;
+ monitor_ops.to_pid_to_str = monitor_pid_to_str;
monitor_ops.to_stratum = process_stratum;
- monitor_ops.to_has_all_memory = 1;
- monitor_ops.to_has_memory = 1;
- monitor_ops.to_has_stack = 1;
- monitor_ops.to_has_registers = 1;
- monitor_ops.to_has_execution = 1;
+ monitor_ops.to_has_all_memory = default_child_has_all_memory;
+ monitor_ops.to_has_memory = default_child_has_memory;
+ monitor_ops.to_has_stack = default_child_has_stack;
+ monitor_ops.to_has_registers = default_child_has_registers;
+ monitor_ops.to_has_execution = default_child_has_execution;
monitor_ops.to_magic = OPS_MAGIC;
} /* init_base_monitor_ops */
-/* Init the target_ops structure pointed at by OPS */
+/* Init the target_ops structure pointed at by OPS. */
void
init_monitor_ops (struct target_ops *ops)
@@ -2288,24 +2401,31 @@ init_monitor_ops (struct target_ops *ops)
/* Define additional commands that are usually only used by monitors. */
-extern initialize_file_ftype _initialize_remote_monitors; /* -Wmissing-prototypes */
+/* -Wmissing-prototypes */
+extern initialize_file_ftype _initialize_remote_monitors;
void
_initialize_remote_monitors (void)
{
init_base_monitor_ops ();
- add_show_from_set (add_set_cmd ("hash", no_class, var_boolean,
- (char *) &hashmark,
- "Set display of activity while downloading a file.\n\
-When enabled, a hashmark \'#\' is displayed.",
- &setlist),
- &showlist);
-
- add_show_from_set
- (add_set_cmd ("monitor", no_class, var_zinteger,
- (char *) &monitor_debug_p,
- "Set debugging of remote monitor communication.\n\
+ add_setshow_boolean_cmd ("hash", no_class, &hashmark, _("\
+Set display of activity while downloading a file."), _("\
+Show display of activity while downloading a file."), _("\
+When enabled, a hashmark \'#\' is displayed."),
+ NULL,
+ NULL, /* FIXME: i18n: */
+ &setlist, &showlist);
+
+ add_setshow_zuinteger_cmd ("monitor", no_class, &monitor_debug_p, _("\
+Set debugging of remote monitor communication."), _("\
+Show debugging of remote monitor communication."), _("\
When enabled, communication between GDB and the remote monitor\n\
-is displayed.", &setdebuglist),
- &showdebuglist);
+is displayed."),
+ NULL,
+ NULL, /* FIXME: i18n: */
+ &setdebuglist, &showdebuglist);
+
+ /* Yes, 42000 is arbitrary. The only sense out of it, is that it
+ isn't 0. */
+ monitor_ptid = ptid_build (42000, 0, 42000);
}