Index: gdb/remote-mips.c |
diff --git a/gdb/remote-mips.c b/gdb/remote-mips.c |
index babbf19407dc780368dc6d1274a4f99f57883c67..e4e508341cc34a27d828392fb847560abc9c7b64 100644 |
--- a/gdb/remote-mips.c |
+++ b/gdb/remote-mips.c |
@@ -1,6 +1,6 @@ |
/* Remote debugging interface for MIPS remote debugging protocol. |
- Copyright (C) 1993-2004, 2006-2012 Free Software Foundation, Inc. |
+ Copyright (C) 1993-2013 Free Software Foundation, Inc. |
Contributed by Cygnus Support. Written by Ian Lance Taylor |
<ian@cygnus.com>. |
@@ -29,13 +29,14 @@ |
#include "serial.h" |
#include "target.h" |
#include "exceptions.h" |
-#include "gdb_string.h" |
-#include "gdb_stat.h" |
+#include <string.h> |
+#include <sys/stat.h> |
#include "gdb_usleep.h" |
#include "regcache.h" |
#include <ctype.h> |
#include "mips-tdep.h" |
#include "gdbthread.h" |
+#include "gdb_bfd.h" |
/* Breakpoint types. Values 0, 1, and 2 must agree with the watch |
@@ -62,7 +63,7 @@ static int mips_receive_trailer (unsigned char *trlr, int *pgarbage, |
int *pch, int timeout); |
static int mips_cksum (const unsigned char *hdr, |
- const unsigned char *data, int len); |
+ const char *data, int len); |
static void mips_send_packet (const char *s, int get_ack); |
@@ -83,9 +84,7 @@ static void ddb_open (char *name, int from_tty); |
static void lsi_open (char *name, int from_tty); |
-static void mips_close (int quitting); |
- |
-static void mips_detach (struct target_ops *ops, char *args, int from_tty); |
+static void mips_close (void); |
static int mips_map_regno (struct gdbarch *, int); |
@@ -107,12 +106,12 @@ static void mips_files_info (struct target_ops *ignore); |
static void mips_mourn_inferior (struct target_ops *ops); |
-static int pmon_makeb64 (unsigned long v, char *p, int n, int *chksum); |
+static int pmon_makeb64 (unsigned long v, char *p, int n, unsigned int *chksum); |
-static int pmon_zeroset (int recsize, char **buff, int *amount, |
+static int pmon_zeroset (int recsize, char **buff, unsigned int *amount, |
unsigned int *chksum); |
-static int pmon_checkset (int recsize, char **buff, int *value); |
+static int pmon_checkset (int recsize, char **buff, unsigned int *value); |
static void pmon_make_fastrec (char **outbuf, unsigned char *inbuf, |
int *inptr, int inamount, int *recsize, |
@@ -487,17 +486,11 @@ static void ATTRIBUTE_NORETURN |
mips_error (char *string,...) |
{ |
va_list args; |
- |
- va_start (args, string); |
+ char *fmt; |
target_terminal_ours (); |
wrap_here (""); /* Force out any buffered output. */ |
gdb_flush (gdb_stdout); |
- if (error_pre_print) |
- fputs_filtered (error_pre_print, gdb_stderr); |
- vfprintf_filtered (gdb_stderr, string, args); |
- fprintf_filtered (gdb_stderr, "\n"); |
- va_end (args); |
gdb_flush (gdb_stderr); |
/* Clean up in such a way that mips_close won't try to talk to the |
@@ -505,11 +498,16 @@ mips_error (char *string,...) |
it). */ |
close_ports (); |
- printf_unfiltered ("Ending remote MIPS debugging.\n"); |
if (!ptid_equal (inferior_ptid, null_ptid)) |
target_mourn_inferior (); |
- deprecated_throw_reason (RETURN_ERROR); |
+ fmt = concat (_("Ending remote MIPS debugging: "), |
+ string, (char *) NULL); |
+ make_cleanup (xfree, fmt); |
+ |
+ va_start (args, string); |
+ throw_verror (TARGET_CLOSE_ERROR, fmt, args); |
+ va_end (args); |
} |
/* putc_readable - print a character, displaying non-printable chars in |
@@ -587,6 +585,7 @@ mips_expect_timeout (const char *string, int timeout) |
} |
immediate_quit++; |
+ QUIT; |
while (1) |
{ |
int c; |
@@ -822,12 +821,13 @@ mips_receive_trailer (unsigned char *trlr, int *pgarbage, |
} |
/* Get the checksum of a packet. HDR points to the packet header. |
- DATA points to the packet data. LEN is the length of DATA. */ |
+ DATASTR points to the packet data. LEN is the length of DATASTR. */ |
static int |
-mips_cksum (const unsigned char *hdr, const unsigned char *data, int len) |
+mips_cksum (const unsigned char *hdr, const char *datastr, int len) |
{ |
const unsigned char *p; |
+ const unsigned char *data = (const unsigned char *) datastr; |
int c; |
int cksum; |
@@ -870,7 +870,7 @@ mips_send_packet (const char *s, int get_ack) |
memcpy (packet + HDR_LENGTH, s, len); |
- cksum = mips_cksum (packet, packet + HDR_LENGTH, len); |
+ cksum = mips_cksum (packet, (char *) packet + HDR_LENGTH, len); |
packet[HDR_LENGTH + len + TRLR_INDX_CSUM1] = TRLR_SET_CSUM1 (cksum); |
packet[HDR_LENGTH + len + TRLR_INDX_CSUM2] = TRLR_SET_CSUM2 (cksum); |
packet[HDR_LENGTH + len + TRLR_INDX_CSUM3] = TRLR_SET_CSUM3 (cksum); |
@@ -974,8 +974,7 @@ mips_send_packet (const char *s, int get_ack) |
/* If the checksum does not match the trailer checksum, this |
is a bad packet; ignore it. */ |
- if (mips_cksum (hdr, (unsigned char *) NULL, 0) |
- != TRLR_GET_CKSUM (trlr)) |
+ if (mips_cksum (hdr, NULL, 0) != TRLR_GET_CKSUM (trlr)) |
continue; |
if (remote_debug > 0) |
@@ -1140,7 +1139,7 @@ mips_receive_packet (char *buff, int throw_error, int timeout) |
ack[HDR_INDX_LEN1] = HDR_SET_LEN1 (0, 0, mips_receive_seq); |
ack[HDR_INDX_SEQ] = HDR_SET_SEQ (0, 0, mips_receive_seq); |
- cksum = mips_cksum (ack, (unsigned char *) NULL, 0); |
+ cksum = mips_cksum (ack, NULL, 0); |
ack[HDR_LENGTH + TRLR_INDX_CSUM1] = TRLR_SET_CSUM1 (cksum); |
ack[HDR_LENGTH + TRLR_INDX_CSUM2] = TRLR_SET_CSUM2 (cksum); |
@@ -1181,7 +1180,7 @@ mips_receive_packet (char *buff, int throw_error, int timeout) |
ack[HDR_INDX_LEN1] = HDR_SET_LEN1 (0, 0, mips_receive_seq); |
ack[HDR_INDX_SEQ] = HDR_SET_SEQ (0, 0, mips_receive_seq); |
- cksum = mips_cksum (ack, (unsigned char *) NULL, 0); |
+ cksum = mips_cksum (ack, NULL, 0); |
ack[HDR_LENGTH + TRLR_INDX_CSUM1] = TRLR_SET_CSUM1 (cksum); |
ack[HDR_LENGTH + TRLR_INDX_CSUM2] = TRLR_SET_CSUM2 (cksum); |
@@ -1240,7 +1239,7 @@ mips_request (int cmd, |
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; |
@@ -1384,13 +1383,19 @@ mips_exit_debug (void) |
mips_request ('x', 0, 0, NULL, mips_receive_wait, NULL); |
mips_need_reply = 0; |
if (!mips_expect (" break!")) |
- return -1; |
+ { |
+ do_cleanups (old_cleanups); |
+ return -1; |
+ } |
} |
else |
mips_request ('x', 0, 0, &err, mips_receive_wait, NULL); |
if (!mips_expect (mips_monitor_prompt)) |
- return -1; |
+ { |
+ do_cleanups (old_cleanups); |
+ return -1; |
+ } |
do_cleanups (old_cleanups); |
@@ -1404,7 +1409,7 @@ static void |
mips_initialize (void) |
{ |
int err; |
- struct cleanup *old_cleanups = make_cleanup (mips_initialize_cleanups, NULL); |
+ struct cleanup *old_cleanups; |
int j; |
/* What is this code doing here? I don't see any way it can happen, and |
@@ -1417,6 +1422,8 @@ mips_initialize (void) |
return; |
} |
+ old_cleanups = make_cleanup (mips_initialize_cleanups, NULL); |
+ |
mips_wait_flag = 0; |
mips_initializing = 1; |
@@ -1541,6 +1548,7 @@ common_open (struct target_ops *ops, char *name, int from_tty, |
char *remote_name = 0; |
char *local_name = 0; |
char **argv; |
+ struct cleanup *cleanup; |
if (name == 0) |
error (_("\ |
@@ -1556,7 +1564,7 @@ seen from the board via TFTP, specify that name as the third parameter.\n")); |
/* Parse the serial port name, the optional TFTP name, and the |
optional local TFTP name. */ |
argv = gdb_buildargv (name); |
- make_cleanup_freeargv (argv); |
+ cleanup = make_cleanup_freeargv (argv); |
serial_port_name = xstrdup (argv[0]); |
if (argv[1]) /* Remote TFTP name specified? */ |
@@ -1651,8 +1659,10 @@ seen from the board via TFTP, specify that name as the third parameter.\n")); |
reinit_frame_cache (); |
registers_changed (); |
stop_pc = regcache_read_pc (get_current_regcache ()); |
- print_stack_frame (get_selected_frame (NULL), 0, SRC_AND_LOC); |
+ print_stack_frame (get_selected_frame (NULL), 0, SRC_AND_LOC, 1); |
xfree (serial_port_name); |
+ |
+ do_cleanups (cleanup); |
} |
/* Open a connection to an IDT board. */ |
@@ -1661,10 +1671,10 @@ static void |
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: |
@@ -1721,7 +1731,7 @@ lsi_open (char *name, int from_tty) |
/* Close a connection to the remote board. */ |
static void |
-mips_close (int quitting) |
+mips_close (void) |
{ |
if (mips_is_open) |
{ |
@@ -1737,14 +1747,12 @@ mips_close (int quitting) |
/* Detach from the remote board. */ |
static void |
-mips_detach (struct target_ops *ops, char *args, int from_tty) |
+mips_detach (struct target_ops *ops, const char *args, int from_tty) |
{ |
if (args) |
error (_("Argument given to \"detach\" when remotely debugging.")); |
- pop_target (); |
- |
- mips_close (1); |
+ unpush_target (ops); |
if (from_tty) |
printf_unfiltered ("Ending remote MIPS debugging.\n"); |
@@ -1792,7 +1800,7 @@ mips_signal_from_protocol (int sig) |
static void |
mips_set_register (int regno, ULONGEST value) |
{ |
- char buf[MAX_REGISTER_SIZE]; |
+ gdb_byte buf[MAX_REGISTER_SIZE]; |
struct regcache *regcache = get_current_regcache (); |
struct gdbarch *gdbarch = get_regcache_arch (regcache); |
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); |
@@ -2145,11 +2153,11 @@ static int |
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; |
- char *buffer; |
+ gdb_byte *buffer; |
int status; |
/* PMON targets do not cope well with 64 bit addresses. Mask the |
@@ -2280,8 +2288,7 @@ Give up (and stop debugging it)? "))) |
printf_unfiltered ("Ending remote MIPS debugging.\n"); |
target_mourn_inferior (); |
- |
- deprecated_throw_reason (RETURN_QUIT); |
+ quit (); |
} |
target_terminal_inferior (); |
@@ -2477,7 +2484,7 @@ static int |
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; |
@@ -2545,13 +2552,13 @@ mips_common_breakpoint (%s): Unknown error: 0x%x\n", |
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) |
{ |
@@ -2579,7 +2586,7 @@ mips_common_breakpoint (int set, CORE_ADDR addr, int len, enum break_type type) |
{ |
warning (_("\ |
mips_common_breakpoint: Attempt to clear bogus breakpoint at %s"), |
- paddress (target_gdbarch, addr)); |
+ paddress (target_gdbarch (), addr)); |
return 1; |
} |
@@ -2730,7 +2737,7 @@ mips_common_breakpoint: Attempt to clear bogus breakpoint at %s"), |
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; |
} |
} |
@@ -2763,7 +2770,7 @@ send_srec (char *srec, int len, CORE_ADDR addr) |
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."), |
@@ -2779,24 +2786,28 @@ mips_load_srec (char *args) |
{ |
bfd *abfd; |
asection *s; |
- char *buffer, srec[1024]; |
+ char srec[1024]; |
+ bfd_byte *buffer; |
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; |
} |
@@ -2850,6 +2861,7 @@ mips_load_srec (char *args) |
send_srec (srec, reclen, abfd->start_address); |
serial_flush_input (mips_desc); |
+ do_cleanups (cleanup); |
} |
/* |
@@ -2968,7 +2980,7 @@ static char encoding[] = |
characters written into the buffer. */ |
static int |
-pmon_makeb64 (unsigned long v, char *p, int n, int *chksum) |
+pmon_makeb64 (unsigned long v, char *p, int n, unsigned int *chksum) |
{ |
int count = (n / 6); |
@@ -3016,7 +3028,8 @@ pmon_makeb64 (unsigned long v, char *p, int n, int *chksum) |
escape sequence into the data stream. */ |
static int |
-pmon_zeroset (int recsize, char **buff, int *amount, unsigned int *chksum) |
+pmon_zeroset (int recsize, char **buff, |
+ unsigned int *amount, unsigned int *chksum) |
{ |
int count; |
@@ -3042,7 +3055,7 @@ pmon_zeroset (int recsize, char **buff, int *amount, unsigned int *chksum) |
the record elements added by this call. */ |
static int |
-pmon_checkset (int recsize, char **buff, int *value) |
+pmon_checkset (int recsize, char **buff, unsigned int *value) |
{ |
int count; |
@@ -3366,20 +3379,23 @@ pmon_load_fast (char *file) |
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; |
} |
@@ -3503,6 +3519,7 @@ pmon_load_fast (char *file) |
pmon_end_download (final, bintotal); |
} |
+ do_cleanups (cleanup); |
return; |
} |