/* Remote debugging interface for MIPS remote debugging protocol.
- Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
- 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011
- Free Software Foundation, Inc.
+ Copyright (C) 1993-2013 Free Software Foundation, Inc.
Contributed by Cygnus Support. Written by Ian Lance Taylor
<ian@cygnus.com>.
#include "exceptions.h"
#include "gdb_string.h"
#include "gdb_stat.h"
+#include "gdb_usleep.h"
#include "regcache.h"
#include <ctype.h>
#include "mips-tdep.h"
#include "gdbthread.h"
+#include "gdb_bfd.h"
\f
/* Breakpoint types. Values 0, 1, and 2 must agree with the watch
}
immediate_quit++;
+ QUIT;
while (1)
{
int c;
if (ch == SERIAL_TIMEOUT && timeout == -1) /* Watchdog went off. */
{
target_mourn_inferior ();
- error (_("Watchdog has expired. Target detached.\n"));
+ error (_("Watchdog has expired. Target detached."));
}
if (ch == SERIAL_EOF)
- mips_error ("End of file from remote");
+ mips_error (_("End of file from remote"));
if (ch == SERIAL_ERROR)
- mips_error ("Error reading from remote: %s", safe_strerror (errno));
+ mips_error (_("Error reading from remote: %s"), safe_strerror (errno));
if (remote_debug > 1)
{
/* Don't use _filtered; we can't deal with a QUIT out of
if (mips_syn_garbage > 0
&& *pgarbage > mips_syn_garbage)
- mips_error ("Debug protocol failure: more "
- "than %d characters before a sync.",
+ mips_error (_("Debug protocol failure: more "
+ "than %d characters before a sync."),
mips_syn_garbage);
}
}
len = strlen (s);
if (len > DATA_MAXLEN)
- mips_error ("MIPS protocol data packet too long: %s", s);
+ mips_error (_("MIPS protocol data packet too long: %s"), s);
packet = (unsigned char *) alloca (HDR_LENGTH + len + TRLR_LENGTH + 1);
if (serial_write (mips_desc, packet,
HDR_LENGTH + len + TRLR_LENGTH) != 0)
- mips_error ("write to target failed: %s", safe_strerror (errno));
+ mips_error (_("write to target failed: %s"), safe_strerror (errno));
if (!get_ack)
return;
}
}
- mips_error ("Remote did not acknowledge packet");
+ mips_error (_("Remote did not acknowledge packet"));
}
/* Receive and acknowledge a packet, returning the data in BUFF (which
if (mips_receive_header (hdr, &garbage, ch, timeout) != 0)
{
if (throw_error)
- mips_error ("Timed out waiting for remote packet");
+ mips_error (_("Timed out waiting for remote packet"));
else
return -1;
}
if (rch == SERIAL_TIMEOUT)
{
if (throw_error)
- mips_error ("Timed out waiting for remote packet");
+ mips_error (_("Timed out waiting for remote packet"));
else
return -1;
}
if (err == -1)
{
if (throw_error)
- mips_error ("Timed out waiting for packet");
+ mips_error (_("Timed out waiting for packet"));
else
return -1;
}
if (serial_write (mips_desc, ack, HDR_LENGTH + TRLR_LENGTH) != 0)
{
if (throw_error)
- mips_error ("write to target failed: %s", safe_strerror (errno));
+ mips_error (_("write to target failed: %s"),
+ safe_strerror (errno));
else
return -1;
}
if (serial_write (mips_desc, ack, HDR_LENGTH + TRLR_LENGTH) != 0)
{
if (throw_error)
- mips_error ("write to target failed: %s", safe_strerror (errno));
+ mips_error (_("write to target failed: %s"), safe_strerror (errno));
else
return -1;
}
int timeout,
char *buff)
{
- int addr_size = gdbarch_addr_bit (target_gdbarch) / 8;
+ int addr_size = gdbarch_addr_bit (target_gdbarch ()) / 8;
char myBuff[DATA_MAXLEN + 1];
char response_string[17];
int len;
&rpid, &rcmd, &rerrflg, response_string) != 4
|| !read_hex_value (response_string, &rresponse)
|| (cmd != '\0' && rcmd != cmd))
- mips_error ("Bad response from remote board");
+ mips_error (_("Bad response from remote board"));
if (rerrflg != 0)
{
else /* Assume IDT monitor by default. */
mips_send_command ("db tty0\r", 0);
- sleep (1);
+ gdb_usleep (1000000);
serial_write (mips_desc, "\r", sizeof "\r" - 1);
/* We don't need to absorb any spurious characters here, since the
char buff[DATA_MAXLEN + 1];
if (mips_receive_packet (buff, 1, 3) < 0)
- mips_error ("Failed to initialize (didn't receive packet).");
+ mips_error (_("Failed to initialize (didn't receive packet)."));
}
}
if (mips_initializing)
{
- warning ("internal error: mips_initialize called twice");
+ warning (_("internal error: mips_initialize called twice"));
return;
}
}
break;
case 4:
- mips_error ("Failed to initialize.");
+ mips_error (_("Failed to initialize."));
}
if (mips_expect (mips_monitor_prompt))
enum mips_monitor_type new_monitor,
const char *new_monitor_prompt)
{
- char *ptype;
char *serial_port_name;
char *remote_name = 0;
char *local_name = 0;
mips_open (char *name, int from_tty)
{
const char *monitor_prompt = NULL;
- if (gdbarch_bfd_arch_info (target_gdbarch) != NULL
- && gdbarch_bfd_arch_info (target_gdbarch)->arch == bfd_arch_mips)
+ if (gdbarch_bfd_arch_info (target_gdbarch ()) != NULL
+ && gdbarch_bfd_arch_info (target_gdbarch ())->arch == bfd_arch_mips)
{
- switch (gdbarch_bfd_arch_info (target_gdbarch)->mach)
+ switch (gdbarch_bfd_arch_info (target_gdbarch ())->mach)
{
case bfd_mach_mips4100:
case bfd_mach_mips4300:
static void
mips_resume (struct target_ops *ops,
- ptid_t ptid, int step, enum target_signal siggnal)
+ ptid_t ptid, int step, enum gdb_signal siggnal)
{
int err;
/* Return the signal corresponding to SIG, where SIG is the number which
the MIPS protocol uses for the signal. */
-static enum target_signal
+static enum gdb_signal
mips_signal_from_protocol (int sig)
{
/* We allow a few more signals than the IDT board actually returns, on
for these signals is widely agreed upon. */
if (sig <= 0
|| sig > 31)
- return TARGET_SIGNAL_UNKNOWN;
+ return GDB_SIGNAL_UNKNOWN;
- /* Don't want to use target_signal_from_host because we are converting
+ /* Don't want to use gdb_signal_from_host because we are converting
from MIPS signal numbers, not host ones. Our internal numbers
match the MIPS numbers for the signals the board can return, which
are: SIGINT, SIGSEGV, SIGBUS, SIGILL, SIGFPE, SIGTRAP. */
- return (enum target_signal) sig;
+ return (enum gdb_signal) sig;
}
/* Set the register designated by REGNO to the value designated by VALUE. */
ULONGEST rpc, rfp, rsp;
char pc_string[17], fp_string[17], sp_string[17], flags[20];
int nfields;
- int i;
interrupt_count = 0;
hit_watchpoint = 0;
if (!mips_need_reply)
{
status->kind = TARGET_WAITKIND_STOPPED;
- status->value.sig = TARGET_SIGNAL_TRAP;
+ status->value.sig = GDB_SIGNAL_TRAP;
return inferior_ptid;
}
rstatus = mips_request ('\000', 0, 0, &err, -1, buff);
mips_wait_flag = 0;
if (err)
- mips_error ("Remote failure: %s", safe_strerror (errno));
+ mips_error (_("Remote failure: %s"), safe_strerror (errno));
/* On returning from a continue, the PMON monitor seems to start
echoing back the messages we send prior to sending back the
is not a normal breakpoint. */
if (strcmp (target_shortname, "lsi") == 0)
{
- char *func_name;
+ const char *func_name;
CORE_ADDR func_start;
CORE_ADDR pc = regcache_read_pc (get_current_regcache ());
val = mips_request ('r', pmon_reg, 0,
&err, mips_receive_wait, NULL);
if (err)
- mips_error ("Can't read register %d: %s", regno,
+ mips_error (_("Can't read register %d: %s"), regno,
safe_strerror (errno));
}
}
val,
&err, mips_receive_wait, NULL);
if (err)
- mips_error ("Can't write register %d: %s", regno, safe_strerror (errno));
+ mips_error (_("Can't write register %d: %s"), regno,
+ safe_strerror (errno));
}
/* Fetch a word from the target board. Return word fetched in location
mips_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write,
struct mem_attrib *attrib, struct target_ops *target)
{
- enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch);
+ enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
int i;
CORE_ADDR addr;
int count;
if (args && *args)
{
- warning ("\
-Can't pass arguments to remote MIPS board; arguments ignored.");
+ warning (_("\
+Can't pass arguments to remote MIPS board; arguments ignored."));
/* And don't try to use them on the next "run" command. */
execute_command ("set args", 0);
}
is the number of hardware breakpoints already installed. This
implements the target_can_use_hardware_watchpoint macro. */
-int
+static int
mips_can_use_watchpoint (int type, int cnt, int othertype)
{
return cnt < MAX_LSI_BREAKPOINTS && strcmp (target_shortname, "lsi") == 0;
for a write watchpoint, 1 for a read watchpoint, or 2 for a read/write
watchpoint. */
-int
+static int
mips_insert_watchpoint (CORE_ADDR addr, int len, int type,
struct expression *cond)
{
/* Remove a watchpoint. */
-int
+static int
mips_remove_watchpoint (CORE_ADDR addr, int len, int type,
struct expression *cond)
{
/* Test to see if a watchpoint has been hit. Return 1 if so; return 0,
if not. */
-int
+static int
mips_stopped_by_watchpoint (void)
{
return hit_watchpoint;
mips_check_lsi_error (CORE_ADDR addr, int rerrflg)
{
struct lsi_error *err;
- const char *saddr = paddress (target_gdbarch, addr);
+ const char *saddr = paddress (target_gdbarch (), addr);
if (rerrflg == 0) /* no error */
return 0;
static int
mips_common_breakpoint (int set, CORE_ADDR addr, int len, enum break_type type)
{
- int addr_size = gdbarch_addr_bit (target_gdbarch) / 8;
+ int addr_size = gdbarch_addr_bit (target_gdbarch ()) / 8;
char buf[DATA_MAXLEN + 1];
char cmd, rcmd;
int rpid, rerrflg, rresponse, rlen;
int nfields;
- addr = gdbarch_addr_bits_remove (target_gdbarch, addr);
+ addr = gdbarch_addr_bits_remove (target_gdbarch (), addr);
if (mips_monitor == MON_LSI)
{
/* Clear the table entry and tell PMON to clear the breakpoint. */
if (i == MAX_LSI_BREAKPOINTS)
{
- warning ("\
-mips_common_breakpoint: Attempt to clear bogus breakpoint at %s\n",
- paddress (target_gdbarch, addr));
+ warning (_("\
+mips_common_breakpoint: Attempt to clear bogus breakpoint at %s"),
+ paddress (target_gdbarch (), addr));
return 1;
}
nfields = sscanf (buf, "0x%x b 0x0 0x%x", &rpid, &rerrflg);
if (nfields != 2)
- mips_error ("mips_common_breakpoint: "
- "Bad response from remote board: %s",
+ mips_error (_("mips_common_breakpoint: "
+ "Bad response from remote board: %s"),
buf);
return (mips_check_lsi_error (addr, rerrflg));
nfields = sscanf (buf, "0x%x %c 0x%x 0x%x",
&rpid, &rcmd, &rresponse, &rerrflg);
if (nfields != 4 || rcmd != cmd || rresponse > 255)
- mips_error ("mips_common_breakpoint: "
- "Bad response from remote board: %s",
+ mips_error (_("mips_common_breakpoint: "
+ "Bad response from remote board: %s"),
buf);
if (rerrflg != 0)
&rpid, &rcmd, &rerrflg, &rresponse);
if (nfields != 4 || rcmd != cmd)
- mips_error ("mips_common_breakpoint: "
- "Bad response from remote board: %s",
+ mips_error (_("mips_common_breakpoint: "
+ "Bad response from remote board: %s"),
buf);
if (rerrflg != 0)
if (rresponse != 22) /* invalid argument */
fprintf_unfiltered (gdb_stderr, "\
mips_common_breakpoint (%s): Got error: 0x%x\n",
- paddress (target_gdbarch, addr), rresponse);
+ paddress (target_gdbarch (), addr), rresponse);
return 1;
}
}
case 0x15: /* NACK */
fprintf_unfiltered (gdb_stderr,
"Download got a NACK at byte %s! Retrying.\n",
- paddress (target_gdbarch, addr));
+ paddress (target_gdbarch (), addr));
continue;
default:
- error (_("Download got unexpected ack char: 0x%x, retrying.\n"),
+ error (_("Download got unexpected ack char: 0x%x, retrying."),
ch);
}
}
unsigned int i;
unsigned int srec_frame = 200;
int reclen;
+ struct cleanup *cleanup;
static int hashmark = 1;
buffer = alloca (srec_frame * 2 + 256);
- abfd = bfd_openr (args, 0);
+ abfd = gdb_bfd_open (args, NULL, -1);
if (!abfd)
{
printf_filtered ("Unable to open file %s\n", args);
return;
}
+ cleanup = make_cleanup_bfd_unref (abfd);
if (bfd_check_format (abfd, bfd_object) == 0)
{
printf_filtered ("File is not an object file\n");
+ do_cleanups (cleanup);
return;
}
send_srec (srec, reclen, abfd->start_address);
serial_flush_input (mips_desc);
+ do_cleanups (cleanup);
}
/*
pmon_download (char *buffer, int length)
{
if (tftp_in_use)
- fwrite (buffer, 1, length, tftp_file);
+ {
+ size_t written;
+
+ written = fwrite (buffer, 1, length, tftp_file);
+ if (written < length)
+ perror_with_name (tftp_localname);
+ }
else
serial_write (udp_in_use ? udp_desc : mips_desc, buffer, length);
}
int bintotal = 0;
int final = 0;
int finished = 0;
+ struct cleanup *cleanup;
buffer = (char *) xmalloc (MAXRECSIZE + 1);
binbuf = (unsigned char *) xmalloc (BINCHUNK);
- abfd = bfd_openr (file, 0);
+ abfd = gdb_bfd_open (file, NULL, -1);
if (!abfd)
{
printf_filtered ("Unable to open file %s\n", file);
return;
}
+ cleanup = make_cleanup_bfd_unref (abfd);
if (bfd_check_format (abfd, bfd_object) == 0)
{
printf_filtered ("File is not an object file\n");
+ do_cleanups (cleanup);
return;
}
pmon_end_download (final, bintotal);
}
+ do_cleanups (cleanup);
return;
}