gdb/target.c - gdb
Global variables defined
Data types defined
Functions defined
Macros defined
Source code
- #include "defs.h"
- #include "target.h"
- #include "target-dcache.h"
- #include "gdbcmd.h"
- #include "symtab.h"
- #include "inferior.h"
- #include "infrun.h"
- #include "bfd.h"
- #include "symfile.h"
- #include "objfiles.h"
- #include "dcache.h"
- #include <signal.h>
- #include "regcache.h"
- #include "gdbcore.h"
- #include "target-descriptions.h"
- #include "gdbthread.h"
- #include "solib.h"
- #include "exec.h"
- #include "inline-frame.h"
- #include "tracepoint.h"
- #include "gdb/fileio.h"
- #include "agent.h"
- #include "auxv.h"
- #include "target-debug.h"
- static void target_info (char *, int);
- static void generic_tls_error (void) ATTRIBUTE_NORETURN;
- static void default_terminal_info (struct target_ops *, const char *, int);
- static int default_watchpoint_addr_within_range (struct target_ops *,
- CORE_ADDR, CORE_ADDR, int);
- static int default_region_ok_for_hw_watchpoint (struct target_ops *,
- CORE_ADDR, int);
- static void default_rcmd (struct target_ops *, const char *, struct ui_file *);
- static ptid_t default_get_ada_task_ptid (struct target_ops *self,
- long lwp, long tid);
- static int default_follow_fork (struct target_ops *self, int follow_child,
- int detach_fork);
- static void default_mourn_inferior (struct target_ops *self);
- static int default_search_memory (struct target_ops *ops,
- CORE_ADDR start_addr,
- ULONGEST search_space_len,
- const gdb_byte *pattern,
- ULONGEST pattern_len,
- CORE_ADDR *found_addrp);
- static int default_verify_memory (struct target_ops *self,
- const gdb_byte *data,
- CORE_ADDR memaddr, ULONGEST size);
- static struct address_space *default_thread_address_space
- (struct target_ops *self, ptid_t ptid);
- static void tcomplain (void) ATTRIBUTE_NORETURN;
- static int return_zero (struct target_ops *);
- static int return_zero_has_execution (struct target_ops *, ptid_t);
- static void target_command (char *, int);
- static struct target_ops *find_default_run_target (char *);
- static struct gdbarch *default_thread_architecture (struct target_ops *ops,
- ptid_t ptid);
- static int dummy_find_memory_regions (struct target_ops *self,
- find_memory_region_ftype ignore1,
- void *ignore2);
- static char *dummy_make_corefile_notes (struct target_ops *self,
- bfd *ignore1, int *ignore2);
- static char *default_pid_to_str (struct target_ops *ops, ptid_t ptid);
- static enum exec_direction_kind default_execution_direction
- (struct target_ops *self);
- static CORE_ADDR default_target_decr_pc_after_break (struct target_ops *ops,
- struct gdbarch *gdbarch);
- static struct target_ops debug_target;
- #include "target-delegates.c"
- static void init_dummy_target (void);
- static void update_current_target (void);
- typedef struct target_ops *target_ops_p;
- DEF_VEC_P (target_ops_p);
- static VEC (target_ops_p) *target_structs;
- static struct target_ops dummy_target;
- static struct target_ops *target_stack;
- struct target_ops current_target;
- static struct cmd_list_element *targetlist = NULL;
- static int trust_readonly = 0;
- static int show_memory_breakpoints = 0;
- int may_write_registers = 1;
- int may_write_memory = 1;
- int may_insert_breakpoints = 1;
- int may_insert_tracepoints = 1;
- int may_insert_fast_tracepoints = 1;
- int may_stop = 1;
- static unsigned int targetdebug = 0;
- static void
- set_targetdebug (char *args, int from_tty, struct cmd_list_element *c)
- {
- update_current_target ();
- }
- static void
- show_targetdebug (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
- {
- fprintf_filtered (file, _("Target debugging is %s.\n"), value);
- }
- static void setup_target_debug (void);
- static void
- target_command (char *arg, int from_tty)
- {
- fputs_filtered ("Argument required (target name). Try `help target'\n",
- gdb_stdout);
- }
- int
- default_child_has_all_memory (struct target_ops *ops)
- {
-
- if (ptid_equal (inferior_ptid, null_ptid))
- return 0;
- return 1;
- }
- int
- default_child_has_memory (struct target_ops *ops)
- {
-
- if (ptid_equal (inferior_ptid, null_ptid))
- return 0;
- return 1;
- }
- int
- default_child_has_stack (struct target_ops *ops)
- {
-
- if (ptid_equal (inferior_ptid, null_ptid))
- return 0;
- return 1;
- }
- int
- default_child_has_registers (struct target_ops *ops)
- {
-
- if (ptid_equal (inferior_ptid, null_ptid))
- return 0;
- return 1;
- }
- int
- default_child_has_execution (struct target_ops *ops, ptid_t the_ptid)
- {
-
- if (ptid_equal (the_ptid, null_ptid))
- return 0;
- return 1;
- }
- int
- target_has_all_memory_1 (void)
- {
- struct target_ops *t;
- for (t = current_target.beneath; t != NULL; t = t->beneath)
- if (t->to_has_all_memory (t))
- return 1;
- return 0;
- }
- int
- target_has_memory_1 (void)
- {
- struct target_ops *t;
- for (t = current_target.beneath; t != NULL; t = t->beneath)
- if (t->to_has_memory (t))
- return 1;
- return 0;
- }
- int
- target_has_stack_1 (void)
- {
- struct target_ops *t;
- for (t = current_target.beneath; t != NULL; t = t->beneath)
- if (t->to_has_stack (t))
- return 1;
- return 0;
- }
- int
- target_has_registers_1 (void)
- {
- struct target_ops *t;
- for (t = current_target.beneath; t != NULL; t = t->beneath)
- if (t->to_has_registers (t))
- return 1;
- return 0;
- }
- int
- target_has_execution_1 (ptid_t the_ptid)
- {
- struct target_ops *t;
- for (t = current_target.beneath; t != NULL; t = t->beneath)
- if (t->to_has_execution (t, the_ptid))
- return 1;
- return 0;
- }
- int
- target_has_execution_current (void)
- {
- return target_has_execution_1 (inferior_ptid);
- }
- void
- complete_target_initialization (struct target_ops *t)
- {
-
- if (t->to_has_all_memory == NULL)
- t->to_has_all_memory = return_zero;
- if (t->to_has_memory == NULL)
- t->to_has_memory = return_zero;
- if (t->to_has_stack == NULL)
- t->to_has_stack = return_zero;
- if (t->to_has_registers == NULL)
- t->to_has_registers = return_zero;
- if (t->to_has_execution == NULL)
- t->to_has_execution = return_zero_has_execution;
-
- gdb_assert (t->to_can_run == NULL || (t->to_can_async_p != NULL
- && t->to_supports_non_stop != NULL));
- install_delegators (t);
- }
- static void
- open_target (char *args, int from_tty, struct cmd_list_element *command)
- {
- struct target_ops *ops = get_cmd_context (command);
- if (targetdebug)
- fprintf_unfiltered (gdb_stdlog, "-> %s->to_open (...)\n",
- ops->to_shortname);
- ops->to_open (args, from_tty);
- if (targetdebug)
- fprintf_unfiltered (gdb_stdlog, "<- %s->to_open (%s, %d)\n",
- ops->to_shortname, args, from_tty);
- }
- void
- add_target_with_completer (struct target_ops *t,
- completer_ftype *completer)
- {
- struct cmd_list_element *c;
- complete_target_initialization (t);
- VEC_safe_push (target_ops_p, target_structs, t);
- if (targetlist == NULL)
- add_prefix_cmd ("target", class_run, target_command, _("\
- Connect to a target machine or process.\n\
- The first argument is the type or protocol of the target machine.\n\
- Remaining arguments are interpreted by the target protocol. For more\n\
- information on the arguments for a particular protocol, type\n\
- `help target ' followed by the protocol name."),
- &targetlist, "target ", 0, &cmdlist);
- c = add_cmd (t->to_shortname, no_class, NULL, t->to_doc, &targetlist);
- set_cmd_sfunc (c, open_target);
- set_cmd_context (c, t);
- if (completer != NULL)
- set_cmd_completer (c, completer);
- }
- void
- add_target (struct target_ops *t)
- {
- add_target_with_completer (t, NULL);
- }
- void
- add_deprecated_target_alias (struct target_ops *t, char *alias)
- {
- struct cmd_list_element *c;
- char *alt;
-
- c = add_cmd (alias, no_class, NULL, t->to_doc, &targetlist);
- set_cmd_sfunc (c, open_target);
- set_cmd_context (c, t);
- alt = xstrprintf ("target %s", t->to_shortname);
- deprecate_cmd (c, alt);
- }
- void
- target_kill (void)
- {
- current_target.to_kill (¤t_target);
- }
- void
- target_load (const char *arg, int from_tty)
- {
- target_dcache_invalidate ();
- (*current_target.to_load) (¤t_target, arg, from_tty);
- }
- enum terminal_state
- {
-
- terminal_is_inferior = 0,
-
- terminal_is_ours_for_output = 1,
-
- terminal_is_ours = 2
- };
- static enum terminal_state terminal_state;
- void
- target_terminal_init (void)
- {
- (*current_target.to_terminal_init) (¤t_target);
- terminal_state = terminal_is_ours;
- }
- int
- target_terminal_is_inferior (void)
- {
- return (terminal_state == terminal_is_inferior);
- }
- void
- target_terminal_inferior (void)
- {
-
- if (target_can_async_p () && !sync_execution)
- return;
- if (terminal_state == terminal_is_inferior)
- return;
-
- (*current_target.to_terminal_inferior) (¤t_target);
- terminal_state = terminal_is_inferior;
- }
- void
- target_terminal_ours (void)
- {
- if (terminal_state == terminal_is_ours)
- return;
- (*current_target.to_terminal_ours) (¤t_target);
- terminal_state = terminal_is_ours;
- }
- void
- target_terminal_ours_for_output (void)
- {
- if (terminal_state != terminal_is_inferior)
- return;
- (*current_target.to_terminal_ours_for_output) (¤t_target);
- terminal_state = terminal_is_ours_for_output;
- }
- int
- target_supports_terminal_ours (void)
- {
- struct target_ops *t;
- for (t = current_target.beneath; t != NULL; t = t->beneath)
- {
- if (t->to_terminal_ours != delegate_terminal_ours
- && t->to_terminal_ours != tdefault_terminal_ours)
- return 1;
- }
- return 0;
- }
- static void
- cleanup_restore_target_terminal (void *arg)
- {
- enum terminal_state *previous_state = arg;
- switch (*previous_state)
- {
- case terminal_is_ours:
- target_terminal_ours ();
- break;
- case terminal_is_ours_for_output:
- target_terminal_ours_for_output ();
- break;
- case terminal_is_inferior:
- target_terminal_inferior ();
- break;
- }
- }
- struct cleanup *
- make_cleanup_restore_target_terminal (void)
- {
- enum terminal_state *ts = xmalloc (sizeof (*ts));
- *ts = terminal_state;
- return make_cleanup_dtor (cleanup_restore_target_terminal, ts, xfree);
- }
- static void
- tcomplain (void)
- {
- error (_("You can't do that when your target is `%s'"),
- current_target.to_shortname);
- }
- void
- noprocess (void)
- {
- error (_("You can't do that without a process to debug."));
- }
- static void
- default_terminal_info (struct target_ops *self, const char *args, int from_tty)
- {
- printf_unfiltered (_("No saved terminal information.\n"));
- }
- static ptid_t
- default_get_ada_task_ptid (struct target_ops *self, long lwp, long tid)
- {
- return ptid_build (ptid_get_pid (inferior_ptid), lwp, tid);
- }
- static enum exec_direction_kind
- default_execution_direction (struct target_ops *self)
- {
- if (!target_can_execute_reverse)
- return EXEC_FORWARD;
- else if (!target_can_async_p ())
- return EXEC_FORWARD;
- else
- gdb_assert_not_reached ("\
- to_execution_direction must be implemented for reverse async");
- }
- static void
- update_current_target (void)
- {
- struct target_ops *t;
-
- memset (¤t_target, 0, sizeof (current_target));
-
- install_delegators (¤t_target);
- current_target.to_stratum = target_stack->to_stratum;
- #define INHERIT(FIELD, TARGET) \
- if (!current_target.FIELD) \
- current_target.FIELD = (TARGET)->FIELD
-
- for (t = target_stack; t; t = t->beneath)
- {
- INHERIT (to_shortname, t);
- INHERIT (to_longname, t);
- INHERIT (to_attach_no_wait, t);
- INHERIT (to_have_steppable_watchpoint, t);
- INHERIT (to_have_continuable_watchpoint, t);
- INHERIT (to_has_thread_control, t);
- }
- #undef INHERIT
-
- current_target.beneath = target_stack;
- if (targetdebug)
- setup_target_debug ();
- }
- void
- push_target (struct target_ops *t)
- {
- struct target_ops **cur;
-
- if (t->to_magic != OPS_MAGIC)
- {
- fprintf_unfiltered (gdb_stderr,
- "Magic number of %s target struct wrong\n",
- t->to_shortname);
- internal_error (__FILE__, __LINE__,
- _("failed internal consistency check"));
- }
-
- for (cur = &target_stack; (*cur) != NULL; cur = &(*cur)->beneath)
- {
- if ((int) (t->to_stratum) >= (int) (*cur)->to_stratum)
- break;
- }
-
- FIXME
- while ((*cur) != NULL && t->to_stratum == (*cur)->to_stratum)
- {
-
- struct target_ops *tmp = (*cur);
- (*cur) = (*cur)->beneath;
- tmp->beneath = NULL;
- target_close (tmp);
- }
-
- t->beneath = (*cur);
- (*cur) = t;
- update_current_target ();
- }
- int
- unpush_target (struct target_ops *t)
- {
- struct target_ops **cur;
- struct target_ops *tmp;
- if (t->to_stratum == dummy_stratum)
- internal_error (__FILE__, __LINE__,
- _("Attempt to unpush the dummy target"));
-
- for (cur = &target_stack; (*cur) != NULL; cur = &(*cur)->beneath)
- {
- if ((*cur) == t)
- break;
- }
-
- if ((*cur) == NULL)
- return 0;
-
- tmp = (*cur);
- (*cur) = (*cur)->beneath;
- tmp->beneath = NULL;
- update_current_target ();
-
- target_close (t);
- return 1;
- }
- void
- pop_all_targets_above (enum strata above_stratum)
- {
- while ((int) (current_target.to_stratum) > (int) above_stratum)
- {
- if (!unpush_target (target_stack))
- {
- fprintf_unfiltered (gdb_stderr,
- "pop_all_targets couldn't find target %s\n",
- target_stack->to_shortname);
- internal_error (__FILE__, __LINE__,
- _("failed internal consistency check"));
- break;
- }
- }
- }
- void
- pop_all_targets (void)
- {
- pop_all_targets_above (dummy_stratum);
- }
- int
- target_is_pushed (struct target_ops *t)
- {
- struct target_ops *cur;
-
- if (t->to_magic != OPS_MAGIC)
- {
- fprintf_unfiltered (gdb_stderr,
- "Magic number of %s target struct wrong\n",
- t->to_shortname);
- internal_error (__FILE__, __LINE__,
- _("failed internal consistency check"));
- }
- for (cur = target_stack; cur != NULL; cur = cur->beneath)
- if (cur == t)
- return 1;
- return 0;
- }
- static void
- generic_tls_error (void)
- {
- throw_error (TLS_GENERIC_ERROR,
- _("Cannot find thread-local variables on this target"));
- }
- CORE_ADDR
- target_translate_tls_address (struct objfile *objfile, CORE_ADDR offset)
- {
- volatile CORE_ADDR addr = 0;
- struct target_ops *target = ¤t_target;
- if (gdbarch_fetch_tls_load_module_address_p (target_gdbarch ()))
- {
- ptid_t ptid = inferior_ptid;
- volatile struct gdb_exception ex;
- TRY_CATCH (ex, RETURN_MASK_ALL)
- {
- CORE_ADDR lm_addr;
-
- lm_addr = gdbarch_fetch_tls_load_module_address (target_gdbarch (),
- objfile);
- addr = target->to_get_thread_local_address (target, ptid,
- lm_addr, offset);
- }
-
- if (ex.reason < 0)
- {
- int objfile_is_library = (objfile->flags & OBJF_SHARED);
- switch (ex.error)
- {
- case TLS_NO_LIBRARY_SUPPORT_ERROR:
- error (_("Cannot find thread-local variables "
- "in this thread library."));
- break;
- case TLS_LOAD_MODULE_NOT_FOUND_ERROR:
- if (objfile_is_library)
- error (_("Cannot find shared library `%s' in dynamic"
- " linker's load module list"), objfile_name (objfile));
- else
- error (_("Cannot find executable file `%s' in dynamic"
- " linker's load module list"), objfile_name (objfile));
- break;
- case TLS_NOT_ALLOCATED_YET_ERROR:
- if (objfile_is_library)
- error (_("The inferior has not yet allocated storage for"
- " thread-local variables in\n"
- "the shared library `%s'\n"
- "for %s"),
- objfile_name (objfile), target_pid_to_str (ptid));
- else
- error (_("The inferior has not yet allocated storage for"
- " thread-local variables in\n"
- "the executable `%s'\n"
- "for %s"),
- objfile_name (objfile), target_pid_to_str (ptid));
- break;
- case TLS_GENERIC_ERROR:
- if (objfile_is_library)
- error (_("Cannot find thread-local storage for %s, "
- "shared library %s:\n%s"),
- target_pid_to_str (ptid),
- objfile_name (objfile), ex.message);
- else
- error (_("Cannot find thread-local storage for %s, "
- "executable file %s:\n%s"),
- target_pid_to_str (ptid),
- objfile_name (objfile), ex.message);
- break;
- default:
- throw_exception (ex);
- break;
- }
- }
- }
-
- else
- error (_("Cannot find thread-local variables on this target"));
- return addr;
- }
- const char *
- target_xfer_status_to_string (enum target_xfer_status status)
- {
- #define CASE(X) case X: return #X
- switch (status)
- {
- CASE(TARGET_XFER_E_IO);
- CASE(TARGET_XFER_UNAVAILABLE);
- default:
- return "<unknown>";
- }
- #undef CASE
- };
- #undef MIN
- #define MIN(A, B) (((A) <= (B)) ? (A) : (B))
- int
- target_read_string (CORE_ADDR memaddr, char **string, int len, int *errnop)
- {
- int tlen, offset, i;
- gdb_byte buf[4];
- int errcode = 0;
- char *buffer;
- int buffer_allocated;
- char *bufptr;
- unsigned int nbytes_read = 0;
- gdb_assert (string);
-
- buffer_allocated = 4;
- buffer = xmalloc (buffer_allocated);
- bufptr = buffer;
- while (len > 0)
- {
- tlen = MIN (len, 4 - (memaddr & 3));
- offset = memaddr & 3;
- errcode = target_read_memory (memaddr & ~3, buf, sizeof buf);
- if (errcode != 0)
- {
-
- tlen = 1;
- offset = 0;
- errcode = target_read_memory (memaddr, buf, 1);
- if (errcode != 0)
- goto done;
- }
- if (bufptr - buffer + tlen > buffer_allocated)
- {
- unsigned int bytes;
- bytes = bufptr - buffer;
- buffer_allocated *= 2;
- buffer = xrealloc (buffer, buffer_allocated);
- bufptr = buffer + bytes;
- }
- for (i = 0; i < tlen; i++)
- {
- *bufptr++ = buf[i + offset];
- if (buf[i + offset] == '\000')
- {
- nbytes_read += i + 1;
- goto done;
- }
- }
- memaddr += tlen;
- len -= tlen;
- nbytes_read += tlen;
- }
- done:
- *string = buffer;
- if (errnop != NULL)
- *errnop = errcode;
- return nbytes_read;
- }
- struct target_section_table *
- target_get_section_table (struct target_ops *target)
- {
- return (*target->to_get_section_table) (target);
- }
- struct target_section *
- target_section_by_addr (struct target_ops *target, CORE_ADDR addr)
- {
- struct target_section_table *table = target_get_section_table (target);
- struct target_section *secp;
- if (table == NULL)
- return NULL;
- for (secp = table->sections; secp < table->sections_end; secp++)
- {
- if (addr >= secp->addr && addr < secp->endaddr)
- return secp;
- }
- return NULL;
- }
- static int
- memory_xfer_check_region (gdb_byte *readbuf, const gdb_byte *writebuf,
- ULONGEST memaddr, ULONGEST len, ULONGEST *reg_len,
- struct mem_region **region_p)
- {
- struct mem_region *region;
- region = lookup_mem_region (memaddr);
- if (region_p != NULL)
- *region_p = region;
- switch (region->attrib.mode)
- {
- case MEM_RO:
- if (writebuf != NULL)
- return 0;
- break;
- case MEM_WO:
- if (readbuf != NULL)
- return 0;
- break;
- case MEM_FLASH:
-
- if (writebuf != NULL)
- error (_("Writing to flash memory forbidden in this context"));
- break;
- case MEM_NONE:
- return 0;
- }
-
- if (memaddr + len < region->hi || region->hi == 0)
- *reg_len = len;
- else
- *reg_len = region->hi - memaddr;
- return 1;
- }
- static enum target_xfer_status
- raw_memory_xfer_partial (struct target_ops *ops, gdb_byte *readbuf,
- const gdb_byte *writebuf, ULONGEST memaddr, LONGEST len,
- ULONGEST *xfered_len)
- {
- enum target_xfer_status res;
- do
- {
- res = ops->to_xfer_partial (ops, TARGET_OBJECT_MEMORY, NULL,
- readbuf, writebuf, memaddr, len,
- xfered_len);
- if (res == TARGET_XFER_OK)
- break;
-
- if (res == TARGET_XFER_UNAVAILABLE)
- break;
-
- if (ops->to_has_all_memory (ops))
- break;
- ops = ops->beneath;
- }
- while (ops != NULL);
-
- if (writebuf != NULL
- && !ptid_equal (inferior_ptid, null_ptid)
- && target_dcache_init_p ()
- && (stack_cache_enabled_p () || code_cache_enabled_p ()))
- {
- DCACHE *dcache = target_dcache_get ();
-
- dcache_update (dcache, res, memaddr, writebuf, *xfered_len);
- }
- return res;
- }
- static enum target_xfer_status
- memory_xfer_partial_1 (struct target_ops *ops, enum target_object object,
- gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST memaddr,
- ULONGEST len, ULONGEST *xfered_len)
- {
- enum target_xfer_status res;
- ULONGEST reg_len;
- struct mem_region *region;
- struct inferior *inf;
-
- if (readbuf != NULL && overlay_debugging)
- {
- struct obj_section *section = find_pc_overlay (memaddr);
- if (pc_in_unmapped_range (memaddr, section))
- {
- struct target_section_table *table
- = target_get_section_table (ops);
- const char *section_name = section->the_bfd_section->name;
- memaddr = overlay_mapped_address (memaddr, section);
- return section_table_xfer_memory_partial (readbuf, writebuf,
- memaddr, len, xfered_len,
- table->sections,
- table->sections_end,
- section_name);
- }
- }
-
- if (readbuf != NULL && trust_readonly)
- {
- struct target_section *secp;
- struct target_section_table *table;
- secp = target_section_by_addr (ops, memaddr);
- if (secp != NULL
- && (bfd_get_section_flags (secp->the_bfd_section->owner,
- secp->the_bfd_section)
- & SEC_READONLY))
- {
- table = target_get_section_table (ops);
- return section_table_xfer_memory_partial (readbuf, writebuf,
- memaddr, len, xfered_len,
- table->sections,
- table->sections_end,
- NULL);
- }
- }
-
- if (!memory_xfer_check_region (readbuf, writebuf, memaddr, len, ®_len,
- ®ion))
- return TARGET_XFER_E_IO;
- if (!ptid_equal (inferior_ptid, null_ptid))
- inf = find_inferior_ptid (inferior_ptid);
- else
- inf = NULL;
- if (inf != NULL
- && readbuf != NULL
-
- && get_traceframe_number () == -1
- && (region->attrib.cache
- || (stack_cache_enabled_p () && object == TARGET_OBJECT_STACK_MEMORY)
- || (code_cache_enabled_p () && object == TARGET_OBJECT_CODE_MEMORY)))
- {
- DCACHE *dcache = target_dcache_get_or_init ();
- return dcache_read_memory_partial (ops, dcache, memaddr, readbuf,
- reg_len, xfered_len);
- }
-
- res = raw_memory_xfer_partial (ops, readbuf, writebuf, memaddr, reg_len,
- xfered_len);
-
- return res;
- }
- static enum target_xfer_status
- memory_xfer_partial (struct target_ops *ops, enum target_object object,
- gdb_byte *readbuf, const gdb_byte *writebuf,
- ULONGEST memaddr, ULONGEST len, ULONGEST *xfered_len)
- {
- enum target_xfer_status res;
-
- if (len == 0)
- return TARGET_XFER_EOF;
-
- if (readbuf != NULL)
- {
- res = memory_xfer_partial_1 (ops, object, readbuf, NULL, memaddr, len,
- xfered_len);
- if (res == TARGET_XFER_OK && !show_memory_breakpoints)
- breakpoint_xfer_memory (readbuf, NULL, NULL, memaddr, *xfered_len);
- }
- else
- {
- void *buf;
- struct cleanup *old_chain;
-
- len = min (4096, len);
- buf = xmalloc (len);
- old_chain = make_cleanup (xfree, buf);
- memcpy (buf, writebuf, len);
- breakpoint_xfer_memory (NULL, buf, writebuf, memaddr, len);
- res = memory_xfer_partial_1 (ops, object, NULL, buf, memaddr, len,
- xfered_len);
- do_cleanups (old_chain);
- }
- return res;
- }
- static void
- restore_show_memory_breakpoints (void *arg)
- {
- show_memory_breakpoints = (uintptr_t) arg;
- }
- struct cleanup *
- make_show_memory_breakpoints_cleanup (int show)
- {
- int current = show_memory_breakpoints;
- show_memory_breakpoints = show;
- return make_cleanup (restore_show_memory_breakpoints,
- (void *) (uintptr_t) current);
- }
- enum target_xfer_status
- target_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)
- {
- enum target_xfer_status retval;
- gdb_assert (ops->to_xfer_partial != NULL);
-
- if (len == 0)
- return TARGET_XFER_EOF;
- if (writebuf && !may_write_memory)
- error (_("Writing to memory is not allowed (addr %s, len %s)"),
- core_addr_to_string_nz (offset), plongest (len));
- *xfered_len = 0;
-
- if (object == TARGET_OBJECT_MEMORY || object == TARGET_OBJECT_STACK_MEMORY
- || object == TARGET_OBJECT_CODE_MEMORY)
- retval = memory_xfer_partial (ops, object, readbuf,
- writebuf, offset, len, xfered_len);
- else if (object == TARGET_OBJECT_RAW_MEMORY)
- {
-
- if (!memory_xfer_check_region (readbuf, writebuf, offset, len, &len,
- NULL))
- return TARGET_XFER_E_IO;
-
- retval = raw_memory_xfer_partial (ops, readbuf, writebuf, offset, len,
- xfered_len);
- }
- else
- retval = ops->to_xfer_partial (ops, object, annex, readbuf,
- writebuf, offset, len, xfered_len);
- if (targetdebug)
- {
- const unsigned char *myaddr = NULL;
- fprintf_unfiltered (gdb_stdlog,
- "%s:target_xfer_partial "
- "(%d, %s, %s, %s, %s, %s) = %d, %s",
- ops->to_shortname,
- (int) object,
- (annex ? annex : "(null)"),
- host_address_to_string (readbuf),
- host_address_to_string (writebuf),
- core_addr_to_string_nz (offset),
- pulongest (len), retval,
- pulongest (*xfered_len));
- if (readbuf)
- myaddr = readbuf;
- if (writebuf)
- myaddr = writebuf;
- if (retval == TARGET_XFER_OK && myaddr != NULL)
- {
- int i;
- fputs_unfiltered (", bytes =", gdb_stdlog);
- for (i = 0; i < *xfered_len; i++)
- {
- if ((((intptr_t) &(myaddr[i])) & 0xf) == 0)
- {
- if (targetdebug < 2 && i > 0)
- {
- fprintf_unfiltered (gdb_stdlog, " ...");
- break;
- }
- fprintf_unfiltered (gdb_stdlog, "\n");
- }
- fprintf_unfiltered (gdb_stdlog, " %02x", myaddr[i] & 0xff);
- }
- }
- fputc_unfiltered ('\n', gdb_stdlog);
- }
-
- if (retval == TARGET_XFER_OK || retval == TARGET_XFER_UNAVAILABLE)
- gdb_assert (*xfered_len > 0);
- return retval;
- }
- int
- target_read_memory (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
- {
-
- if (target_read (current_target.beneath, TARGET_OBJECT_MEMORY, NULL,
- myaddr, memaddr, len) == len)
- return 0;
- else
- return TARGET_XFER_E_IO;
- }
- int
- target_read_uint32 (CORE_ADDR memaddr, uint32_t *result)
- {
- gdb_byte buf[4];
- int r;
- r = target_read_memory (memaddr, buf, sizeof buf);
- if (r != 0)
- return r;
- *result = extract_unsigned_integer (buf, sizeof buf,
- gdbarch_byte_order (target_gdbarch ()));
- return 0;
- }
- int
- target_read_raw_memory (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
- {
-
- if (target_read (current_target.beneath, TARGET_OBJECT_RAW_MEMORY, NULL,
- myaddr, memaddr, len) == len)
- return 0;
- else
- return TARGET_XFER_E_IO;
- }
- int
- target_read_stack (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
- {
-
- if (target_read (current_target.beneath, TARGET_OBJECT_STACK_MEMORY, NULL,
- myaddr, memaddr, len) == len)
- return 0;
- else
- return TARGET_XFER_E_IO;
- }
- int
- target_read_code (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
- {
-
- if (target_read (current_target.beneath, TARGET_OBJECT_CODE_MEMORY, NULL,
- myaddr, memaddr, len) == len)
- return 0;
- else
- return TARGET_XFER_E_IO;
- }
- int
- target_write_memory (CORE_ADDR memaddr, const gdb_byte *myaddr, ssize_t len)
- {
-
- if (target_write (current_target.beneath, TARGET_OBJECT_MEMORY, NULL,
- myaddr, memaddr, len) == len)
- return 0;
- else
- return TARGET_XFER_E_IO;
- }
- int
- target_write_raw_memory (CORE_ADDR memaddr, const gdb_byte *myaddr, ssize_t len)
- {
-
- if (target_write (current_target.beneath, TARGET_OBJECT_RAW_MEMORY, NULL,
- myaddr, memaddr, len) == len)
- return 0;
- else
- return TARGET_XFER_E_IO;
- }
- VEC(mem_region_s) *
- target_memory_map (void)
- {
- VEC(mem_region_s) *result;
- struct mem_region *last_one, *this_one;
- int ix;
- struct target_ops *t;
- result = current_target.to_memory_map (¤t_target);
- if (result == NULL)
- return NULL;
- qsort (VEC_address (mem_region_s, result),
- VEC_length (mem_region_s, result),
- sizeof (struct mem_region), mem_region_cmp);
-
- last_one = NULL;
- for (ix = 0; VEC_iterate (mem_region_s, result, ix, this_one); ix++)
- {
- this_one->number = ix;
- if (last_one && last_one->hi > this_one->lo)
- {
- warning (_("Overlapping regions in memory map: ignoring"));
- VEC_free (mem_region_s, result);
- return NULL;
- }
- last_one = this_one;
- }
- return result;
- }
- void
- target_flash_erase (ULONGEST address, LONGEST length)
- {
- current_target.to_flash_erase (¤t_target, address, length);
- }
- void
- target_flash_done (void)
- {
- current_target.to_flash_done (¤t_target);
- }
- static void
- show_trust_readonly (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
- {
- fprintf_filtered (file,
- _("Mode for reading from readonly sections is %s.\n"),
- value);
- }
- static enum target_xfer_status
- target_read_partial (struct target_ops *ops,
- enum target_object object,
- const char *annex, gdb_byte *buf,
- ULONGEST offset, ULONGEST len,
- ULONGEST *xfered_len)
- {
- return target_xfer_partial (ops, object, annex, buf, NULL, offset, len,
- xfered_len);
- }
- static enum target_xfer_status
- target_write_partial (struct target_ops *ops,
- enum target_object object,
- const char *annex, const gdb_byte *buf,
- ULONGEST offset, LONGEST len, ULONGEST *xfered_len)
- {
- return target_xfer_partial (ops, object, annex, NULL, buf, offset, len,
- xfered_len);
- }
- LONGEST
- target_read (struct target_ops *ops,
- enum target_object object,
- const char *annex, gdb_byte *buf,
- ULONGEST offset, LONGEST len)
- {
- LONGEST xfered = 0;
- while (xfered < len)
- {
- ULONGEST xfered_len;
- enum target_xfer_status status;
- status = target_read_partial (ops, object, annex,
- (gdb_byte *) buf + xfered,
- offset + xfered, len - xfered,
- &xfered_len);
-
- if (status == TARGET_XFER_EOF)
- return xfered;
- else if (status == TARGET_XFER_OK)
- {
- xfered += xfered_len;
- QUIT;
- }
- else
- return -1;
- }
- return len;
- }
- static void
- read_whatever_is_readable (struct target_ops *ops,
- ULONGEST begin, ULONGEST end,
- VEC(memory_read_result_s) **result)
- {
- gdb_byte *buf = xmalloc (end - begin);
- ULONGEST current_begin = begin;
- ULONGEST current_end = end;
- int forward;
- memory_read_result_s r;
- ULONGEST xfered_len;
-
- if (end - begin <= 1)
- {
- xfree (buf);
- return;
- }
-
- if (target_read_partial (ops, TARGET_OBJECT_MEMORY, NULL,
- buf, begin, 1, &xfered_len) == TARGET_XFER_OK)
- {
- forward = 1;
- ++current_begin;
- }
- else if (target_read_partial (ops, TARGET_OBJECT_MEMORY, NULL,
- buf + (end-begin) - 1, end - 1, 1,
- &xfered_len) == TARGET_XFER_OK)
- {
- forward = 0;
- --current_end;
- }
- else
- {
- xfree (buf);
- return;
- }
-
- while (current_end - current_begin > 1)
- {
- ULONGEST first_half_begin, first_half_end;
- ULONGEST second_half_begin, second_half_end;
- LONGEST xfer;
- ULONGEST middle = current_begin + (current_end - current_begin)/2;
- if (forward)
- {
- first_half_begin = current_begin;
- first_half_end = middle;
- second_half_begin = middle;
- second_half_end = current_end;
- }
- else
- {
- first_half_begin = middle;
- first_half_end = current_end;
- second_half_begin = current_begin;
- second_half_end = middle;
- }
- xfer = target_read (ops, TARGET_OBJECT_MEMORY, NULL,
- buf + (first_half_begin - begin),
- first_half_begin,
- first_half_end - first_half_begin);
- if (xfer == first_half_end - first_half_begin)
- {
-
- current_begin = second_half_begin;
- current_end = second_half_end;
- }
- else
- {
-
- current_begin = first_half_begin;
- current_end = first_half_end;
- }
- }
- if (forward)
- {
-
- r.begin = begin;
- r.end = current_begin;
- r.data = buf;
- }
- else
- {
-
- LONGEST rlen = end - current_end;
- r.data = xmalloc (rlen);
- memcpy (r.data, buf + current_end - begin, rlen);
- r.begin = current_end;
- r.end = end;
- xfree (buf);
- }
- VEC_safe_push(memory_read_result_s, (*result), &r);
- }
- void
- free_memory_read_result_vector (void *x)
- {
- VEC(memory_read_result_s) *v = x;
- memory_read_result_s *current;
- int ix;
- for (ix = 0; VEC_iterate (memory_read_result_s, v, ix, current); ++ix)
- {
- xfree (current->data);
- }
- VEC_free (memory_read_result_s, v);
- }
- VEC(memory_read_result_s) *
- read_memory_robust (struct target_ops *ops, ULONGEST offset, LONGEST len)
- {
- VEC(memory_read_result_s) *result = 0;
- LONGEST xfered = 0;
- while (xfered < len)
- {
- struct mem_region *region = lookup_mem_region (offset + xfered);
- LONGEST rlen;
-
- gdb_assert (region);
- if (region->hi == 0)
- rlen = len - xfered;
- else
- rlen = region->hi - offset;
- if (region->attrib.mode == MEM_NONE || region->attrib.mode == MEM_WO)
- {
-
- xfered += rlen;
- }
- else
- {
- LONGEST to_read = min (len - xfered, rlen);
- gdb_byte *buffer = (gdb_byte *)xmalloc (to_read);
- LONGEST xfer = target_read (ops, TARGET_OBJECT_MEMORY, NULL,
- (gdb_byte *) buffer,
- offset + xfered, to_read);
-
- if (xfer <= 0)
- {
-
- xfree (buffer);
- read_whatever_is_readable (ops, offset + xfered,
- offset + xfered + to_read, &result);
- xfered += to_read;
- }
- else
- {
- struct memory_read_result r;
- r.data = buffer;
- r.begin = offset + xfered;
- r.end = r.begin + xfer;
- VEC_safe_push (memory_read_result_s, result, &r);
- xfered += xfer;
- }
- QUIT;
- }
- }
- return result;
- }
- LONGEST
- target_write_with_progress (struct target_ops *ops,
- enum target_object object,
- const char *annex, const gdb_byte *buf,
- ULONGEST offset, LONGEST len,
- void (*progress) (ULONGEST, void *), void *baton)
- {
- LONGEST xfered = 0;
-
- if (progress)
- (*progress) (0, baton);
- while (xfered < len)
- {
- ULONGEST xfered_len;
- enum target_xfer_status status;
- status = target_write_partial (ops, object, annex,
- (gdb_byte *) buf + xfered,
- offset + xfered, len - xfered,
- &xfered_len);
- if (status != TARGET_XFER_OK)
- return status == TARGET_XFER_EOF ? xfered : -1;
- if (progress)
- (*progress) (xfered_len, baton);
- xfered += xfered_len;
- QUIT;
- }
- return len;
- }
- LONGEST
- target_write (struct target_ops *ops,
- enum target_object object,
- const char *annex, const gdb_byte *buf,
- ULONGEST offset, LONGEST len)
- {
- return target_write_with_progress (ops, object, annex, buf, offset, len,
- NULL, NULL);
- }
- static LONGEST
- target_read_alloc_1 (struct target_ops *ops, enum target_object object,
- const char *annex, gdb_byte **buf_p, int padding)
- {
- size_t buf_alloc, buf_pos;
- gdb_byte *buf;
-
- gdb_assert (object != TARGET_OBJECT_MEMORY);
-
- buf_alloc = 4096;
- buf = xmalloc (buf_alloc);
- buf_pos = 0;
- while (1)
- {
- ULONGEST xfered_len;
- enum target_xfer_status status;
- status = target_read_partial (ops, object, annex, &buf[buf_pos],
- buf_pos, buf_alloc - buf_pos - padding,
- &xfered_len);
- if (status == TARGET_XFER_EOF)
- {
-
- if (buf_pos == 0)
- xfree (buf);
- else
- *buf_p = buf;
- return buf_pos;
- }
- else if (status != TARGET_XFER_OK)
- {
-
- xfree (buf);
- return TARGET_XFER_E_IO;
- }
- buf_pos += xfered_len;
-
- if (buf_alloc < buf_pos * 2)
- {
- buf_alloc *= 2;
- buf = xrealloc (buf, buf_alloc);
- }
- QUIT;
- }
- }
- LONGEST
- target_read_alloc (struct target_ops *ops, enum target_object object,
- const char *annex, gdb_byte **buf_p)
- {
- return target_read_alloc_1 (ops, object, annex, buf_p, 0);
- }
- char *
- target_read_stralloc (struct target_ops *ops, enum target_object object,
- const char *annex)
- {
- gdb_byte *buffer;
- char *bufstr;
- LONGEST i, transferred;
- transferred = target_read_alloc_1 (ops, object, annex, &buffer, 1);
- bufstr = (char *) buffer;
- if (transferred < 0)
- return NULL;
- if (transferred == 0)
- return xstrdup ("");
- bufstr[transferred] = 0;
-
- for (i = strlen (bufstr); i < transferred; i++)
- if (bufstr[i] != 0)
- {
- warning (_("target object %d, annex %s, "
- "contained unexpected null characters"),
- (int) object, annex ? annex : "(none)");
- break;
- }
- return bufstr;
- }
- void
- get_target_memory (struct target_ops *ops, CORE_ADDR addr, gdb_byte *buf,
- LONGEST len)
- {
-
- if (target_read (ops, TARGET_OBJECT_RAW_MEMORY, NULL, buf, addr, len)
- != len)
- memory_error (TARGET_XFER_E_IO, addr);
- }
- ULONGEST
- get_target_memory_unsigned (struct target_ops *ops, CORE_ADDR addr,
- int len, enum bfd_endian byte_order)
- {
- gdb_byte buf[sizeof (ULONGEST)];
- gdb_assert (len <= sizeof (buf));
- get_target_memory (ops, addr, buf, len);
- return extract_unsigned_integer (buf, len, byte_order);
- }
- int
- target_insert_breakpoint (struct gdbarch *gdbarch,
- struct bp_target_info *bp_tgt)
- {
- if (!may_insert_breakpoints)
- {
- warning (_("May not insert breakpoints"));
- return 1;
- }
- return current_target.to_insert_breakpoint (¤t_target,
- gdbarch, bp_tgt);
- }
- int
- target_remove_breakpoint (struct gdbarch *gdbarch,
- struct bp_target_info *bp_tgt)
- {
-
- if (!may_insert_breakpoints)
- {
- warning (_("May not remove breakpoints"));
- return 1;
- }
- return current_target.to_remove_breakpoint (¤t_target,
- gdbarch, bp_tgt);
- }
- static void
- target_info (char *args, int from_tty)
- {
- struct target_ops *t;
- int has_all_mem = 0;
- if (symfile_objfile != NULL)
- printf_unfiltered (_("Symbols from \"%s\".\n"),
- objfile_name (symfile_objfile));
- for (t = target_stack; t != NULL; t = t->beneath)
- {
- if (!(*t->to_has_memory) (t))
- continue;
- if ((int) (t->to_stratum) <= (int) dummy_stratum)
- continue;
- if (has_all_mem)
- printf_unfiltered (_("\tWhile running this, "
- "GDB does not access memory from...\n"));
- printf_unfiltered ("%s:\n", t->to_longname);
- (t->to_files_info) (t);
- has_all_mem = (*t->to_has_all_memory) (t);
- }
- }
- void
- target_pre_inferior (int from_tty)
- {
-
-
- if (!gdbarch_has_global_solist (target_gdbarch ()))
- {
- no_shared_libraries (NULL, from_tty);
- invalidate_target_mem_regions ();
- target_clear_description ();
- }
- agent_capability_invalidate ();
- }
- static int
- dispose_inferior (struct inferior *inf, void *args)
- {
- struct thread_info *thread;
- thread = any_thread_of_process (inf->pid);
- if (thread)
- {
- switch_to_thread (thread->ptid);
-
- if (target_has_execution)
- target_kill ();
- else
- target_detach (NULL, 0);
- }
- return 0;
- }
- void
- target_preopen (int from_tty)
- {
- dont_repeat ();
- if (have_inferiors ())
- {
- if (!from_tty
- || !have_live_inferiors ()
- || query (_("A program is being debugged already. Kill it? ")))
- iterate_over_inferiors (dispose_inferior, NULL);
- else
- error (_("Program not killed."));
- }
-
-
- pop_all_targets_above (file_stratum);
- target_pre_inferior (from_tty);
- }
- void
- target_detach (const char *args, int from_tty)
- {
- struct target_ops* t;
- if (gdbarch_has_global_breakpoints (target_gdbarch ()))
-
- ;
- else
-
- remove_breakpoints_pid (ptid_get_pid (inferior_ptid));
- prepare_for_detach ();
- current_target.to_detach (¤t_target, args, from_tty);
- }
- void
- target_disconnect (const char *args, int from_tty)
- {
-
- remove_breakpoints ();
- current_target.to_disconnect (¤t_target, args, from_tty);
- }
- ptid_t
- target_wait (ptid_t ptid, struct target_waitstatus *status, int options)
- {
- return (current_target.to_wait) (¤t_target, ptid, status, options);
- }
- char *
- target_pid_to_str (ptid_t ptid)
- {
- return (*current_target.to_pid_to_str) (¤t_target, ptid);
- }
- char *
- target_thread_name (struct thread_info *info)
- {
- return current_target.to_thread_name (¤t_target, info);
- }
- void
- target_resume (ptid_t ptid, int step, enum gdb_signal signal)
- {
- struct target_ops *t;
- target_dcache_invalidate ();
- current_target.to_resume (¤t_target, ptid, step, signal);
- registers_changed_ptid (ptid);
-
- set_executing (ptid, 1);
- clear_inline_frame_state (ptid);
- }
- void
- target_pass_signals (int numsigs, unsigned char *pass_signals)
- {
- (*current_target.to_pass_signals) (¤t_target, numsigs, pass_signals);
- }
- void
- target_program_signals (int numsigs, unsigned char *program_signals)
- {
- (*current_target.to_program_signals) (¤t_target,
- numsigs, program_signals);
- }
- static int
- default_follow_fork (struct target_ops *self, int follow_child,
- int detach_fork)
- {
-
- internal_error (__FILE__, __LINE__,
- _("could not find a target to follow fork"));
- }
- int
- target_follow_fork (int follow_child, int detach_fork)
- {
- return current_target.to_follow_fork (¤t_target,
- follow_child, detach_fork);
- }
- static void
- default_mourn_inferior (struct target_ops *self)
- {
- internal_error (__FILE__, __LINE__,
- _("could not find a target to follow mourn inferior"));
- }
- void
- target_mourn_inferior (void)
- {
- current_target.to_mourn_inferior (¤t_target);
-
- bfd_cache_close_all ();
- }
- const struct target_desc *
- target_read_description (struct target_ops *target)
- {
- return target->to_read_description (target);
- }
- int
- simple_search_memory (struct target_ops *ops,
- CORE_ADDR start_addr, ULONGEST search_space_len,
- const gdb_byte *pattern, ULONGEST pattern_len,
- CORE_ADDR *found_addrp)
- {
-
- #define SEARCH_CHUNK_SIZE 16000
- const unsigned chunk_size = SEARCH_CHUNK_SIZE;
-
- gdb_byte *search_buf;
- unsigned search_buf_size;
- struct cleanup *old_cleanups;
- search_buf_size = chunk_size + pattern_len - 1;
-
- if (search_space_len < search_buf_size)
- search_buf_size = search_space_len;
- search_buf = malloc (search_buf_size);
- if (search_buf == NULL)
- error (_("Unable to allocate memory to perform the search."));
- old_cleanups = make_cleanup (free_current_contents, &search_buf);
-
- if (target_read (ops, TARGET_OBJECT_MEMORY, NULL,
- search_buf, start_addr, search_buf_size) != search_buf_size)
- {
- warning (_("Unable to access %s bytes of target "
- "memory at %s, halting search."),
- pulongest (search_buf_size), hex_string (start_addr));
- do_cleanups (old_cleanups);
- return -1;
- }
-
- while (search_space_len >= pattern_len)
- {
- gdb_byte *found_ptr;
- unsigned nr_search_bytes = min (search_space_len, search_buf_size);
- found_ptr = memmem (search_buf, nr_search_bytes,
- pattern, pattern_len);
- if (found_ptr != NULL)
- {
- CORE_ADDR found_addr = start_addr + (found_ptr - search_buf);
- *found_addrp = found_addr;
- do_cleanups (old_cleanups);
- return 1;
- }
-
-
- if (search_space_len >= chunk_size)
- search_space_len -= chunk_size;
- else
- search_space_len = 0;
- if (search_space_len >= pattern_len)
- {
- unsigned keep_len = search_buf_size - chunk_size;
- CORE_ADDR read_addr = start_addr + chunk_size + keep_len;
- int nr_to_read;
-
- gdb_assert (keep_len == pattern_len - 1);
- memcpy (search_buf, search_buf + chunk_size, keep_len);
- nr_to_read = min (search_space_len - keep_len, chunk_size);
- if (target_read (ops, TARGET_OBJECT_MEMORY, NULL,
- search_buf + keep_len, read_addr,
- nr_to_read) != nr_to_read)
- {
- warning (_("Unable to access %s bytes of target "
- "memory at %s, halting search."),
- plongest (nr_to_read),
- hex_string (read_addr));
- do_cleanups (old_cleanups);
- return -1;
- }
- start_addr += chunk_size;
- }
- }
-
- do_cleanups (old_cleanups);
- return 0;
- }
- static int
- default_search_memory (struct target_ops *self,
- CORE_ADDR start_addr, ULONGEST search_space_len,
- const gdb_byte *pattern, ULONGEST pattern_len,
- CORE_ADDR *found_addrp)
- {
-
- return simple_search_memory (current_target.beneath,
- start_addr, search_space_len,
- pattern, pattern_len, found_addrp);
- }
- int
- target_search_memory (CORE_ADDR start_addr, ULONGEST search_space_len,
- const gdb_byte *pattern, ULONGEST pattern_len,
- CORE_ADDR *found_addrp)
- {
- return current_target.to_search_memory (¤t_target, start_addr,
- search_space_len,
- pattern, pattern_len, found_addrp);
- }
- void
- target_require_runnable (void)
- {
- struct target_ops *t;
- for (t = target_stack; t != NULL; t = t->beneath)
- {
-
- if (t->to_create_inferior != NULL)
- return;
-
- if (t->to_stratum == thread_stratum
- || t->to_stratum == record_stratum
- || t->to_stratum == arch_stratum)
- continue;
- error (_("The \"%s\" target does not support \"run\". "
- "Try \"help target\" or \"continue\"."),
- t->to_shortname);
- }
-
- internal_error (__FILE__, __LINE__, _("No targets found"));
- }
- static int auto_connect_native_target = 1;
- static void
- show_auto_connect_native_target (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
- {
- fprintf_filtered (file,
- _("Whether GDB may automatically connect to the "
- "native target is %s.\n"),
- value);
- }
- static struct target_ops *
- find_default_run_target (char *do_mesg)
- {
- struct target_ops *runable = NULL;
- if (auto_connect_native_target)
- {
- struct target_ops *t;
- int count = 0;
- int i;
- for (i = 0; VEC_iterate (target_ops_p, target_structs, i, t); ++i)
- {
- if (t->to_can_run != delegate_can_run && target_can_run (t))
- {
- runable = t;
- ++count;
- }
- }
- if (count != 1)
- runable = NULL;
- }
- if (runable == NULL)
- {
- if (do_mesg)
- error (_("Don't know how to %s. Try \"help target\"."), do_mesg);
- else
- return NULL;
- }
- return runable;
- }
- struct target_ops *
- find_attach_target (void)
- {
- struct target_ops *t;
-
- for (t = current_target.beneath; t != NULL; t = t->beneath)
- {
- if (t->to_attach != NULL)
- break;
- }
-
- if (t == NULL)
- t = find_default_run_target ("attach");
- return t;
- }
- struct target_ops *
- find_run_target (void)
- {
- struct target_ops *t;
-
- for (t = current_target.beneath; t != NULL; t = t->beneath)
- {
- if (t->to_create_inferior != NULL)
- break;
- }
-
- if (t == NULL)
- t = find_default_run_target ("run");
- return t;
- }
- int
- target_info_proc (const char *args, enum info_proc_what what)
- {
- struct target_ops *t;
-
- if (current_target.to_stratum >= process_stratum)
- t = current_target.beneath;
- else
- t = find_default_run_target (NULL);
- for (; t != NULL; t = t->beneath)
- {
- if (t->to_info_proc != NULL)
- {
- t->to_info_proc (t, args, what);
- if (targetdebug)
- fprintf_unfiltered (gdb_stdlog,
- "target_info_proc (\"%s\", %d)\n", args, what);
- return 1;
- }
- }
- return 0;
- }
- static int
- find_default_supports_disable_randomization (struct target_ops *self)
- {
- struct target_ops *t;
- t = find_default_run_target (NULL);
- if (t && t->to_supports_disable_randomization)
- return (t->to_supports_disable_randomization) (t);
- return 0;
- }
- int
- target_supports_disable_randomization (void)
- {
- struct target_ops *t;
- for (t = ¤t_target; t != NULL; t = t->beneath)
- if (t->to_supports_disable_randomization)
- return t->to_supports_disable_randomization (t);
- return 0;
- }
- char *
- target_get_osdata (const char *type)
- {
- struct target_ops *t;
-
- if (current_target.to_stratum >= process_stratum)
- t = current_target.beneath;
- else
- t = find_default_run_target ("get OS data");
- if (!t)
- return NULL;
- return target_read_stralloc (t, TARGET_OBJECT_OSDATA, type);
- }
- static struct address_space *
- default_thread_address_space (struct target_ops *self, ptid_t ptid)
- {
- struct inferior *inf;
-
- inf = find_inferior_ptid (ptid);
- if (inf == NULL || inf->aspace == NULL)
- internal_error (__FILE__, __LINE__,
- _("Can't determine the current "
- "address space of thread %s\n"),
- target_pid_to_str (ptid));
- return inf->aspace;
- }
- struct address_space *
- target_thread_address_space (ptid_t ptid)
- {
- struct address_space *aspace;
- aspace = current_target.to_thread_address_space (¤t_target, ptid);
- gdb_assert (aspace != NULL);
- return aspace;
- }
- static struct target_ops *
- default_fileio_target (void)
- {
-
- if (current_target.to_stratum >= process_stratum)
- return current_target.beneath;
- else
- return find_default_run_target ("file I/O");
- }
- int
- target_fileio_open (const char *filename, int flags, int mode,
- int *target_errno)
- {
- struct target_ops *t;
- for (t = default_fileio_target (); t != NULL; t = t->beneath)
- {
- if (t->to_fileio_open != NULL)
- {
- int fd = t->to_fileio_open (t, filename, flags, mode, target_errno);
- if (targetdebug)
- fprintf_unfiltered (gdb_stdlog,
- "target_fileio_open (%s,0x%x,0%o) = %d (%d)\n",
- filename, flags, mode,
- fd, fd != -1 ? 0 : *target_errno);
- return fd;
- }
- }
- *target_errno = FILEIO_ENOSYS;
- return -1;
- }
- int
- target_fileio_pwrite (int fd, const gdb_byte *write_buf, int len,
- ULONGEST offset, int *target_errno)
- {
- struct target_ops *t;
- for (t = default_fileio_target (); t != NULL; t = t->beneath)
- {
- if (t->to_fileio_pwrite != NULL)
- {
- int ret = t->to_fileio_pwrite (t, fd, write_buf, len, offset,
- target_errno);
- if (targetdebug)
- fprintf_unfiltered (gdb_stdlog,
- "target_fileio_pwrite (%d,...,%d,%s) "
- "= %d (%d)\n",
- fd, len, pulongest (offset),
- ret, ret != -1 ? 0 : *target_errno);
- return ret;
- }
- }
- *target_errno = FILEIO_ENOSYS;
- return -1;
- }
- int
- target_fileio_pread (int fd, gdb_byte *read_buf, int len,
- ULONGEST offset, int *target_errno)
- {
- struct target_ops *t;
- for (t = default_fileio_target (); t != NULL; t = t->beneath)
- {
- if (t->to_fileio_pread != NULL)
- {
- int ret = t->to_fileio_pread (t, fd, read_buf, len, offset,
- target_errno);
- if (targetdebug)
- fprintf_unfiltered (gdb_stdlog,
- "target_fileio_pread (%d,...,%d,%s) "
- "= %d (%d)\n",
- fd, len, pulongest (offset),
- ret, ret != -1 ? 0 : *target_errno);
- return ret;
- }
- }
- *target_errno = FILEIO_ENOSYS;
- return -1;
- }
- int
- target_fileio_close (int fd, int *target_errno)
- {
- struct target_ops *t;
- for (t = default_fileio_target (); t != NULL; t = t->beneath)
- {
- if (t->to_fileio_close != NULL)
- {
- int ret = t->to_fileio_close (t, fd, target_errno);
- if (targetdebug)
- fprintf_unfiltered (gdb_stdlog,
- "target_fileio_close (%d) = %d (%d)\n",
- fd, ret, ret != -1 ? 0 : *target_errno);
- return ret;
- }
- }
- *target_errno = FILEIO_ENOSYS;
- return -1;
- }
- int
- target_fileio_unlink (const char *filename, int *target_errno)
- {
- struct target_ops *t;
- for (t = default_fileio_target (); t != NULL; t = t->beneath)
- {
- if (t->to_fileio_unlink != NULL)
- {
- int ret = t->to_fileio_unlink (t, filename, target_errno);
- if (targetdebug)
- fprintf_unfiltered (gdb_stdlog,
- "target_fileio_unlink (%s) = %d (%d)\n",
- filename, ret, ret != -1 ? 0 : *target_errno);
- return ret;
- }
- }
- *target_errno = FILEIO_ENOSYS;
- return -1;
- }
- char *
- target_fileio_readlink (const char *filename, int *target_errno)
- {
- struct target_ops *t;
- for (t = default_fileio_target (); t != NULL; t = t->beneath)
- {
- if (t->to_fileio_readlink != NULL)
- {
- char *ret = t->to_fileio_readlink (t, filename, target_errno);
- if (targetdebug)
- fprintf_unfiltered (gdb_stdlog,
- "target_fileio_readlink (%s) = %s (%d)\n",
- filename, ret? ret : "(nil)",
- ret? 0 : *target_errno);
- return ret;
- }
- }
- *target_errno = FILEIO_ENOSYS;
- return NULL;
- }
- static void
- target_fileio_close_cleanup (void *opaque)
- {
- int fd = *(int *) opaque;
- int target_errno;
- target_fileio_close (fd, &target_errno);
- }
- static LONGEST
- target_fileio_read_alloc_1 (const char *filename,
- gdb_byte **buf_p, int padding)
- {
- struct cleanup *close_cleanup;
- size_t buf_alloc, buf_pos;
- gdb_byte *buf;
- LONGEST n;
- int fd;
- int target_errno;
- fd = target_fileio_open (filename, FILEIO_O_RDONLY, 0700, &target_errno);
- if (fd == -1)
- return -1;
- close_cleanup = make_cleanup (target_fileio_close_cleanup, &fd);
-
- buf_alloc = 4096;
- buf = xmalloc (buf_alloc);
- buf_pos = 0;
- while (1)
- {
- n = target_fileio_pread (fd, &buf[buf_pos],
- buf_alloc - buf_pos - padding, buf_pos,
- &target_errno);
- if (n < 0)
- {
-
- do_cleanups (close_cleanup);
- xfree (buf);
- return -1;
- }
- else if (n == 0)
- {
-
- do_cleanups (close_cleanup);
- if (buf_pos == 0)
- xfree (buf);
- else
- *buf_p = buf;
- return buf_pos;
- }
- buf_pos += n;
-
- if (buf_alloc < buf_pos * 2)
- {
- buf_alloc *= 2;
- buf = xrealloc (buf, buf_alloc);
- }
- QUIT;
- }
- }
- LONGEST
- target_fileio_read_alloc (const char *filename, gdb_byte **buf_p)
- {
- return target_fileio_read_alloc_1 (filename, buf_p, 0);
- }
- char *
- target_fileio_read_stralloc (const char *filename)
- {
- gdb_byte *buffer;
- char *bufstr;
- LONGEST i, transferred;
- transferred = target_fileio_read_alloc_1 (filename, &buffer, 1);
- bufstr = (char *) buffer;
- if (transferred < 0)
- return NULL;
- if (transferred == 0)
- return xstrdup ("");
- bufstr[transferred] = 0;
-
- for (i = strlen (bufstr); i < transferred; i++)
- if (bufstr[i] != 0)
- {
- warning (_("target file %s "
- "contained unexpected null characters"),
- filename);
- break;
- }
- return bufstr;
- }
- static int
- default_region_ok_for_hw_watchpoint (struct target_ops *self,
- CORE_ADDR addr, int len)
- {
- return (len <= gdbarch_ptr_bit (target_gdbarch ()) / TARGET_CHAR_BIT);
- }
- static int
- default_watchpoint_addr_within_range (struct target_ops *target,
- CORE_ADDR addr,
- CORE_ADDR start, int length)
- {
- return addr >= start && addr < start + length;
- }
- static struct gdbarch *
- default_thread_architecture (struct target_ops *ops, ptid_t ptid)
- {
- return target_gdbarch ();
- }
- static int
- return_zero (struct target_ops *ignore)
- {
- return 0;
- }
- static int
- return_zero_has_execution (struct target_ops *ignore, ptid_t ignore2)
- {
- return 0;
- }
- struct target_ops *
- find_target_beneath (struct target_ops *t)
- {
- return t->beneath;
- }
- struct target_ops *
- find_target_at (enum strata stratum)
- {
- struct target_ops *t;
- for (t = current_target.beneath; t != NULL; t = t->beneath)
- if (t->to_stratum == stratum)
- return t;
- return NULL;
- }
- void
- generic_mourn_inferior (void)
- {
- ptid_t ptid;
- ptid = inferior_ptid;
- inferior_ptid = null_ptid;
-
- mark_breakpoints_out ();
- if (!ptid_equal (ptid, null_ptid))
- {
- int pid = ptid_get_pid (ptid);
- exit_inferior (pid);
- }
-
- breakpoint_init_inferior (inf_exited);
- registers_changed ();
- reopen_exec_file ();
- reinit_frame_cache ();
- if (deprecated_detach_hook)
- deprecated_detach_hook ();
- }
- char *
- normal_pid_to_str (ptid_t ptid)
- {
- static char buf[32];
- xsnprintf (buf, sizeof buf, "process %d", ptid_get_pid (ptid));
- return buf;
- }
- static char *
- default_pid_to_str (struct target_ops *ops, ptid_t ptid)
- {
- return normal_pid_to_str (ptid);
- }
- static int
- dummy_find_memory_regions (struct target_ops *self,
- find_memory_region_ftype ignore1, void *ignore2)
- {
- error (_("Command not implemented for this target."));
- return 0;
- }
- static char *
- dummy_make_corefile_notes (struct target_ops *self,
- bfd *ignore1, int *ignore2)
- {
- error (_("Command not implemented for this target."));
- return NULL;
- }
- static void
- init_dummy_target (void)
- {
- dummy_target.to_shortname = "None";
- dummy_target.to_longname = "None";
- dummy_target.to_doc = "";
- dummy_target.to_supports_disable_randomization
- = find_default_supports_disable_randomization;
- dummy_target.to_stratum = dummy_stratum;
- dummy_target.to_has_all_memory = return_zero;
- dummy_target.to_has_memory = return_zero;
- dummy_target.to_has_stack = return_zero;
- dummy_target.to_has_registers = return_zero;
- dummy_target.to_has_execution = return_zero_has_execution;
- dummy_target.to_magic = OPS_MAGIC;
- install_dummy_methods (&dummy_target);
- }
- void
- target_close (struct target_ops *targ)
- {
- gdb_assert (!target_is_pushed (targ));
- if (targ->to_xclose != NULL)
- targ->to_xclose (targ);
- else if (targ->to_close != NULL)
- targ->to_close (targ);
- if (targetdebug)
- fprintf_unfiltered (gdb_stdlog, "target_close ()\n");
- }
- int
- target_thread_alive (ptid_t ptid)
- {
- return current_target.to_thread_alive (¤t_target, ptid);
- }
- void
- target_update_thread_list (void)
- {
- current_target.to_update_thread_list (¤t_target);
- }
- void
- target_stop (ptid_t ptid)
- {
- if (!may_stop)
- {
- warning (_("May not interrupt or stop the target, ignoring attempt"));
- return;
- }
- (*current_target.to_stop) (¤t_target, ptid);
- }
- void
- target_stop_and_wait (ptid_t ptid)
- {
- struct target_waitstatus status;
- int was_non_stop = non_stop;
- non_stop = 1;
- target_stop (ptid);
- memset (&status, 0, sizeof (status));
- target_wait (ptid, &status, 0);
- non_stop = was_non_stop;
- }
- void
- target_continue_no_signal (ptid_t ptid)
- {
- target_resume (ptid, 0, GDB_SIGNAL_0);
- }
- static char *
- str_comma_list_concat_elem (char *list, const char *elem)
- {
- if (list == NULL)
- return xstrdup (elem);
- else
- return reconcat (list, list, ", ", elem, (char *) NULL);
- }
- static char *
- do_option (int *target_options, char *ret,
- int opt, char *opt_str)
- {
- if ((*target_options & opt) != 0)
- {
- ret = str_comma_list_concat_elem (ret, opt_str);
- *target_options &= ~opt;
- }
- return ret;
- }
- char *
- target_options_to_string (int target_options)
- {
- char *ret = NULL;
- #define DO_TARG_OPTION(OPT) \
- ret = do_option (&target_options, ret, OPT, #OPT)
- DO_TARG_OPTION (TARGET_WNOHANG);
- if (target_options != 0)
- ret = str_comma_list_concat_elem (ret, "unknown???");
- if (ret == NULL)
- ret = xstrdup ("");
- return ret;
- }
- static void
- debug_print_register (const char * func,
- struct regcache *regcache, int regno)
- {
- struct gdbarch *gdbarch = get_regcache_arch (regcache);
- fprintf_unfiltered (gdb_stdlog, "%s ", func);
- if (regno >= 0 && regno < gdbarch_num_regs (gdbarch)
- && gdbarch_register_name (gdbarch, regno) != NULL
- && gdbarch_register_name (gdbarch, regno)[0] != '\0')
- fprintf_unfiltered (gdb_stdlog, "(%s)",
- gdbarch_register_name (gdbarch, regno));
- else
- fprintf_unfiltered (gdb_stdlog, "(%d)", regno);
- if (regno >= 0 && regno < gdbarch_num_regs (gdbarch))
- {
- enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
- int i, size = register_size (gdbarch, regno);
- gdb_byte buf[MAX_REGISTER_SIZE];
- regcache_raw_collect (regcache, regno, buf);
- fprintf_unfiltered (gdb_stdlog, " = ");
- for (i = 0; i < size; i++)
- {
- fprintf_unfiltered (gdb_stdlog, "%02x", buf[i]);
- }
- if (size <= sizeof (LONGEST))
- {
- ULONGEST val = extract_unsigned_integer (buf, size, byte_order);
- fprintf_unfiltered (gdb_stdlog, " %s %s",
- core_addr_to_string_nz (val), plongest (val));
- }
- }
- fprintf_unfiltered (gdb_stdlog, "\n");
- }
- void
- target_fetch_registers (struct regcache *regcache, int regno)
- {
- current_target.to_fetch_registers (¤t_target, regcache, regno);
- if (targetdebug)
- debug_print_register ("target_fetch_registers", regcache, regno);
- }
- void
- target_store_registers (struct regcache *regcache, int regno)
- {
- struct target_ops *t;
- if (!may_write_registers)
- error (_("Writing to registers is not allowed (regno %d)"), regno);
- current_target.to_store_registers (¤t_target, regcache, regno);
- if (targetdebug)
- {
- debug_print_register ("target_store_registers", regcache, regno);
- }
- }
- int
- target_core_of_thread (ptid_t ptid)
- {
- return current_target.to_core_of_thread (¤t_target, ptid);
- }
- int
- simple_verify_memory (struct target_ops *ops,
- const gdb_byte *data, CORE_ADDR lma, ULONGEST size)
- {
- LONGEST total_xfered = 0;
- while (total_xfered < size)
- {
- ULONGEST xfered_len;
- enum target_xfer_status status;
- gdb_byte buf[1024];
- ULONGEST howmuch = min (sizeof (buf), size - total_xfered);
- status = target_xfer_partial (ops, TARGET_OBJECT_MEMORY, NULL,
- buf, NULL, lma + total_xfered, howmuch,
- &xfered_len);
- if (status == TARGET_XFER_OK
- && memcmp (data + total_xfered, buf, xfered_len) == 0)
- {
- total_xfered += xfered_len;
- QUIT;
- }
- else
- return 0;
- }
- return 1;
- }
- static int
- default_verify_memory (struct target_ops *self,
- const gdb_byte *data, CORE_ADDR memaddr, ULONGEST size)
- {
-
- return simple_verify_memory (current_target.beneath,
- data, memaddr, size);
- }
- int
- target_verify_memory (const gdb_byte *data, CORE_ADDR memaddr, ULONGEST size)
- {
- return current_target.to_verify_memory (¤t_target,
- data, memaddr, size);
- }
- int
- target_insert_mask_watchpoint (CORE_ADDR addr, CORE_ADDR mask, int rw)
- {
- return current_target.to_insert_mask_watchpoint (¤t_target,
- addr, mask, rw);
- }
- int
- target_remove_mask_watchpoint (CORE_ADDR addr, CORE_ADDR mask, int rw)
- {
- return current_target.to_remove_mask_watchpoint (¤t_target,
- addr, mask, rw);
- }
- int
- target_masked_watch_num_registers (CORE_ADDR addr, CORE_ADDR mask)
- {
- return current_target.to_masked_watch_num_registers (¤t_target,
- addr, mask);
- }
- int
- target_ranged_break_num_registers (void)
- {
- return current_target.to_ranged_break_num_registers (¤t_target);
- }
- struct btrace_target_info *
- target_enable_btrace (ptid_t ptid)
- {
- return current_target.to_enable_btrace (¤t_target, ptid);
- }
- void
- target_disable_btrace (struct btrace_target_info *btinfo)
- {
- current_target.to_disable_btrace (¤t_target, btinfo);
- }
- void
- target_teardown_btrace (struct btrace_target_info *btinfo)
- {
- current_target.to_teardown_btrace (¤t_target, btinfo);
- }
- enum btrace_error
- target_read_btrace (VEC (btrace_block_s) **btrace,
- struct btrace_target_info *btinfo,
- enum btrace_read_type type)
- {
- return current_target.to_read_btrace (¤t_target, btrace, btinfo, type);
- }
- void
- target_stop_recording (void)
- {
- current_target.to_stop_recording (¤t_target);
- }
- void
- target_save_record (const char *filename)
- {
- current_target.to_save_record (¤t_target, filename);
- }
- int
- target_supports_delete_record (void)
- {
- struct target_ops *t;
- for (t = current_target.beneath; t != NULL; t = t->beneath)
- if (t->to_delete_record != delegate_delete_record
- && t->to_delete_record != tdefault_delete_record)
- return 1;
- return 0;
- }
- void
- target_delete_record (void)
- {
- current_target.to_delete_record (¤t_target);
- }
- int
- target_record_is_replaying (void)
- {
- return current_target.to_record_is_replaying (¤t_target);
- }
- void
- target_goto_record_begin (void)
- {
- current_target.to_goto_record_begin (¤t_target);
- }
- void
- target_goto_record_end (void)
- {
- current_target.to_goto_record_end (¤t_target);
- }
- void
- target_goto_record (ULONGEST insn)
- {
- current_target.to_goto_record (¤t_target, insn);
- }
- void
- target_insn_history (int size, int flags)
- {
- current_target.to_insn_history (¤t_target, size, flags);
- }
- void
- target_insn_history_from (ULONGEST from, int size, int flags)
- {
- current_target.to_insn_history_from (¤t_target, from, size, flags);
- }
- void
- target_insn_history_range (ULONGEST begin, ULONGEST end, int flags)
- {
- current_target.to_insn_history_range (¤t_target, begin, end, flags);
- }
- void
- target_call_history (int size, int flags)
- {
- current_target.to_call_history (¤t_target, size, flags);
- }
- void
- target_call_history_from (ULONGEST begin, int size, int flags)
- {
- current_target.to_call_history_from (¤t_target, begin, size, flags);
- }
- void
- target_call_history_range (ULONGEST begin, ULONGEST end, int flags)
- {
- current_target.to_call_history_range (¤t_target, begin, end, flags);
- }
- const struct frame_unwind *
- target_get_unwinder (void)
- {
- return current_target.to_get_unwinder (¤t_target);
- }
- const struct frame_unwind *
- target_get_tailcall_unwinder (void)
- {
- return current_target.to_get_tailcall_unwinder (¤t_target);
- }
- static CORE_ADDR
- default_target_decr_pc_after_break (struct target_ops *ops,
- struct gdbarch *gdbarch)
- {
- return gdbarch_decr_pc_after_break (gdbarch);
- }
- CORE_ADDR
- target_decr_pc_after_break (struct gdbarch *gdbarch)
- {
- return current_target.to_decr_pc_after_break (¤t_target, gdbarch);
- }
- void
- target_prepare_to_generate_core (void)
- {
- current_target.to_prepare_to_generate_core (¤t_target);
- }
- void
- target_done_generating_core (void)
- {
- current_target.to_done_generating_core (¤t_target);
- }
- static void
- setup_target_debug (void)
- {
- memcpy (&debug_target, ¤t_target, sizeof debug_target);
- init_debug_target (¤t_target);
- }
- static char targ_desc[] =
- "Names of targets and files being debugged.\nShows the entire \
- stack of targets currently in use (including the exec-file,\n\
- core-file, and process, if any), as well as the symbol file name.";
- static void
- default_rcmd (struct target_ops *self, const char *command,
- struct ui_file *output)
- {
- error (_("\"monitor\" command not supported by this target."));
- }
- static void
- do_monitor_command (char *cmd,
- int from_tty)
- {
- target_rcmd (cmd, gdb_stdtarg);
- }
- static void
- maintenance_print_target_stack (char *cmd, int from_tty)
- {
- struct target_ops *t;
- printf_filtered (_("The current target stack is:\n"));
- for (t = target_stack; t != NULL; t = t->beneath)
- {
- printf_filtered (" - %s (%s)\n", t->to_shortname, t->to_longname);
- }
- }
- int target_async_permitted = 1;
- static int target_async_permitted_1 = 1;
- static void
- maint_set_target_async_command (char *args, int from_tty,
- struct cmd_list_element *c)
- {
- if (have_live_inferiors ())
- {
- target_async_permitted_1 = target_async_permitted;
- error (_("Cannot change this setting while the inferior is running."));
- }
- target_async_permitted = target_async_permitted_1;
- }
- static void
- maint_show_target_async_command (struct ui_file *file, int from_tty,
- struct cmd_list_element *c,
- const char *value)
- {
- fprintf_filtered (file,
- _("Controlling the inferior in "
- "asynchronous mode is %s.\n"), value);
- }
- static int may_write_registers_1 = 1;
- static int may_write_memory_1 = 1;
- static int may_insert_breakpoints_1 = 1;
- static int may_insert_tracepoints_1 = 1;
- static int may_insert_fast_tracepoints_1 = 1;
- static int may_stop_1 = 1;
- void
- update_target_permissions (void)
- {
- may_write_registers_1 = may_write_registers;
- may_write_memory_1 = may_write_memory;
- may_insert_breakpoints_1 = may_insert_breakpoints;
- may_insert_tracepoints_1 = may_insert_tracepoints;
- may_insert_fast_tracepoints_1 = may_insert_fast_tracepoints;
- may_stop_1 = may_stop;
- }
- static void
- set_target_permissions (char *args, int from_tty,
- struct cmd_list_element *c)
- {
- if (target_has_execution)
- {
- update_target_permissions ();
- error (_("Cannot change this setting while the inferior is running."));
- }
-
- may_write_registers = may_write_registers_1;
- may_insert_breakpoints = may_insert_breakpoints_1;
- may_insert_tracepoints = may_insert_tracepoints_1;
- may_insert_fast_tracepoints = may_insert_fast_tracepoints_1;
- may_stop = may_stop_1;
- update_observer_mode ();
- }
- static void
- set_write_memory_permission (char *args, int from_tty,
- struct cmd_list_element *c)
- {
-
- may_write_memory = may_write_memory_1;
- update_observer_mode ();
- }
- void
- initialize_targets (void)
- {
- init_dummy_target ();
- push_target (&dummy_target);
- add_info ("target", target_info, targ_desc);
- add_info ("files", target_info, targ_desc);
- add_setshow_zuinteger_cmd ("target", class_maintenance, &targetdebug, _("\
- Set target debugging."), _("\
- Show target debugging."), _("\
- When non-zero, target debugging is enabled. Higher numbers are more\n\
- verbose."),
- set_targetdebug,
- show_targetdebug,
- &setdebuglist, &showdebuglist);
- add_setshow_boolean_cmd ("trust-readonly-sections", class_support,
- &trust_readonly, _("\
- Set mode for reading from readonly sections."), _("\
- Show mode for reading from readonly sections."), _("\
- When this mode is on, memory reads from readonly sections (such as .text)\n\
- will be read from the object file instead of from the target. This will\n\
- result in significant performance improvement for remote targets."),
- NULL,
- show_trust_readonly,
- &setlist, &showlist);
- add_com ("monitor", class_obscure, do_monitor_command,
- _("Send a command to the remote monitor (remote targets only)."));
- add_cmd ("target-stack", class_maintenance, maintenance_print_target_stack,
- _("Print the name of each layer of the internal target stack."),
- &maintenanceprintlist);
- add_setshow_boolean_cmd ("target-async", no_class,
- &target_async_permitted_1, _("\
- Set whether gdb controls the inferior in asynchronous mode."), _("\
- Show whether gdb controls the inferior in asynchronous mode."), _("\
- Tells gdb whether to control the inferior in asynchronous mode."),
- maint_set_target_async_command,
- maint_show_target_async_command,
- &maintenance_set_cmdlist,
- &maintenance_show_cmdlist);
- add_setshow_boolean_cmd ("may-write-registers", class_support,
- &may_write_registers_1, _("\
- Set permission to write into registers."), _("\
- Show permission to write into registers."), _("\
- When this permission is on, GDB may write into the target's registers.\n\
- Otherwise, any sort of write attempt will result in an error."),
- set_target_permissions, NULL,
- &setlist, &showlist);
- add_setshow_boolean_cmd ("may-write-memory", class_support,
- &may_write_memory_1, _("\
- Set permission to write into target memory."), _("\
- Show permission to write into target memory."), _("\
- When this permission is on, GDB may write into the target's memory.\n\
- Otherwise, any sort of write attempt will result in an error."),
- set_write_memory_permission, NULL,
- &setlist, &showlist);
- add_setshow_boolean_cmd ("may-insert-breakpoints", class_support,
- &may_insert_breakpoints_1, _("\
- Set permission to insert breakpoints in the target."), _("\
- Show permission to insert breakpoints in the target."), _("\
- When this permission is on, GDB may insert breakpoints in the program.\n\
- Otherwise, any sort of insertion attempt will result in an error."),
- set_target_permissions, NULL,
- &setlist, &showlist);
- add_setshow_boolean_cmd ("may-insert-tracepoints", class_support,
- &may_insert_tracepoints_1, _("\
- Set permission to insert tracepoints in the target."), _("\
- Show permission to insert tracepoints in the target."), _("\
- When this permission is on, GDB may insert tracepoints in the program.\n\
- Otherwise, any sort of insertion attempt will result in an error."),
- set_target_permissions, NULL,
- &setlist, &showlist);
- add_setshow_boolean_cmd ("may-insert-fast-tracepoints", class_support,
- &may_insert_fast_tracepoints_1, _("\
- Set permission to insert fast tracepoints in the target."), _("\
- Show permission to insert fast tracepoints in the target."), _("\
- When this permission is on, GDB may insert fast tracepoints.\n\
- Otherwise, any sort of insertion attempt will result in an error."),
- set_target_permissions, NULL,
- &setlist, &showlist);
- add_setshow_boolean_cmd ("may-interrupt", class_support,
- &may_stop_1, _("\
- Set permission to interrupt or signal the target."), _("\
- Show permission to interrupt or signal the target."), _("\
- When this permission is on, GDB may interrupt/stop the target's execution.\n\
- Otherwise, any attempt to interrupt or stop will be ignored."),
- set_target_permissions, NULL,
- &setlist, &showlist);
- add_setshow_boolean_cmd ("auto-connect-native-target", class_support,
- &auto_connect_native_target, _("\
- Set whether GDB may automatically connect to the native target."), _("\
- Show whether GDB may automatically connect to the native target."), _("\
- When on, and GDB is not connected to a target yet, GDB\n\
- attempts \"run\" and other commands with the native target."),
- NULL, show_auto_connect_native_target,
- &setlist, &showlist);
- }