X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gdb%2Fremote-mips.c;h=1ce6c172f8dac8d30c2eecf5617e6423898eb664;hb=720a66cfb68d5d7d8f2e18e9b44c346ac630c68b;hp=3b65b59f124c554c210e8fbe8f7f78a444464b3c;hpb=ce6ec7d8d0bdec44a432131dfacc27917965f29f;p=platform%2Fupstream%2Fbinutils.git diff --git a/gdb/remote-mips.c b/gdb/remote-mips.c index 3b65b59..1ce6c17 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-2013 Free Software Foundation, Inc. + Copyright (C) 1993-2014 Free Software Foundation, Inc. Contributed by Cygnus Support. Written by Ian Lance Taylor . @@ -22,15 +22,14 @@ #include "defs.h" #include "inferior.h" +#include "infrun.h" #include "bfd.h" #include "symfile.h" #include "gdbcmd.h" #include "gdbcore.h" #include "serial.h" #include "target.h" -#include "exceptions.h" -#include "gdb_string.h" -#include "gdb_stat.h" +#include #include "gdb_usleep.h" #include "regcache.h" #include @@ -76,33 +75,25 @@ static ULONGEST mips_request (int cmd, ULONGEST addr, ULONGEST data, static void mips_initialize (void); -static void mips_open (char *name, int from_tty); - -static void pmon_open (char *name, int from_tty); - -static void ddb_open (char *name, int from_tty); - -static void lsi_open (char *name, int from_tty); - -static void mips_close (void); - -static void mips_detach (struct target_ops *ops, char *args, int from_tty); +static void mips_close (struct target_ops *self); static int mips_map_regno (struct gdbarch *, int); static void mips_set_register (int regno, ULONGEST value); -static void mips_prepare_to_store (struct regcache *regcache); +static void mips_prepare_to_store (struct target_ops *self, + struct regcache *regcache); static int mips_fetch_word (CORE_ADDR addr, unsigned int *valp); static int mips_store_word (CORE_ADDR addr, unsigned int value, int *old_contents); -static int mips_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, - int write, - struct mem_attrib *attrib, - struct target_ops *target); +static enum target_xfer_status mips_xfer_memory (gdb_byte *readbuf, + const gdb_byte *writebuf, + ULONGEST memaddr, + ULONGEST len, + ULONGEST *xfered_len); static void mips_files_info (struct target_ops *ignore); @@ -127,9 +118,7 @@ static void pmon_end_download (int final, int bintotal); static void pmon_download (char *buffer, int length); -static void pmon_load_fast (char *file); - -static void mips_load (char *file, int from_tty); +static void mips_load (struct target_ops *self, const char *file, int from_tty); static int mips_make_srec (char *buffer, int type, CORE_ADDR memaddr, unsigned char *myaddr, int len); @@ -488,17 +477,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 @@ -506,11 +489,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 @@ -1386,13 +1374,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); @@ -1406,7 +1400,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 @@ -1419,6 +1413,8 @@ mips_initialize (void) return; } + old_cleanups = make_cleanup (mips_initialize_cleanups, NULL); + mips_wait_flag = 0; mips_initializing = 1; @@ -1535,7 +1531,7 @@ mips_initialize (void) /* Open a connection to the remote board. */ static void -common_open (struct target_ops *ops, char *name, int from_tty, +common_open (struct target_ops *ops, const char *name, int from_tty, enum mips_monitor_type new_monitor, const char *new_monitor_prompt) { @@ -1543,6 +1539,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 (_("\ @@ -1558,7 +1555,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? */ @@ -1653,14 +1650,16 @@ 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. */ static void -mips_open (char *name, int from_tty) +mips_open (const char *name, int from_tty) { const char *monitor_prompt = NULL; if (gdbarch_bfd_arch_info (target_gdbarch ()) != NULL @@ -1685,7 +1684,7 @@ mips_open (char *name, int from_tty) /* Open a connection to a PMON board. */ static void -pmon_open (char *name, int from_tty) +pmon_open (const char *name, int from_tty) { common_open (&pmon_ops, name, from_tty, MON_PMON, "PMON> "); } @@ -1693,7 +1692,7 @@ pmon_open (char *name, int from_tty) /* Open a connection to a DDB board. */ static void -ddb_open (char *name, int from_tty) +ddb_open (const char *name, int from_tty) { common_open (&ddb_ops, name, from_tty, MON_DDB, "NEC010>"); } @@ -1701,7 +1700,7 @@ ddb_open (char *name, int from_tty) /* Open a connection to a rockhopper board. */ static void -rockhopper_open (char *name, int from_tty) +rockhopper_open (const char *name, int from_tty) { common_open (&rockhopper_ops, name, from_tty, MON_ROCKHOPPER, "NEC01>"); } @@ -1709,7 +1708,7 @@ rockhopper_open (char *name, int from_tty) /* Open a connection to an LSI board. */ static void -lsi_open (char *name, int from_tty) +lsi_open (const char *name, int from_tty) { int i; @@ -1723,7 +1722,7 @@ lsi_open (char *name, int from_tty) /* Close a connection to the remote board. */ static void -mips_close (void) +mips_close (struct target_ops *self) { if (mips_is_open) { @@ -1739,14 +1738,12 @@ mips_close (void) /* 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 (); + unpush_target (ops); if (from_tty) printf_unfiltered ("Ending remote MIPS debugging.\n"); @@ -2058,7 +2055,7 @@ mips_fetch_registers (struct target_ops *ops, registers, so this function doesn't have to do anything. */ static void -mips_prepare_to_store (struct regcache *regcache) +mips_prepare_to_store (struct target_ops *self, struct regcache *regcache) { } @@ -2134,18 +2131,17 @@ mips_store_word (CORE_ADDR addr, unsigned int val, int *old_contents) return 0; } -/* Read or write LEN bytes from inferior memory at MEMADDR, - transferring to or from debugger address MYADDR. Write to inferior - if SHOULD_WRITE is nonzero. Returns length of data written or - read; 0 for error. Note that protocol gives us the correct value - for a longword, since it transfers values in ASCII. We want the - byte values, so we have to swap the longword values. */ +/* Helper for mips_xfer_partial that handles memory transfers. + Arguments are like target_xfer_partial. Note that the protocol + gives us the correct value for a longword, since it transfers + values in ASCII. We want the byte values, so we have to swap the + longword values. */ static int mask_address_p = 1; -static int -mips_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write, - struct mem_attrib *attrib, struct target_ops *target) +static enum target_xfer_status +mips_xfer_memory (gdb_byte *readbuf, const gdb_byte *writebuf, + ULONGEST memaddr, ULONGEST len, ULONGEST *xfered_len) { enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ()); int i; @@ -2166,7 +2162,7 @@ mips_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write, /* Allocate buffer of that many longwords. */ buffer = alloca (count * 4); - if (write) + if (writebuf != NULL) { /* Fill start and end extra bytes of buffer with existing data. */ if (addr != memaddr || len < 4) @@ -2174,7 +2170,7 @@ mips_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write, unsigned int val; if (mips_fetch_word (addr, &val)) - return 0; + return TARGET_XFER_E_IO; /* Need part of initial word -- fetch it. */ store_unsigned_integer (&buffer[0], 4, byte_order, val); @@ -2187,7 +2183,7 @@ mips_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write, /* Need part of last word -- fetch it. FIXME: we do this even if we don't need it. */ if (mips_fetch_word (addr + (count - 1) * 4, &val)) - return 0; + return TARGET_XFER_E_IO; store_unsigned_integer (&buffer[(count - 1) * 4], 4, byte_order, val); @@ -2195,7 +2191,7 @@ mips_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write, /* Copy data to be written over corresponding part of buffer. */ - memcpy ((char *) buffer + (memaddr & 3), myaddr, len); + memcpy ((char *) buffer + (memaddr & 3), writebuf, len); /* Write the entire buffer. */ @@ -2212,10 +2208,7 @@ mips_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write, gdb_flush (gdb_stdout); } if (status) - { - errno = status; - return 0; - } + return TARGET_XFER_E_IO; /* FIXME: Do we want a QUIT here? */ } if (count >= 256) @@ -2229,16 +2222,37 @@ mips_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write, unsigned int val; if (mips_fetch_word (addr, &val)) - return 0; + return TARGET_XFER_E_IO; store_unsigned_integer (&buffer[i * 4], 4, byte_order, val); QUIT; } /* Copy appropriate bytes out of the buffer. */ - memcpy (myaddr, buffer + (memaddr & 3), len); + memcpy (readbuf, buffer + (memaddr & 3), len); + } + *xfered_len = len; + return TARGET_XFER_OK; +} + +/* Target to_xfer_partial implementation. */ + +static enum target_xfer_status +mips_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 mips_xfer_memory (readbuf, writebuf, offset, len, xfered_len); + + default: + return ops->beneath->to_xfer_partial (ops->beneath, object, annex, + readbuf, writebuf, offset, len, + xfered_len); } - return len; } /* Print info on this target. */ @@ -2282,8 +2296,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 (); @@ -2357,27 +2370,30 @@ mips_mourn_inferior (struct target_ops *ops) target contents. */ static int -mips_insert_breakpoint (struct gdbarch *gdbarch, +mips_insert_breakpoint (struct target_ops *ops, struct gdbarch *gdbarch, struct bp_target_info *bp_tgt) { if (monitor_supports_breakpoints) - return mips_set_breakpoint (bp_tgt->placed_address, MIPS_INSN32_SIZE, - BREAK_FETCH); + { + bp_tgt->placed_address = bp_tgt->reqstd_address; + return mips_set_breakpoint (bp_tgt->placed_address, MIPS_INSN32_SIZE, + BREAK_FETCH); + } else - return memory_insert_breakpoint (gdbarch, bp_tgt); + return memory_insert_breakpoint (ops, gdbarch, bp_tgt); } /* Remove a breakpoint. */ static int -mips_remove_breakpoint (struct gdbarch *gdbarch, +mips_remove_breakpoint (struct target_ops *ops, struct gdbarch *gdbarch, struct bp_target_info *bp_tgt) { if (monitor_supports_breakpoints) return mips_clear_breakpoint (bp_tgt->placed_address, MIPS_INSN32_SIZE, BREAK_FETCH); else - return memory_remove_breakpoint (gdbarch, bp_tgt); + return memory_remove_breakpoint (ops, gdbarch, bp_tgt); } /* Tell whether this target can support a hardware breakpoint. CNT @@ -2385,7 +2401,8 @@ mips_remove_breakpoint (struct gdbarch *gdbarch, implements the target_can_use_hardware_watchpoint macro. */ static int -mips_can_use_watchpoint (int type, int cnt, int othertype) +mips_can_use_watchpoint (struct target_ops *self, + int type, int cnt, int othertype) { return cnt < MAX_LSI_BREAKPOINTS && strcmp (target_shortname, "lsi") == 0; } @@ -2419,7 +2436,8 @@ calculate_mask (CORE_ADDR addr, int len) watchpoint. */ static int -mips_insert_watchpoint (CORE_ADDR addr, int len, int type, +mips_insert_watchpoint (struct target_ops *self, + CORE_ADDR addr, int len, int type, struct expression *cond) { if (mips_set_breakpoint (addr, len, type)) @@ -2431,7 +2449,8 @@ mips_insert_watchpoint (CORE_ADDR addr, int len, int type, /* Remove a watchpoint. */ static int -mips_remove_watchpoint (CORE_ADDR addr, int len, int type, +mips_remove_watchpoint (struct target_ops *self, + CORE_ADDR addr, int len, int type, struct expression *cond) { if (mips_clear_breakpoint (addr, len, type)) @@ -2444,7 +2463,7 @@ mips_remove_watchpoint (CORE_ADDR addr, int len, int type, if not. */ static int -mips_stopped_by_watchpoint (void) +mips_stopped_by_watchpoint (struct target_ops *ops) { return hit_watchpoint; } @@ -2777,7 +2796,7 @@ send_srec (char *srec, int len, CORE_ADDR addr) /* Download a binary file by converting it to S records. */ static void -mips_load_srec (char *args) +mips_load_srec (const char *args) { bfd *abfd; asection *s; @@ -3362,7 +3381,7 @@ pmon_download (char *buffer, int length) using the FastLoad format. */ static void -pmon_load_fast (char *file) +pmon_load_fast (const char *file) { bfd *abfd; asection *s; @@ -3521,7 +3540,7 @@ pmon_load_fast (char *file) /* mips_load -- download a file. */ static void -mips_load (char *file, int from_tty) +mips_load (struct target_ops *self, const char *file, int from_tty) { struct regcache *regcache; @@ -3614,7 +3633,7 @@ _initialize_remote_mips (void) mips_ops.to_fetch_registers = mips_fetch_registers; mips_ops.to_store_registers = mips_store_registers; mips_ops.to_prepare_to_store = mips_prepare_to_store; - mips_ops.deprecated_xfer_memory = mips_xfer_memory; + mips_ops.to_xfer_partial = mips_xfer_partial; mips_ops.to_files_info = mips_files_info; mips_ops.to_insert_breakpoint = mips_insert_breakpoint; mips_ops.to_remove_breakpoint = mips_remove_breakpoint;