gdb/remote.c - gdb
Global variables defined
Data types defined
Functions defined
Macros defined
Source code
- #include "defs.h"
- #include <ctype.h>
- #include <fcntl.h>
- #include "inferior.h"
- #include "infrun.h"
- #include "bfd.h"
- #include "symfile.h"
- #include "target.h"
- #include "gdbcmd.h"
- #include "objfiles.h"
- #include "gdb-stabs.h"
- #include "gdbthread.h"
- #include "remote.h"
- #include "remote-notif.h"
- #include "regcache.h"
- #include "value.h"
- #include "observer.h"
- #include "solib.h"
- #include "cli/cli-decode.h"
- #include "cli/cli-setshow.h"
- #include "target-descriptions.h"
- #include "gdb_bfd.h"
- #include "filestuff.h"
- #include "rsp-low.h"
- #include <sys/time.h>
- #include "event-loop.h"
- #include "event-top.h"
- #include "inf-loop.h"
- #include <signal.h>
- #include "serial.h"
- #include "gdbcore.h"
- #include "remote-fileio.h"
- #include "gdb/fileio.h"
- #include <sys/stat.h>
- #include "xml-support.h"
- #include "memory-map.h"
- #include "tracepoint.h"
- #include "ax.h"
- #include "ax-gdb.h"
- #include "agent.h"
- #include "btrace.h"
- static char *target_buf;
- static long target_buf_size;
- enum { REMOTE_ALIGN_WRITES = 16 };
- static void async_cleanup_sigint_signal_handler (void *dummy);
- static int getpkt_sane (char **buf, long *sizeof_buf, int forever);
- static int getpkt_or_notif_sane (char **buf, long *sizeof_buf,
- int forever, int *is_notif);
- static void async_handle_remote_sigint (int);
- static void async_handle_remote_sigint_twice (int);
- static void remote_files_info (struct target_ops *ignore);
- static void remote_prepare_to_store (struct target_ops *self,
- struct regcache *regcache);
- static void remote_open_1 (const char *, int, struct target_ops *,
- int extended_p);
- static void remote_close (struct target_ops *self);
- static void remote_mourn (struct target_ops *ops);
- static void extended_remote_restart (void);
- static void extended_remote_mourn (struct target_ops *);
- static void remote_mourn_1 (struct target_ops *);
- static void remote_send (char **buf, long *sizeof_buf_p);
- static int readchar (int timeout);
- static void remote_serial_write (const char *str, int len);
- static void remote_kill (struct target_ops *ops);
- static int remote_can_async_p (struct target_ops *);
- static int remote_is_async_p (struct target_ops *);
- static void remote_async (struct target_ops *ops,
- void (*callback) (enum inferior_event_type event_type,
- void *context),
- void *context);
- static void sync_remote_interrupt_twice (int signo);
- static void interrupt_query (void);
- static void set_general_thread (struct ptid ptid);
- static void set_continue_thread (struct ptid ptid);
- static void get_offsets (void);
- static void skip_frame (void);
- static long read_frame (char **buf_p, long *sizeof_buf);
- static int hexnumlen (ULONGEST num);
- static void init_remote_ops (void);
- static void init_extended_remote_ops (void);
- static void remote_stop (struct target_ops *self, ptid_t);
- static int stubhex (int ch);
- static int hexnumstr (char *, ULONGEST);
- static int hexnumnstr (char *, ULONGEST, int);
- static CORE_ADDR remote_address_masked (CORE_ADDR);
- static void print_packet (const char *);
- static void compare_sections_command (char *, int);
- static void packet_command (char *, int);
- static int stub_unpack_int (char *buff, int fieldlength);
- static ptid_t remote_current_thread (ptid_t oldptid);
- static int putpkt_binary (const char *buf, int cnt);
- static void check_binary_download (CORE_ADDR addr);
- struct packet_config;
- static void show_packet_config_cmd (struct packet_config *config);
- static void show_remote_protocol_packet_cmd (struct ui_file *file,
- int from_tty,
- struct cmd_list_element *c,
- const char *value);
- static char *write_ptid (char *buf, const char *endbuf, ptid_t ptid);
- static ptid_t read_ptid (char *buf, char **obuf);
- static void remote_set_permissions (struct target_ops *self);
- struct remote_state;
- static int remote_get_trace_status (struct target_ops *self,
- struct trace_status *ts);
- static int remote_upload_tracepoints (struct target_ops *self,
- struct uploaded_tp **utpp);
- static int remote_upload_trace_state_variables (struct target_ops *self,
- struct uploaded_tsv **utsvp);
- static void remote_query_supported (void);
- static void remote_check_symbols (void);
- void _initialize_remote (void);
- struct stop_reply;
- static void stop_reply_xfree (struct stop_reply *);
- static void remote_parse_stop_reply (char *, struct stop_reply *);
- static void push_stop_reply (struct stop_reply *);
- static void discard_pending_stop_replies_in_queue (struct remote_state *);
- static int peek_stop_reply (ptid_t ptid);
- static void remote_async_inferior_event_handler (gdb_client_data);
- static void remote_terminal_ours (struct target_ops *self);
- static int remote_read_description_p (struct target_ops *target);
- static void remote_console_output (char *msg);
- static int remote_supports_cond_breakpoints (struct target_ops *self);
- static int remote_can_run_breakpoint_commands (struct target_ops *self);
- static struct cmd_list_element *remote_cmdlist;
- static struct cmd_list_element *remote_set_cmdlist;
- static struct cmd_list_element *remote_show_cmdlist;
- struct vCont_action_support
- {
-
- int t;
-
- int r;
- };
- static int use_range_stepping = 1;
- #define OPAQUETHREADBYTES 8
- typedef unsigned char threadref[OPAQUETHREADBYTES];
- #define MAXTHREADLISTRESULTS 32
- struct remote_state
- {
-
- char *buf;
- long buf_size;
-
- int starting_up;
-
- long explicit_packet_size;
-
- int cached_wait_status;
-
- int noack_mode;
-
- int extended;
-
- int waiting_for_stop_reply;
-
- struct vCont_action_support supports_vCont;
-
- int ctrlc_pending_p;
-
- struct serial *remote_desc;
-
- ptid_t general_thread;
- ptid_t continue_thread;
-
- int remote_traceframe_number;
- char *last_pass_packet;
-
- char *last_program_signals_packet;
- enum gdb_signal last_sent_signal;
- int last_sent_step;
- char *finished_object;
- char *finished_annex;
- ULONGEST finished_offset;
-
- int use_threadinfo_query;
- int use_threadextra_query;
- void (*async_client_callback) (enum inferior_event_type event_type,
- void *context);
- void *async_client_context;
-
- CORE_ADDR remote_watch_data_address;
-
- int remote_stopped_by_watchpoint_p;
- threadref echo_nextthread;
- threadref nextthread;
- threadref resultthreadlist[MAXTHREADLISTRESULTS];
-
- struct remote_notif_state *notif_state;
- };
- struct private_thread_info
- {
- char *extra;
- int core;
- };
- static void
- free_private_thread_info (struct private_thread_info *info)
- {
- xfree (info->extra);
- xfree (info);
- }
- static struct remote_state *remote_state;
- static struct remote_state *
- get_remote_state_raw (void)
- {
- return remote_state;
- }
- static struct remote_state *
- new_remote_state (void)
- {
- struct remote_state *result = XCNEW (struct remote_state);
-
- result->buf_size = 400;
- result->buf = xmalloc (result->buf_size);
- result->remote_traceframe_number = -1;
- result->last_sent_signal = GDB_SIGNAL_0;
- return result;
- }
- struct packet_reg
- {
- long offset;
- long regnum;
- LONGEST pnum;
- int in_g_packet;
-
-
- };
- struct remote_arch_state
- {
-
- long sizeof_g_packet;
-
- struct packet_reg *regs;
-
- long actual_register_packet_size;
-
- long remote_packet_size;
- };
- static void
- trace_error (char *buf)
- {
- if (*buf++ != 'E')
- return;
- switch (*buf)
- {
- case '1':
- if (*++buf == '0')
- error (_("remote.c: error in outgoing packet."));
- else
- error (_("remote.c: error in outgoing packet at field #%ld."),
- strtol (buf, NULL, 16));
- default:
- error (_("Target returns error code '%s'."), buf);
- }
- }
- static char *
- remote_get_noisy_reply (char **buf_p,
- long *sizeof_buf)
- {
- do
- {
- char *buf;
- QUIT;
- getpkt (buf_p, sizeof_buf, 0);
- buf = *buf_p;
- if (buf[0] == 'E')
- trace_error (buf);
- else if (strncmp (buf, "qRelocInsn:", strlen ("qRelocInsn:")) == 0)
- {
- ULONGEST ul;
- CORE_ADDR from, to, org_to;
- char *p, *pp;
- int adjusted_size = 0;
- volatile struct gdb_exception ex;
- p = buf + strlen ("qRelocInsn:");
- pp = unpack_varlen_hex (p, &ul);
- if (*pp != ';')
- error (_("invalid qRelocInsn packet: %s"), buf);
- from = ul;
- p = pp + 1;
- unpack_varlen_hex (p, &ul);
- to = ul;
- org_to = to;
- TRY_CATCH (ex, RETURN_MASK_ALL)
- {
- gdbarch_relocate_instruction (target_gdbarch (), &to, from);
- }
- if (ex.reason >= 0)
- {
- adjusted_size = to - org_to;
- xsnprintf (buf, *sizeof_buf, "qRelocInsn:%x", adjusted_size);
- putpkt (buf);
- }
- else if (ex.reason < 0 && ex.error == MEMORY_ERROR)
- {
-
- putpkt ("E01");
- }
- else
- {
-
- exception_fprintf (gdb_stderr, ex,
- _("warning: relocating instruction: "));
- putpkt ("E01");
- }
- }
- else if (buf[0] == 'O' && buf[1] != 'K')
- remote_console_output (buf + 1);
- else
- return buf;
- }
- while (1);
- }
- static struct gdbarch_data *remote_gdbarch_data_handle;
- static struct remote_arch_state *
- get_remote_arch_state (void)
- {
- return gdbarch_data (target_gdbarch (), remote_gdbarch_data_handle);
- }
- static struct remote_state *
- get_remote_state (void)
- {
-
- get_remote_arch_state ();
- return get_remote_state_raw ();
- }
- static int
- compare_pnums (const void *lhs_, const void *rhs_)
- {
- const struct packet_reg * const *lhs = lhs_;
- const struct packet_reg * const *rhs = rhs_;
- if ((*lhs)->pnum < (*rhs)->pnum)
- return -1;
- else if ((*lhs)->pnum == (*rhs)->pnum)
- return 0;
- else
- return 1;
- }
- static int
- map_regcache_remote_table (struct gdbarch *gdbarch, struct packet_reg *regs)
- {
- int regnum, num_remote_regs, offset;
- struct packet_reg **remote_regs;
- for (regnum = 0; regnum < gdbarch_num_regs (gdbarch); regnum++)
- {
- struct packet_reg *r = ®s[regnum];
- if (register_size (gdbarch, regnum) == 0)
-
- r->pnum = -1;
- else
- r->pnum = gdbarch_remote_register_number (gdbarch, regnum);
- r->regnum = regnum;
- }
-
- remote_regs = alloca (gdbarch_num_regs (gdbarch)
- * sizeof (struct packet_reg *));
- for (num_remote_regs = 0, regnum = 0;
- regnum < gdbarch_num_regs (gdbarch);
- regnum++)
- if (regs[regnum].pnum != -1)
- remote_regs[num_remote_regs++] = ®s[regnum];
- qsort (remote_regs, num_remote_regs, sizeof (struct packet_reg *),
- compare_pnums);
- for (regnum = 0, offset = 0; regnum < num_remote_regs; regnum++)
- {
- remote_regs[regnum]->in_g_packet = 1;
- remote_regs[regnum]->offset = offset;
- offset += register_size (gdbarch, remote_regs[regnum]->regnum);
- }
- return offset;
- }
- int
- remote_register_number_and_offset (struct gdbarch *gdbarch, int regnum,
- int *pnum, int *poffset)
- {
- int sizeof_g_packet;
- struct packet_reg *regs;
- struct cleanup *old_chain;
- gdb_assert (regnum < gdbarch_num_regs (gdbarch));
- regs = xcalloc (gdbarch_num_regs (gdbarch), sizeof (struct packet_reg));
- old_chain = make_cleanup (xfree, regs);
- sizeof_g_packet = map_regcache_remote_table (gdbarch, regs);
- *pnum = regs[regnum].pnum;
- *poffset = regs[regnum].offset;
- do_cleanups (old_chain);
- return *pnum != -1;
- }
- static void *
- init_remote_state (struct gdbarch *gdbarch)
- {
- struct remote_state *rs = get_remote_state_raw ();
- struct remote_arch_state *rsa;
- rsa = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct remote_arch_state);
-
- rsa->regs = GDBARCH_OBSTACK_CALLOC (gdbarch,
- gdbarch_num_regs (gdbarch),
- struct packet_reg);
-
- rsa->sizeof_g_packet = map_regcache_remote_table (gdbarch, rsa->regs);
-
- rsa->remote_packet_size = 400 - 1;
-
- rsa->actual_register_packet_size = 0;
-
- if (rsa->sizeof_g_packet > ((rsa->remote_packet_size - 32) / 2))
- rsa->remote_packet_size = (rsa->sizeof_g_packet * 2 + 32);
-
- if (rs->buf_size < rsa->remote_packet_size)
- {
- rs->buf_size = 2 * rsa->remote_packet_size;
- rs->buf = xrealloc (rs->buf, rs->buf_size);
- }
- return rsa;
- }
- static long
- get_remote_packet_size (void)
- {
- struct remote_state *rs = get_remote_state ();
- struct remote_arch_state *rsa = get_remote_arch_state ();
- if (rs->explicit_packet_size)
- return rs->explicit_packet_size;
- return rsa->remote_packet_size;
- }
- static struct packet_reg *
- packet_reg_from_regnum (struct remote_arch_state *rsa, long regnum)
- {
- if (regnum < 0 && regnum >= gdbarch_num_regs (target_gdbarch ()))
- return NULL;
- else
- {
- struct packet_reg *r = &rsa->regs[regnum];
- gdb_assert (r->regnum == regnum);
- return r;
- }
- }
- static struct packet_reg *
- packet_reg_from_pnum (struct remote_arch_state *rsa, LONGEST pnum)
- {
- int i;
- for (i = 0; i < gdbarch_num_regs (target_gdbarch ()); i++)
- {
- struct packet_reg *r = &rsa->regs[i];
- if (r->pnum == pnum)
- return r;
- }
- return NULL;
- }
- static struct target_ops remote_ops;
- static struct target_ops extended_remote_ops;
- FIXME
- static int wait_forever_enabled_p = 1;
- const char interrupt_sequence_control_c[] = "Ctrl-C";
- const char interrupt_sequence_break[] = "BREAK";
- const char interrupt_sequence_break_g[] = "BREAK-g";
- static const char *const interrupt_sequence_modes[] =
- {
- interrupt_sequence_control_c,
- interrupt_sequence_break,
- interrupt_sequence_break_g,
- NULL
- };
- static const char *interrupt_sequence_mode = interrupt_sequence_control_c;
- static void
- show_interrupt_sequence (struct ui_file *file, int from_tty,
- struct cmd_list_element *c,
- const char *value)
- {
- if (interrupt_sequence_mode == interrupt_sequence_control_c)
- fprintf_filtered (file,
- _("Send the ASCII ETX character (Ctrl-c) "
- "to the remote target to interrupt the "
- "execution of the program.\n"));
- else if (interrupt_sequence_mode == interrupt_sequence_break)
- fprintf_filtered (file,
- _("send a break signal to the remote target "
- "to interrupt the execution of the program.\n"));
- else if (interrupt_sequence_mode == interrupt_sequence_break_g)
- fprintf_filtered (file,
- _("Send a break signal and 'g' a.k.a. Magic SysRq g to "
- "the remote target to interrupt the execution "
- "of Linux kernel.\n"));
- else
- internal_error (__FILE__, __LINE__,
- _("Invalid value for interrupt_sequence_mode: %s."),
- interrupt_sequence_mode);
- }
- static int interrupt_on_connect = 0;
- static int remote_break;
- static void
- set_remotebreak (char *args, int from_tty, struct cmd_list_element *c)
- {
- if (remote_break)
- interrupt_sequence_mode = interrupt_sequence_break;
- else
- interrupt_sequence_mode = interrupt_sequence_control_c;
- }
- static void
- show_remotebreak (struct ui_file *file, int from_tty,
- struct cmd_list_element *c,
- const char *value)
- {
- }
- static unsigned int remote_address_size;
- static int remote_async_terminal_ours_p;
- static char *remote_exec_file = "";
- struct memory_packet_config
- {
- char *name;
- long size;
- int fixed_p;
- };
- static long
- get_memory_packet_size (struct memory_packet_config *config)
- {
- struct remote_state *rs = get_remote_state ();
- struct remote_arch_state *rsa = get_remote_arch_state ();
-
- #ifndef MAX_REMOTE_PACKET_SIZE
- #define MAX_REMOTE_PACKET_SIZE 16384
- #endif
-
- #ifndef MIN_REMOTE_PACKET_SIZE
- #define MIN_REMOTE_PACKET_SIZE 20
- #endif
- long what_they_get;
- if (config->fixed_p)
- {
- if (config->size <= 0)
- what_they_get = MAX_REMOTE_PACKET_SIZE;
- else
- what_they_get = config->size;
- }
- else
- {
- what_they_get = get_remote_packet_size ();
-
- if (config->size > 0
- && what_they_get > config->size)
- what_they_get = config->size;
-
- if (rs->explicit_packet_size == 0
- && rsa->actual_register_packet_size > 0
- && what_they_get > rsa->actual_register_packet_size)
- what_they_get = rsa->actual_register_packet_size;
- }
- if (what_they_get > MAX_REMOTE_PACKET_SIZE)
- what_they_get = MAX_REMOTE_PACKET_SIZE;
- if (what_they_get < MIN_REMOTE_PACKET_SIZE)
- what_they_get = MIN_REMOTE_PACKET_SIZE;
-
- if (rs->buf_size < what_they_get + 1)
- {
- rs->buf_size = 2 * what_they_get;
- rs->buf = xrealloc (rs->buf, 2 * what_they_get);
- }
- return what_they_get;
- }
- static void
- set_memory_packet_size (char *args, struct memory_packet_config *config)
- {
- int fixed_p = config->fixed_p;
- long size = config->size;
- if (args == NULL)
- error (_("Argument required (integer, `fixed' or `limited')."));
- else if (strcmp (args, "hard") == 0
- || strcmp (args, "fixed") == 0)
- fixed_p = 1;
- else if (strcmp (args, "soft") == 0
- || strcmp (args, "limit") == 0)
- fixed_p = 0;
- else
- {
- char *end;
- size = strtoul (args, &end, 0);
- if (args == end)
- error (_("Invalid %s (bad syntax)."), config->name);
- #if 0
- #endif
- }
-
- if (fixed_p && !config->fixed_p)
- {
- if (! query (_("The target may not be able to correctly handle a %s\n"
- "of %ld bytes. Change the packet size? "),
- config->name, size))
- error (_("Packet size not changed."));
- }
-
- config->fixed_p = fixed_p;
- config->size = size;
- }
- static void
- show_memory_packet_size (struct memory_packet_config *config)
- {
- printf_filtered (_("The %s is %ld. "), config->name, config->size);
- if (config->fixed_p)
- printf_filtered (_("Packets are fixed at %ld bytes.\n"),
- get_memory_packet_size (config));
- else
- printf_filtered (_("Packets are limited to %ld bytes.\n"),
- get_memory_packet_size (config));
- }
- static struct memory_packet_config memory_write_packet_config =
- {
- "memory-write-packet-size",
- };
- static void
- set_memory_write_packet_size (char *args, int from_tty)
- {
- set_memory_packet_size (args, &memory_write_packet_config);
- }
- static void
- show_memory_write_packet_size (char *args, int from_tty)
- {
- show_memory_packet_size (&memory_write_packet_config);
- }
- static long
- get_memory_write_packet_size (void)
- {
- return get_memory_packet_size (&memory_write_packet_config);
- }
- static struct memory_packet_config memory_read_packet_config =
- {
- "memory-read-packet-size",
- };
- static void
- set_memory_read_packet_size (char *args, int from_tty)
- {
- set_memory_packet_size (args, &memory_read_packet_config);
- }
- static void
- show_memory_read_packet_size (char *args, int from_tty)
- {
- show_memory_packet_size (&memory_read_packet_config);
- }
- static long
- get_memory_read_packet_size (void)
- {
- long size = get_memory_packet_size (&memory_read_packet_config);
- FIXME
- if (size > get_remote_packet_size ())
- size = get_remote_packet_size ();
- return size;
- }
- enum packet_support
- {
- PACKET_SUPPORT_UNKNOWN = 0,
- PACKET_ENABLE,
- PACKET_DISABLE
- };
- struct packet_config
- {
- const char *name;
- const char *title;
-
- enum auto_boolean detect;
-
- enum packet_support support;
- };
- enum packet_result
- {
- PACKET_ERROR,
- PACKET_OK,
- PACKET_UNKNOWN
- };
- static enum packet_support packet_config_support (struct packet_config *config);
- static enum packet_support packet_support (int packet);
- static void
- show_packet_config_cmd (struct packet_config *config)
- {
- char *support = "internal-error";
- switch (packet_config_support (config))
- {
- case PACKET_ENABLE:
- support = "enabled";
- break;
- case PACKET_DISABLE:
- support = "disabled";
- break;
- case PACKET_SUPPORT_UNKNOWN:
- support = "unknown";
- break;
- }
- switch (config->detect)
- {
- case AUTO_BOOLEAN_AUTO:
- printf_filtered (_("Support for the `%s' packet "
- "is auto-detected, currently %s.\n"),
- config->name, support);
- break;
- case AUTO_BOOLEAN_TRUE:
- case AUTO_BOOLEAN_FALSE:
- printf_filtered (_("Support for the `%s' packet is currently %s.\n"),
- config->name, support);
- break;
- }
- }
- static void
- add_packet_config_cmd (struct packet_config *config, const char *name,
- const char *title, int legacy)
- {
- char *set_doc;
- char *show_doc;
- char *cmd_name;
- config->name = name;
- config->title = title;
- set_doc = xstrprintf ("Set use of remote protocol `%s' (%s) packet",
- name, title);
- show_doc = xstrprintf ("Show current use of remote "
- "protocol `%s' (%s) packet",
- name, title);
-
- cmd_name = xstrprintf ("%s-packet", title);
- add_setshow_auto_boolean_cmd (cmd_name, class_obscure,
- &config->detect, set_doc,
- show_doc, NULL,
- NULL,
- show_remote_protocol_packet_cmd,
- &remote_set_cmdlist, &remote_show_cmdlist);
-
- xfree (set_doc);
- xfree (show_doc);
-
- if (legacy)
- {
- char *legacy_name;
- legacy_name = xstrprintf ("%s-packet", name);
- add_alias_cmd (legacy_name, cmd_name, class_obscure, 0,
- &remote_set_cmdlist);
- add_alias_cmd (legacy_name, cmd_name, class_obscure, 0,
- &remote_show_cmdlist);
- }
- }
- static enum packet_result
- packet_check_result (const char *buf)
- {
- if (buf[0] != '\0')
- {
-
- if (buf[0] == 'E'
- && isxdigit (buf[1]) && isxdigit (buf[2])
- && buf[3] == '\0')
-
- return PACKET_ERROR;
-
- if (buf[0] == 'E' && buf[1] == '.')
- return PACKET_ERROR;
-
- return PACKET_OK;
- }
- else
-
- return PACKET_UNKNOWN;
- }
- static enum packet_result
- packet_ok (const char *buf, struct packet_config *config)
- {
- enum packet_result result;
- if (config->detect != AUTO_BOOLEAN_TRUE
- && config->support == PACKET_DISABLE)
- internal_error (__FILE__, __LINE__,
- _("packet_ok: attempt to use a disabled packet"));
- result = packet_check_result (buf);
- switch (result)
- {
- case PACKET_OK:
- case PACKET_ERROR:
-
- if (config->support == PACKET_SUPPORT_UNKNOWN)
- {
- if (remote_debug)
- fprintf_unfiltered (gdb_stdlog,
- "Packet %s (%s) is supported\n",
- config->name, config->title);
- config->support = PACKET_ENABLE;
- }
- break;
- case PACKET_UNKNOWN:
-
- if (config->detect == AUTO_BOOLEAN_AUTO
- && config->support == PACKET_ENABLE)
- {
-
- error (_("Protocol error: %s (%s) conflicting enabled responses."),
- config->name, config->title);
- }
- else if (config->detect == AUTO_BOOLEAN_TRUE)
- {
-
- error (_("Enabled packet %s (%s) not recognized by stub"),
- config->name, config->title);
- }
- if (remote_debug)
- fprintf_unfiltered (gdb_stdlog,
- "Packet %s (%s) is NOT supported\n",
- config->name, config->title);
- config->support = PACKET_DISABLE;
- break;
- }
- return result;
- }
- enum {
- PACKET_vCont = 0,
- PACKET_X,
- PACKET_qSymbol,
- PACKET_P,
- PACKET_p,
- PACKET_Z0,
- PACKET_Z1,
- PACKET_Z2,
- PACKET_Z3,
- PACKET_Z4,
- PACKET_vFile_open,
- PACKET_vFile_pread,
- PACKET_vFile_pwrite,
- PACKET_vFile_close,
- PACKET_vFile_unlink,
- PACKET_vFile_readlink,
- PACKET_qXfer_auxv,
- PACKET_qXfer_features,
- PACKET_qXfer_libraries,
- PACKET_qXfer_libraries_svr4,
- PACKET_qXfer_memory_map,
- PACKET_qXfer_spu_read,
- PACKET_qXfer_spu_write,
- PACKET_qXfer_osdata,
- PACKET_qXfer_threads,
- PACKET_qXfer_statictrace_read,
- PACKET_qXfer_traceframe_info,
- PACKET_qXfer_uib,
- PACKET_qGetTIBAddr,
- PACKET_qGetTLSAddr,
- PACKET_qSupported,
- PACKET_qTStatus,
- PACKET_QPassSignals,
- PACKET_QProgramSignals,
- PACKET_qCRC,
- PACKET_qSearch_memory,
- PACKET_vAttach,
- PACKET_vRun,
- PACKET_QStartNoAckMode,
- PACKET_vKill,
- PACKET_qXfer_siginfo_read,
- PACKET_qXfer_siginfo_write,
- PACKET_qAttached,
-
- PACKET_ConditionalTracepoints,
-
- PACKET_ConditionalBreakpoints,
-
- PACKET_BreakpointCommands,
-
- PACKET_FastTracepoints,
-
- PACKET_StaticTracepoints,
-
- PACKET_InstallInTrace,
- PACKET_bc,
- PACKET_bs,
- PACKET_TracepointSource,
- PACKET_QAllow,
- PACKET_qXfer_fdpic,
- PACKET_QDisableRandomization,
- PACKET_QAgent,
- PACKET_QTBuffer_size,
- PACKET_Qbtrace_off,
- PACKET_Qbtrace_bts,
- PACKET_qXfer_btrace,
-
- PACKET_QNonStop,
-
- PACKET_multiprocess_feature,
-
- PACKET_EnableDisableTracepoints_feature,
-
- PACKET_tracenz_feature,
-
- PACKET_DisconnectedTracing_feature,
-
- PACKET_augmented_libraries_svr4_read_feature,
- PACKET_MAX
- };
- static struct packet_config remote_protocol_packets[PACKET_MAX];
- static enum packet_support
- packet_config_support (struct packet_config *config)
- {
- switch (config->detect)
- {
- case AUTO_BOOLEAN_TRUE:
- return PACKET_ENABLE;
- case AUTO_BOOLEAN_FALSE:
- return PACKET_DISABLE;
- case AUTO_BOOLEAN_AUTO:
- return config->support;
- default:
- gdb_assert_not_reached (_("bad switch"));
- }
- }
- static enum packet_support
- packet_support (int packet)
- {
- struct packet_config *config = &remote_protocol_packets[packet];
- return packet_config_support (config);
- }
- static void
- show_remote_protocol_packet_cmd (struct ui_file *file, int from_tty,
- struct cmd_list_element *c,
- const char *value)
- {
- struct packet_config *packet;
- for (packet = remote_protocol_packets;
- packet < &remote_protocol_packets[PACKET_MAX];
- packet++)
- {
- if (&packet->detect == c->var)
- {
- show_packet_config_cmd (packet);
- return;
- }
- }
- internal_error (__FILE__, __LINE__, _("Could not find config for %s"),
- c->name);
- }
- enum Z_packet_type
- {
- Z_PACKET_SOFTWARE_BP,
- Z_PACKET_HARDWARE_BP,
- Z_PACKET_WRITE_WP,
- Z_PACKET_READ_WP,
- Z_PACKET_ACCESS_WP,
- NR_Z_PACKET_TYPES
- };
- static enum auto_boolean remote_Z_packet_detect;
- static void
- set_remote_protocol_Z_packet_cmd (char *args, int from_tty,
- struct cmd_list_element *c)
- {
- int i;
- for (i = 0; i < NR_Z_PACKET_TYPES; i++)
- remote_protocol_packets[PACKET_Z0 + i].detect = remote_Z_packet_detect;
- }
- static void
- show_remote_protocol_Z_packet_cmd (struct ui_file *file, int from_tty,
- struct cmd_list_element *c,
- const char *value)
- {
- int i;
- for (i = 0; i < NR_Z_PACKET_TYPES; i++)
- {
- show_packet_config_cmd (&remote_protocol_packets[PACKET_Z0 + i]);
- }
- }
- static int
- remote_multi_process_p (struct remote_state *rs)
- {
- return packet_support (PACKET_multiprocess_feature) == PACKET_ENABLE;
- }
- static struct async_signal_handler *async_sigint_remote_twice_token;
- static struct async_signal_handler *async_sigint_remote_token;
- static struct async_event_handler *remote_async_inferior_event_token;
- static ptid_t magic_null_ptid;
- static ptid_t not_sent_ptid;
- static ptid_t any_thread_ptid;
- static int
- remote_query_attached (int pid)
- {
- struct remote_state *rs = get_remote_state ();
- size_t size = get_remote_packet_size ();
- if (packet_support (PACKET_qAttached) == PACKET_DISABLE)
- return 0;
- if (remote_multi_process_p (rs))
- xsnprintf (rs->buf, size, "qAttached:%x", pid);
- else
- xsnprintf (rs->buf, size, "qAttached");
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
- switch (packet_ok (rs->buf,
- &remote_protocol_packets[PACKET_qAttached]))
- {
- case PACKET_OK:
- if (strcmp (rs->buf, "1") == 0)
- return 1;
- break;
- case PACKET_ERROR:
- warning (_("Remote failure reply: %s"), rs->buf);
- break;
- case PACKET_UNKNOWN:
- break;
- }
- return 0;
- }
- static struct inferior *
- remote_add_inferior (int fake_pid_p, int pid, int attached)
- {
- struct inferior *inf;
-
- if (attached == -1)
- attached = remote_query_attached (pid);
- if (gdbarch_has_global_solist (target_gdbarch ()))
- {
-
- inf = add_inferior (pid);
-
- inf->aspace = maybe_new_address_space ();
- inf->pspace = current_program_space;
- }
- else
- {
-
- inf = current_inferior ();
- inferior_appeared (inf, pid);
- }
- inf->attach_flag = attached;
- inf->fake_pid_p = fake_pid_p;
- return inf;
- }
- static void
- remote_add_thread (ptid_t ptid, int running)
- {
- struct remote_state *rs = get_remote_state ();
-
- if (rs->starting_up)
- add_thread_silent (ptid);
- else
- add_thread (ptid);
- set_executing (ptid, running);
- set_running (ptid, running);
- }
- static void
- remote_notice_new_inferior (ptid_t currthread, int running)
- {
-
- if (in_thread_list (currthread) && is_exited (currthread))
- {
-
- remote_add_thread (currthread, running);
- return;
- }
- if (!in_thread_list (currthread))
- {
- struct inferior *inf = NULL;
- int pid = ptid_get_pid (currthread);
- if (ptid_is_pid (inferior_ptid)
- && pid == ptid_get_pid (inferior_ptid))
- {
-
- if (in_thread_list (pid_to_ptid (pid)))
- thread_change_ptid (inferior_ptid, currthread);
- else
- {
- remote_add_thread (currthread, running);
- inferior_ptid = currthread;
- }
- return;
- }
- if (ptid_equal (magic_null_ptid, inferior_ptid))
- {
-
- thread_change_ptid (inferior_ptid, currthread);
- return;
- }
-
- if (!in_inferior_list (ptid_get_pid (currthread)))
- {
- struct remote_state *rs = get_remote_state ();
- int fake_pid_p = !remote_multi_process_p (rs);
- inf = remote_add_inferior (fake_pid_p,
- ptid_get_pid (currthread), -1);
- }
-
- remote_add_thread (currthread, running);
-
- if (inf != NULL)
- {
- struct remote_state *rs = get_remote_state ();
- if (non_stop || !rs->starting_up)
- notice_new_inferior (currthread, running, 0);
- }
- }
- }
- static struct private_thread_info *
- demand_private_info (ptid_t ptid)
- {
- struct thread_info *info = find_thread_ptid (ptid);
- gdb_assert (info);
- if (!info->private)
- {
- info->private = xmalloc (sizeof (*(info->private)));
- info->private_dtor = free_private_thread_info;
- info->private->core = -1;
- info->private->extra = 0;
- }
- return info->private;
- }
- static void
- record_currthread (struct remote_state *rs, ptid_t currthread)
- {
- rs->general_thread = currthread;
- }
- static void
- remote_pass_signals (struct target_ops *self,
- int numsigs, unsigned char *pass_signals)
- {
- if (packet_support (PACKET_QPassSignals) != PACKET_DISABLE)
- {
- char *pass_packet, *p;
- int count = 0, i;
- struct remote_state *rs = get_remote_state ();
- gdb_assert (numsigs < 256);
- for (i = 0; i < numsigs; i++)
- {
- if (pass_signals[i])
- count++;
- }
- pass_packet = xmalloc (count * 3 + strlen ("QPassSignals:") + 1);
- strcpy (pass_packet, "QPassSignals:");
- p = pass_packet + strlen (pass_packet);
- for (i = 0; i < numsigs; i++)
- {
- if (pass_signals[i])
- {
- if (i >= 16)
- *p++ = tohex (i >> 4);
- *p++ = tohex (i & 15);
- if (count)
- *p++ = ';';
- else
- break;
- count--;
- }
- }
- *p = 0;
- if (!rs->last_pass_packet || strcmp (rs->last_pass_packet, pass_packet))
- {
- putpkt (pass_packet);
- getpkt (&rs->buf, &rs->buf_size, 0);
- packet_ok (rs->buf, &remote_protocol_packets[PACKET_QPassSignals]);
- if (rs->last_pass_packet)
- xfree (rs->last_pass_packet);
- rs->last_pass_packet = pass_packet;
- }
- else
- xfree (pass_packet);
- }
- }
- static void
- remote_program_signals (struct target_ops *self,
- int numsigs, unsigned char *signals)
- {
- if (packet_support (PACKET_QProgramSignals) != PACKET_DISABLE)
- {
- char *packet, *p;
- int count = 0, i;
- struct remote_state *rs = get_remote_state ();
- gdb_assert (numsigs < 256);
- for (i = 0; i < numsigs; i++)
- {
- if (signals[i])
- count++;
- }
- packet = xmalloc (count * 3 + strlen ("QProgramSignals:") + 1);
- strcpy (packet, "QProgramSignals:");
- p = packet + strlen (packet);
- for (i = 0; i < numsigs; i++)
- {
- if (signal_pass_state (i))
- {
- if (i >= 16)
- *p++ = tohex (i >> 4);
- *p++ = tohex (i & 15);
- if (count)
- *p++ = ';';
- else
- break;
- count--;
- }
- }
- *p = 0;
- if (!rs->last_program_signals_packet
- || strcmp (rs->last_program_signals_packet, packet) != 0)
- {
- putpkt (packet);
- getpkt (&rs->buf, &rs->buf_size, 0);
- packet_ok (rs->buf, &remote_protocol_packets[PACKET_QProgramSignals]);
- xfree (rs->last_program_signals_packet);
- rs->last_program_signals_packet = packet;
- }
- else
- xfree (packet);
- }
- }
- static void
- set_thread (struct ptid ptid, int gen)
- {
- struct remote_state *rs = get_remote_state ();
- ptid_t state = gen ? rs->general_thread : rs->continue_thread;
- char *buf = rs->buf;
- char *endbuf = rs->buf + get_remote_packet_size ();
- if (ptid_equal (state, ptid))
- return;
- *buf++ = 'H';
- *buf++ = gen ? 'g' : 'c';
- if (ptid_equal (ptid, magic_null_ptid))
- xsnprintf (buf, endbuf - buf, "0");
- else if (ptid_equal (ptid, any_thread_ptid))
- xsnprintf (buf, endbuf - buf, "0");
- else if (ptid_equal (ptid, minus_one_ptid))
- xsnprintf (buf, endbuf - buf, "-1");
- else
- write_ptid (buf, endbuf, ptid);
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
- if (gen)
- rs->general_thread = ptid;
- else
- rs->continue_thread = ptid;
- }
- static void
- set_general_thread (struct ptid ptid)
- {
- set_thread (ptid, 1);
- }
- static void
- set_continue_thread (struct ptid ptid)
- {
- set_thread (ptid, 0);
- }
- static void
- set_general_process (void)
- {
- struct remote_state *rs = get_remote_state ();
-
- if (!rs->extended || !remote_multi_process_p (rs))
- return;
-
- if (ptid_get_pid (rs->general_thread) != ptid_get_pid (inferior_ptid))
- set_general_thread (inferior_ptid);
- }
- static int
- remote_thread_always_alive (struct target_ops *ops, ptid_t ptid)
- {
- struct remote_state *rs = get_remote_state ();
- char *p, *endp;
- if (ptid_equal (ptid, magic_null_ptid))
-
- return 1;
- if (ptid_get_pid (ptid) != 0 && ptid_get_lwp (ptid) == 0)
-
- return 1;
- return 0;
- }
- static int
- remote_thread_alive (struct target_ops *ops, ptid_t ptid)
- {
- struct remote_state *rs = get_remote_state ();
- char *p, *endp;
-
- if (remote_thread_always_alive (ops, ptid))
- return 1;
- p = rs->buf;
- endp = rs->buf + get_remote_packet_size ();
- *p++ = 'T';
- write_ptid (p, endp, ptid);
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
- return (rs->buf[0] == 'O' && rs->buf[1] == 'K');
- }
- typedef int gdb_threadref;
- struct gdb_ext_thread_info
- {
- threadref threadid;
- int active;
- char display[256];
- char shortname[32];
- char more_display[256];
- };
- FIXME
- #define TAG_THREADID 1
- #define TAG_EXISTS 2
- #define TAG_DISPLAY 4
- #define TAG_THREADNAME 8
- #define TAG_MOREDISPLAY 16
- #define BUF_THREAD_ID_SIZE (OPAQUETHREADBYTES * 2)
- static char *unpack_nibble (char *buf, int *val);
- static char *unpack_byte (char *buf, int *value);
- static char *pack_int (char *buf, int value);
- static char *unpack_int (char *buf, int *value);
- static char *unpack_string (char *src, char *dest, int length);
- static char *pack_threadid (char *pkt, threadref *id);
- static char *unpack_threadid (char *inbuf, threadref *id);
- void int_to_threadref (threadref *id, int value);
- static int threadref_to_int (threadref *ref);
- static void copy_threadref (threadref *dest, threadref *src);
- static int threadmatch (threadref *dest, threadref *src);
- static char *pack_threadinfo_request (char *pkt, int mode,
- threadref *id);
- static int remote_unpack_thread_info_response (char *pkt,
- threadref *expectedref,
- struct gdb_ext_thread_info
- *info);
- static int remote_get_threadinfo (threadref *threadid,
- int fieldset,
- struct gdb_ext_thread_info *info);
- static char *pack_threadlist_request (char *pkt, int startflag,
- int threadcount,
- threadref *nextthread);
- static int parse_threadlist_response (char *pkt,
- int result_limit,
- threadref *original_echo,
- threadref *resultlist,
- int *doneflag);
- static int remote_get_threadlist (int startflag,
- threadref *nextthread,
- int result_limit,
- int *done,
- int *result_count,
- threadref *threadlist);
- typedef int (*rmt_thread_action) (threadref *ref, void *context);
- static int remote_threadlist_iterator (rmt_thread_action stepfunction,
- void *context, int looplimit);
- static int remote_newthread_step (threadref *ref, void *context);
- static char *
- write_ptid (char *buf, const char *endbuf, ptid_t ptid)
- {
- int pid, tid;
- struct remote_state *rs = get_remote_state ();
- if (remote_multi_process_p (rs))
- {
- pid = ptid_get_pid (ptid);
- if (pid < 0)
- buf += xsnprintf (buf, endbuf - buf, "p-%x.", -pid);
- else
- buf += xsnprintf (buf, endbuf - buf, "p%x.", pid);
- }
- tid = ptid_get_lwp (ptid);
- if (tid < 0)
- buf += xsnprintf (buf, endbuf - buf, "-%x", -tid);
- else
- buf += xsnprintf (buf, endbuf - buf, "%x", tid);
- return buf;
- }
- static ptid_t
- read_ptid (char *buf, char **obuf)
- {
- char *p = buf;
- char *pp;
- ULONGEST pid = 0, tid = 0;
- if (*p == 'p')
- {
-
- pp = unpack_varlen_hex (p + 1, &pid);
- if (*pp != '.')
- error (_("invalid remote ptid: %s"), p);
- p = pp;
- pp = unpack_varlen_hex (p + 1, &tid);
- if (obuf)
- *obuf = pp;
- return ptid_build (pid, tid, 0);
- }
-
- pp = unpack_varlen_hex (p, &tid);
-
- if (ptid_equal (inferior_ptid, null_ptid))
- pid = ptid_get_pid (magic_null_ptid);
- else
- pid = ptid_get_pid (inferior_ptid);
- if (obuf)
- *obuf = pp;
- return ptid_build (pid, tid, 0);
- }
- static int
- stubhex (int ch)
- {
- if (ch >= 'a' && ch <= 'f')
- return ch - 'a' + 10;
- if (ch >= '0' && ch <= '9')
- return ch - '0';
- if (ch >= 'A' && ch <= 'F')
- return ch - 'A' + 10;
- return -1;
- }
- static int
- stub_unpack_int (char *buff, int fieldlength)
- {
- int nibble;
- int retval = 0;
- while (fieldlength)
- {
- nibble = stubhex (*buff++);
- retval |= nibble;
- fieldlength--;
- if (fieldlength)
- retval = retval << 4;
- }
- return retval;
- }
- static char *
- unpack_nibble (char *buf, int *val)
- {
- *val = fromhex (*buf++);
- return buf;
- }
- static char *
- unpack_byte (char *buf, int *value)
- {
- *value = stub_unpack_int (buf, 2);
- return buf + 2;
- }
- static char *
- pack_int (char *buf, int value)
- {
- buf = pack_hex_byte (buf, (value >> 24) & 0xff);
- buf = pack_hex_byte (buf, (value >> 16) & 0xff);
- buf = pack_hex_byte (buf, (value >> 8) & 0x0ff);
- buf = pack_hex_byte (buf, (value & 0xff));
- return buf;
- }
- static char *
- unpack_int (char *buf, int *value)
- {
- *value = stub_unpack_int (buf, 8);
- return buf + 8;
- }
- #if 0
- #endif
- static char *
- unpack_string (char *src, char *dest, int length)
- {
- while (length--)
- *dest++ = *src++;
- *dest = '\0';
- return src;
- }
- static char *
- pack_threadid (char *pkt, threadref *id)
- {
- char *limit;
- unsigned char *altid;
- altid = (unsigned char *) id;
- limit = pkt + BUF_THREAD_ID_SIZE;
- while (pkt < limit)
- pkt = pack_hex_byte (pkt, *altid++);
- return pkt;
- }
- static char *
- unpack_threadid (char *inbuf, threadref *id)
- {
- char *altref;
- char *limit = inbuf + BUF_THREAD_ID_SIZE;
- int x, y;
- altref = (char *) id;
- while (inbuf < limit)
- {
- x = stubhex (*inbuf++);
- y = stubhex (*inbuf++);
- *altref++ = (x << 4) | y;
- }
- return inbuf;
- }
- void
- int_to_threadref (threadref *id, int value)
- {
- unsigned char *scan;
- scan = (unsigned char *) id;
- {
- int i = 4;
- while (i--)
- *scan++ = 0;
- }
- *scan++ = (value >> 24) & 0xff;
- *scan++ = (value >> 16) & 0xff;
- *scan++ = (value >> 8) & 0xff;
- *scan++ = (value & 0xff);
- }
- static int
- threadref_to_int (threadref *ref)
- {
- int i, value = 0;
- unsigned char *scan;
- scan = *ref;
- scan += 4;
- i = 4;
- while (i-- > 0)
- value = (value << 8) | ((*scan++) & 0xff);
- return value;
- }
- static void
- copy_threadref (threadref *dest, threadref *src)
- {
- int i;
- unsigned char *csrc, *cdest;
- csrc = (unsigned char *) src;
- cdest = (unsigned char *) dest;
- i = 8;
- while (i--)
- *cdest++ = *csrc++;
- }
- static int
- threadmatch (threadref *dest, threadref *src)
- {
-
- #if 0
- #endif
- return 1;
- }
- static char *
- pack_threadinfo_request (char *pkt, int mode, threadref *id)
- {
- *pkt++ = 'q';
- *pkt++ = 'P';
- pkt = pack_int (pkt, mode);
- pkt = pack_threadid (pkt, id);
- *pkt = '\0';
- return pkt;
- }
- #define TAG_THREADID 1
- #define TAG_EXISTS 2
- #define TAG_DISPLAY 4
- #define TAG_THREADNAME 8
- #define TAG_MOREDISPLAY 16
- static int
- remote_unpack_thread_info_response (char *pkt, threadref *expectedref,
- struct gdb_ext_thread_info *info)
- {
- struct remote_state *rs = get_remote_state ();
- int mask, length;
- int tag;
- threadref ref;
- char *limit = pkt + rs->buf_size;
- int retval = 1;
- FIXME
- info->active = 0;
- info->display[0] = '\0';
- info->shortname[0] = '\0';
- info->more_display[0] = '\0';
-
- pkt = unpack_int (pkt, &mask);
- pkt = unpack_threadid (pkt, &ref);
- if (mask == 0)
- warning (_("Incomplete response to threadinfo request."));
- if (!threadmatch (&ref, expectedref))
- {
- warning (_("ERROR RMT Thread info mismatch."));
- return 0;
- }
- copy_threadref (&info->threadid, &ref);
-
-
- while ((pkt < limit) && mask && *pkt)
- {
- pkt = unpack_int (pkt, &tag);
- pkt = unpack_byte (pkt, &length);
- if (!(tag & mask))
- {
- warning (_("ERROR RMT: threadinfo tag mismatch."));
- retval = 0;
- break;
- }
- if (tag == TAG_THREADID)
- {
- if (length != 16)
- {
- warning (_("ERROR RMT: length of threadid is not 16."));
- retval = 0;
- break;
- }
- pkt = unpack_threadid (pkt, &ref);
- mask = mask & ~TAG_THREADID;
- continue;
- }
- if (tag == TAG_EXISTS)
- {
- info->active = stub_unpack_int (pkt, length);
- pkt += length;
- mask = mask & ~(TAG_EXISTS);
- if (length > 8)
- {
- warning (_("ERROR RMT: 'exists' length too long."));
- retval = 0;
- break;
- }
- continue;
- }
- if (tag == TAG_THREADNAME)
- {
- pkt = unpack_string (pkt, &info->shortname[0], length);
- mask = mask & ~TAG_THREADNAME;
- continue;
- }
- if (tag == TAG_DISPLAY)
- {
- pkt = unpack_string (pkt, &info->display[0], length);
- mask = mask & ~TAG_DISPLAY;
- continue;
- }
- if (tag == TAG_MOREDISPLAY)
- {
- pkt = unpack_string (pkt, &info->more_display[0], length);
- mask = mask & ~TAG_MOREDISPLAY;
- continue;
- }
- warning (_("ERROR RMT: unknown thread info tag."));
- break;
- }
- return retval;
- }
- static int
- remote_get_threadinfo (threadref *threadid, int fieldset,
- struct gdb_ext_thread_info *info)
- {
- struct remote_state *rs = get_remote_state ();
- int result;
- pack_threadinfo_request (rs->buf, fieldset, threadid);
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
- if (rs->buf[0] == '\0')
- return 0;
- result = remote_unpack_thread_info_response (rs->buf + 2,
- threadid, info);
- return result;
- }
- static char *
- pack_threadlist_request (char *pkt, int startflag, int threadcount,
- threadref *nextthread)
- {
- *pkt++ = 'q';
- *pkt++ = 'L';
- pkt = pack_nibble (pkt, startflag);
- pkt = pack_hex_byte (pkt, threadcount);
- pkt = pack_threadid (pkt, nextthread);
- *pkt = '\0';
- return pkt;
- }
- static int
- parse_threadlist_response (char *pkt, int result_limit,
- threadref *original_echo, threadref *resultlist,
- int *doneflag)
- {
- struct remote_state *rs = get_remote_state ();
- char *limit;
- int count, resultcount, done;
- resultcount = 0;
-
- limit = pkt + (rs->buf_size - BUF_THREAD_ID_SIZE);
-
- pkt = unpack_byte (pkt, &count);
- pkt = unpack_nibble (pkt, &done);
-
- pkt = unpack_threadid (pkt, original_echo);
- while ((count-- > 0) && (pkt < limit))
- {
- pkt = unpack_threadid (pkt, resultlist++);
- if (resultcount++ >= result_limit)
- break;
- }
- if (doneflag)
- *doneflag = done;
- return resultcount;
- }
- static int
- remote_get_threadlist (int startflag, threadref *nextthread, int result_limit,
- int *done, int *result_count, threadref *threadlist)
- {
- struct remote_state *rs = get_remote_state ();
- int result = 1;
-
- if ((((result_limit + 1) * BUF_THREAD_ID_SIZE) + 10)
- >= get_remote_packet_size ())
- result_limit = (get_remote_packet_size () / BUF_THREAD_ID_SIZE) - 2;
- pack_threadlist_request (rs->buf, startflag, result_limit, nextthread);
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
- if (*rs->buf == '\0')
- {
-
- return -1;
- }
- *result_count =
- parse_threadlist_response (rs->buf + 2, result_limit,
- &rs->echo_nextthread, threadlist, done);
- if (!threadmatch (&rs->echo_nextthread, nextthread))
- {
- FIXME
-
-
- warning (_("HMM: threadlist did not echo arg thread, dropping it."));
- return 0;
- }
- if (*result_count <= 0)
- {
- if (*done != 1)
- {
- warning (_("RMT ERROR : failed to get remote thread list."));
- result = 0;
- }
- return result;
- }
- if (*result_count > result_limit)
- {
- *result_count = 0;
- warning (_("RMT ERROR: threadlist response longer than requested."));
- return 0;
- }
- return result;
- }
- static int
- remote_threadlist_iterator (rmt_thread_action stepfunction, void *context,
- int looplimit)
- {
- struct remote_state *rs = get_remote_state ();
- int done, i, result_count;
- int startflag = 1;
- int result = 1;
- int loopcount = 0;
- done = 0;
- while (!done)
- {
- if (loopcount++ > looplimit)
- {
- result = 0;
- warning (_("Remote fetch threadlist -infinite loop-."));
- break;
- }
- result = remote_get_threadlist (startflag, &rs->nextthread,
- MAXTHREADLISTRESULTS,
- &done, &result_count,
- rs->resultthreadlist);
- if (result <= 0)
- break;
-
- startflag = 0;
-
- if (result_count >= 1)
- copy_threadref (&rs->nextthread,
- &rs->resultthreadlist[result_count - 1]);
- i = 0;
- while (result_count--)
- {
- if (!(*stepfunction) (&rs->resultthreadlist[i++], context))
- {
- result = 0;
- break;
- }
- }
- }
- return result;
- }
- typedef struct thread_item
- {
-
- ptid_t ptid;
-
- char *extra;
-
- int core;
- } thread_item_t;
- DEF_VEC_O(thread_item_t);
- struct threads_listing_context
- {
-
- VEC (thread_item_t) *items;
- };
- static void
- clear_threads_listing_context (void *p)
- {
- struct threads_listing_context *context = p;
- int i;
- struct thread_item *item;
- for (i = 0; VEC_iterate (thread_item_t, context->items, i, item); ++i)
- xfree (item->extra);
- VEC_free (thread_item_t, context->items);
- }
- static int
- remote_newthread_step (threadref *ref, void *data)
- {
- struct threads_listing_context *context = data;
- struct thread_item item;
- int pid = ptid_get_pid (inferior_ptid);
- item.ptid = ptid_build (pid, threadref_to_int (ref), 0);
- item.core = -1;
- item.extra = NULL;
- VEC_safe_push (thread_item_t, context->items, &item);
- return 1;
- }
- #define CRAZY_MAX_THREADS 1000
- static ptid_t
- remote_current_thread (ptid_t oldpid)
- {
- struct remote_state *rs = get_remote_state ();
- putpkt ("qC");
- getpkt (&rs->buf, &rs->buf_size, 0);
- if (rs->buf[0] == 'Q' && rs->buf[1] == 'C')
- return read_ptid (&rs->buf[2], NULL);
- else
- return oldpid;
- }
- static int
- remote_get_threads_with_ql (struct target_ops *ops,
- struct threads_listing_context *context)
- {
- if (remote_threadlist_iterator (remote_newthread_step, context,
- CRAZY_MAX_THREADS) >= 0)
- return 1;
- return 0;
- }
- #if defined(HAVE_LIBEXPAT)
- static void
- start_thread (struct gdb_xml_parser *parser,
- const struct gdb_xml_element *element,
- void *user_data, VEC(gdb_xml_value_s) *attributes)
- {
- struct threads_listing_context *data = user_data;
- struct thread_item item;
- char *id;
- struct gdb_xml_value *attr;
- id = xml_find_attribute (attributes, "id")->value;
- item.ptid = read_ptid (id, NULL);
- attr = xml_find_attribute (attributes, "core");
- if (attr != NULL)
- item.core = *(ULONGEST *) attr->value;
- else
- item.core = -1;
- item.extra = 0;
- VEC_safe_push (thread_item_t, data->items, &item);
- }
- static void
- end_thread (struct gdb_xml_parser *parser,
- const struct gdb_xml_element *element,
- void *user_data, const char *body_text)
- {
- struct threads_listing_context *data = user_data;
- if (body_text && *body_text)
- VEC_last (thread_item_t, data->items)->extra = xstrdup (body_text);
- }
- const struct gdb_xml_attribute thread_attributes[] = {
- { "id", GDB_XML_AF_NONE, NULL, NULL },
- { "core", GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL },
- { NULL, GDB_XML_AF_NONE, NULL, NULL }
- };
- const struct gdb_xml_element thread_children[] = {
- { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
- };
- const struct gdb_xml_element threads_children[] = {
- { "thread", thread_attributes, thread_children,
- GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
- start_thread, end_thread },
- { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
- };
- const struct gdb_xml_element threads_elements[] = {
- { "threads", NULL, threads_children,
- GDB_XML_EF_NONE, NULL, NULL },
- { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
- };
- #endif
- static int
- remote_get_threads_with_qxfer (struct target_ops *ops,
- struct threads_listing_context *context)
- {
- #if defined(HAVE_LIBEXPAT)
- if (packet_support (PACKET_qXfer_threads) == PACKET_ENABLE)
- {
- char *xml = target_read_stralloc (ops, TARGET_OBJECT_THREADS, NULL);
- struct cleanup *back_to = make_cleanup (xfree, xml);
- if (xml != NULL && *xml != '\0')
- {
- gdb_xml_parse_quick (_("threads"), "threads.dtd",
- threads_elements, xml, context);
- }
- do_cleanups (back_to);
- return 1;
- }
- #endif
- return 0;
- }
- static int
- remote_get_threads_with_qthreadinfo (struct target_ops *ops,
- struct threads_listing_context *context)
- {
- struct remote_state *rs = get_remote_state ();
- if (rs->use_threadinfo_query)
- {
- char *bufp;
- putpkt ("qfThreadInfo");
- getpkt (&rs->buf, &rs->buf_size, 0);
- bufp = rs->buf;
- if (bufp[0] != '\0')
- {
- while (*bufp++ == 'm')
- {
- do
- {
- struct thread_item item;
- item.ptid = read_ptid (bufp, &bufp);
- item.core = -1;
- item.extra = NULL;
- VEC_safe_push (thread_item_t, context->items, &item);
- }
- while (*bufp++ == ',');
- putpkt ("qsThreadInfo");
- getpkt (&rs->buf, &rs->buf_size, 0);
- bufp = rs->buf;
- }
- return 1;
- }
- else
- {
-
- rs->use_threadinfo_query = 0;
- }
- }
- return 0;
- }
- static void
- remote_update_thread_list (struct target_ops *ops)
- {
- struct remote_state *rs = get_remote_state ();
- struct threads_listing_context context;
- struct cleanup *old_chain;
- int got_list = 0;
- context.items = NULL;
- old_chain = make_cleanup (clear_threads_listing_context, &context);
-
- if (remote_get_threads_with_qxfer (ops, &context)
- || remote_get_threads_with_qthreadinfo (ops, &context)
- || remote_get_threads_with_ql (ops, &context))
- {
- int i;
- struct thread_item *item;
- struct thread_info *tp, *tmp;
- got_list = 1;
- if (VEC_empty (thread_item_t, context.items)
- && remote_thread_always_alive (ops, inferior_ptid))
- {
-
- do_cleanups (old_chain);
- return;
- }
-
- ALL_NON_EXITED_THREADS_SAFE (tp, tmp)
- {
- for (i = 0;
- VEC_iterate (thread_item_t, context.items, i, item);
- ++i)
- {
- if (ptid_equal (item->ptid, tp->ptid))
- break;
- }
- if (i == VEC_length (thread_item_t, context.items))
- {
-
- delete_thread (tp->ptid);
- }
- }
-
- for (i = 0;
- VEC_iterate (thread_item_t, context.items, i, item);
- ++i)
- {
- if (!ptid_equal (item->ptid, null_ptid))
- {
- struct private_thread_info *info;
-
- int running = non_stop ? 1 : 0;
- remote_notice_new_inferior (item->ptid, running);
- info = demand_private_info (item->ptid);
- info->core = item->core;
- info->extra = item->extra;
- item->extra = NULL;
- }
- }
- }
- if (!got_list)
- {
-
- prune_threads ();
- }
- do_cleanups (old_chain);
- }
- static char *
- remote_threads_extra_info (struct target_ops *self, struct thread_info *tp)
- {
- struct remote_state *rs = get_remote_state ();
- int result;
- int set;
- threadref id;
- struct gdb_ext_thread_info threadinfo;
- static char display_buf[100];
- int n = 0;
- if (rs->remote_desc == 0)
- internal_error (__FILE__, __LINE__,
- _("remote_threads_extra_info"));
- if (ptid_equal (tp->ptid, magic_null_ptid)
- || (ptid_get_pid (tp->ptid) != 0 && ptid_get_lwp (tp->ptid) == 0))
-
- return NULL;
- if (packet_support (PACKET_qXfer_threads) == PACKET_ENABLE)
- {
- struct thread_info *info = find_thread_ptid (tp->ptid);
- if (info && info->private)
- return info->private->extra;
- else
- return NULL;
- }
- if (rs->use_threadextra_query)
- {
- char *b = rs->buf;
- char *endb = rs->buf + get_remote_packet_size ();
- xsnprintf (b, endb - b, "qThreadExtraInfo,");
- b += strlen (b);
- write_ptid (b, endb, tp->ptid);
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
- if (rs->buf[0] != 0)
- {
- n = min (strlen (rs->buf) / 2, sizeof (display_buf));
- result = hex2bin (rs->buf, (gdb_byte *) display_buf, n);
- display_buf [result] = '\0';
- return display_buf;
- }
- }
-
- rs->use_threadextra_query = 0;
- set = TAG_THREADID | TAG_EXISTS | TAG_THREADNAME
- | TAG_MOREDISPLAY | TAG_DISPLAY;
- int_to_threadref (&id, ptid_get_lwp (tp->ptid));
- if (remote_get_threadinfo (&id, set, &threadinfo))
- if (threadinfo.active)
- {
- if (*threadinfo.shortname)
- n += xsnprintf (&display_buf[0], sizeof (display_buf) - n,
- " Name: %s,", threadinfo.shortname);
- if (*threadinfo.display)
- n += xsnprintf (&display_buf[n], sizeof (display_buf) - n,
- " State: %s,", threadinfo.display);
- if (*threadinfo.more_display)
- n += xsnprintf (&display_buf[n], sizeof (display_buf) - n,
- " Priority: %s", threadinfo.more_display);
- if (n > 0)
- {
-
- if (',' == display_buf[n-1])
- display_buf[n-1] = ' ';
- return display_buf;
- }
- }
- return NULL;
- }
- static int
- remote_static_tracepoint_marker_at (struct target_ops *self, CORE_ADDR addr,
- struct static_tracepoint_marker *marker)
- {
- struct remote_state *rs = get_remote_state ();
- char *p = rs->buf;
- xsnprintf (p, get_remote_packet_size (), "qTSTMat:");
- p += strlen (p);
- p += hexnumstr (p, addr);
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
- p = rs->buf;
- if (*p == 'E')
- error (_("Remote failure reply: %s"), p);
- if (*p++ == 'm')
- {
- parse_static_tracepoint_marker_definition (p, &p, marker);
- return 1;
- }
- return 0;
- }
- static VEC(static_tracepoint_marker_p) *
- remote_static_tracepoint_markers_by_strid (struct target_ops *self,
- const char *strid)
- {
- struct remote_state *rs = get_remote_state ();
- VEC(static_tracepoint_marker_p) *markers = NULL;
- struct static_tracepoint_marker *marker = NULL;
- struct cleanup *old_chain;
- char *p;
-
- putpkt ("qTfSTM");
- getpkt (&rs->buf, &rs->buf_size, 0);
- p = rs->buf;
- if (*p == 'E')
- error (_("Remote failure reply: %s"), p);
- old_chain = make_cleanup (free_current_marker, &marker);
- while (*p++ == 'm')
- {
- if (marker == NULL)
- marker = XCNEW (struct static_tracepoint_marker);
- do
- {
- parse_static_tracepoint_marker_definition (p, &p, marker);
- if (strid == NULL || strcmp (strid, marker->str_id) == 0)
- {
- VEC_safe_push (static_tracepoint_marker_p,
- markers, marker);
- marker = NULL;
- }
- else
- {
- release_static_tracepoint_marker (marker);
- memset (marker, 0, sizeof (*marker));
- }
- }
- while (*p++ == ',');
-
- putpkt ("qTsSTM");
- getpkt (&rs->buf, &rs->buf_size, 0);
- p = rs->buf;
- }
- do_cleanups (old_chain);
- return markers;
- }
- static ptid_t
- remote_get_ada_task_ptid (struct target_ops *self, long lwp, long thread)
- {
- return ptid_build (ptid_get_pid (inferior_ptid), lwp, 0);
- }
- static void
- extended_remote_restart (void)
- {
- struct remote_state *rs = get_remote_state ();
-
- xsnprintf (rs->buf, get_remote_packet_size (), "R%x", 0);
- putpkt (rs->buf);
- remote_fileio_reset ();
- }
- static void
- remote_close (struct target_ops *self)
- {
- struct remote_state *rs = get_remote_state ();
- if (rs->remote_desc == NULL)
- return;
-
- remote_terminal_ours (self);
- serial_close (rs->remote_desc);
- rs->remote_desc = NULL;
-
- inferior_ptid = null_ptid;
- discard_all_inferiors ();
-
- discard_pending_stop_replies_in_queue (rs);
- if (remote_async_inferior_event_token)
- delete_async_event_handler (&remote_async_inferior_event_token);
- remote_notif_state_xfree (rs->notif_state);
- trace_reset_local_state ();
- }
- static void
- get_offsets (void)
- {
- struct remote_state *rs = get_remote_state ();
- char *buf;
- char *ptr;
- int lose, num_segments = 0, do_sections, do_segments;
- CORE_ADDR text_addr, data_addr, bss_addr, segments[2];
- struct section_offsets *offs;
- struct symfile_segment_data *data;
- if (symfile_objfile == NULL)
- return;
- putpkt ("qOffsets");
- getpkt (&rs->buf, &rs->buf_size, 0);
- buf = rs->buf;
- if (buf[0] == '\000')
- return;
- if (buf[0] == 'E')
- {
- warning (_("Remote failure reply: %s"), buf);
- return;
- }
-
- text_addr = data_addr = bss_addr = 0;
- ptr = buf;
- lose = 0;
- if (strncmp (ptr, "Text=", 5) == 0)
- {
- ptr += 5;
-
- while (*ptr && *ptr != ';')
- text_addr = (text_addr << 4) + fromhex (*ptr++);
- if (strncmp (ptr, ";Data=", 6) == 0)
- {
- ptr += 6;
- while (*ptr && *ptr != ';')
- data_addr = (data_addr << 4) + fromhex (*ptr++);
- }
- else
- lose = 1;
- if (!lose && strncmp (ptr, ";Bss=", 5) == 0)
- {
- ptr += 5;
- while (*ptr && *ptr != ';')
- bss_addr = (bss_addr << 4) + fromhex (*ptr++);
- if (bss_addr != data_addr)
- warning (_("Target reported unsupported offsets: %s"), buf);
- }
- else
- lose = 1;
- }
- else if (strncmp (ptr, "TextSeg=", 8) == 0)
- {
- ptr += 8;
-
- while (*ptr && *ptr != ';')
- text_addr = (text_addr << 4) + fromhex (*ptr++);
- num_segments = 1;
- if (strncmp (ptr, ";DataSeg=", 9) == 0)
- {
- ptr += 9;
- while (*ptr && *ptr != ';')
- data_addr = (data_addr << 4) + fromhex (*ptr++);
- num_segments++;
- }
- }
- else
- lose = 1;
- if (lose)
- error (_("Malformed response to offset query, %s"), buf);
- else if (*ptr != '\0')
- warning (_("Target reported unsupported offsets: %s"), buf);
- offs = ((struct section_offsets *)
- alloca (SIZEOF_N_SECTION_OFFSETS (symfile_objfile->num_sections)));
- memcpy (offs, symfile_objfile->section_offsets,
- SIZEOF_N_SECTION_OFFSETS (symfile_objfile->num_sections));
- data = get_symfile_segment_data (symfile_objfile->obfd);
- do_segments = (data != NULL);
- do_sections = num_segments == 0;
- if (num_segments > 0)
- {
- segments[0] = text_addr;
- segments[1] = data_addr;
- }
-
- else if (data && data->num_segments == 2)
- {
- segments[0] = data->segment_bases[0] + text_addr;
- segments[1] = data->segment_bases[1] + data_addr;
- num_segments = 2;
- }
-
- else if (data && data->num_segments == 1)
- {
- segments[0] = data->segment_bases[0] + text_addr;
- num_segments = 1;
- }
-
- else
- do_segments = 0;
- if (do_segments)
- {
- int ret = symfile_map_offsets_to_segments (symfile_objfile->obfd, data,
- offs, num_segments, segments);
- if (ret == 0 && !do_sections)
- error (_("Can not handle qOffsets TextSeg "
- "response with this symbol file"));
- if (ret > 0)
- do_sections = 0;
- }
- if (data)
- free_symfile_segment_data (data);
- if (do_sections)
- {
- offs->offsets[SECT_OFF_TEXT (symfile_objfile)] = text_addr;
-
- offs->offsets[SECT_OFF_DATA (symfile_objfile)] = data_addr;
- offs->offsets[SECT_OFF_BSS (symfile_objfile)] = data_addr;
- }
- objfile_relocate (symfile_objfile, offs);
- }
- static int
- set_stop_requested_callback (struct thread_info *thread, void *data)
- {
-
- if (peek_stop_reply (thread->ptid))
- set_stop_requested (thread->ptid, 1);
- return 0;
- }
- static void
- send_interrupt_sequence (void)
- {
- struct remote_state *rs = get_remote_state ();
- if (interrupt_sequence_mode == interrupt_sequence_control_c)
- remote_serial_write ("\x03", 1);
- else if (interrupt_sequence_mode == interrupt_sequence_break)
- serial_send_break (rs->remote_desc);
- else if (interrupt_sequence_mode == interrupt_sequence_break_g)
- {
- serial_send_break (rs->remote_desc);
- remote_serial_write ("g", 1);
- }
- else
- internal_error (__FILE__, __LINE__,
- _("Invalid value for interrupt_sequence_mode: %s."),
- interrupt_sequence_mode);
- }
- static ptid_t
- stop_reply_extract_thread (char *stop_reply)
- {
- if (stop_reply[0] == 'T' && strlen (stop_reply) > 3)
- {
- char *p;
-
- p = &stop_reply[3];
-
- while (*p != '\0')
- {
- char *p1;
- p1 = strchr (p, ':');
- if (p1 == NULL)
- return null_ptid;
- if (strncmp (p, "thread", p1 - p) == 0)
- return read_ptid (++p1, &p);
- p1 = strchr (p, ';');
- if (p1 == NULL)
- return null_ptid;
- p1++;
- p = p1;
- }
- }
- return null_ptid;
- }
- static ptid_t
- get_current_thread (char *wait_status)
- {
- ptid_t ptid;
-
- if (wait_status != NULL)
- ptid = stop_reply_extract_thread (wait_status);
- if (ptid_equal (ptid, null_ptid))
- ptid = remote_current_thread (inferior_ptid);
- return ptid;
- }
- static void
- add_current_inferior_and_thread (char *wait_status)
- {
- struct remote_state *rs = get_remote_state ();
- int fake_pid_p = 0;
- ptid_t ptid = null_ptid;
- inferior_ptid = null_ptid;
-
- ptid = get_current_thread (wait_status);
- if (!ptid_equal (ptid, null_ptid))
- {
- if (!remote_multi_process_p (rs))
- fake_pid_p = 1;
- inferior_ptid = ptid;
- }
- else
- {
-
- inferior_ptid = magic_null_ptid;
- fake_pid_p = 1;
- }
- remote_add_inferior (fake_pid_p, ptid_get_pid (inferior_ptid), -1);
-
- add_thread_silent (inferior_ptid);
- }
- static void
- remote_start_remote (int from_tty, struct target_ops *target, int extended_p)
- {
- struct remote_state *rs = get_remote_state ();
- struct packet_config *noack_config;
- char *wait_status = NULL;
- immediate_quit++;
- QUIT;
- if (interrupt_on_connect)
- send_interrupt_sequence ();
-
- serial_write (rs->remote_desc, "+", 1);
-
- rs->starting_up = 1;
-
- remote_query_supported ();
-
- if (packet_support (PACKET_QAllow) != PACKET_DISABLE)
- remote_set_permissions (target);
-
- noack_config = &remote_protocol_packets[PACKET_QStartNoAckMode];
- if (packet_config_support (noack_config) != PACKET_DISABLE)
- {
- putpkt ("QStartNoAckMode");
- getpkt (&rs->buf, &rs->buf_size, 0);
- if (packet_ok (rs->buf, noack_config) == PACKET_OK)
- rs->noack_mode = 1;
- }
- if (extended_p)
- {
-
- putpkt ("!");
- getpkt (&rs->buf, &rs->buf_size, 0);
- }
-
- update_signals_program_target ();
-
- target_find_description ();
-
- update_address_spaces ();
-
- if (gdbarch_has_global_solist (target_gdbarch ()))
- solib_add (NULL, from_tty, target, auto_solib_add);
- if (non_stop)
- {
- if (packet_support (PACKET_QNonStop) != PACKET_ENABLE)
- error (_("Non-stop mode requested, but remote "
- "does not support non-stop"));
- putpkt ("QNonStop:1");
- getpkt (&rs->buf, &rs->buf_size, 0);
- if (strcmp (rs->buf, "OK") != 0)
- error (_("Remote refused setting non-stop mode with: %s"), rs->buf);
-
- remote_update_thread_list (target);
- }
- else if (packet_support (PACKET_QNonStop) == PACKET_ENABLE)
- {
-
- putpkt ("QNonStop:0");
- getpkt (&rs->buf, &rs->buf_size, 0);
- if (strcmp (rs->buf, "OK") != 0)
- error (_("Remote refused setting all-stop mode with: %s"), rs->buf);
- }
-
- if (remote_get_trace_status (target, current_trace_status ()) != -1)
- {
- struct uploaded_tsv *uploaded_tsvs = NULL;
- remote_upload_trace_state_variables (target, &uploaded_tsvs);
- merge_uploaded_trace_state_variables (&uploaded_tsvs);
- }
-
- putpkt ("?");
- getpkt (&rs->buf, &rs->buf_size, 0);
- if (!non_stop)
- {
- ptid_t ptid;
- int fake_pid_p = 0;
- struct inferior *inf;
- if (rs->buf[0] == 'W' || rs->buf[0] == 'X')
- {
- if (!extended_p)
- error (_("The target is not running (try extended-remote?)"));
-
- rs->starting_up = 0;
- return;
- }
- else
- {
-
- wait_status = alloca (strlen (rs->buf) + 1);
- strcpy (wait_status, rs->buf);
- }
-
- target_update_thread_list ();
-
- set_continue_thread (minus_one_ptid);
- if (thread_count () == 0)
- {
-
- add_current_inferior_and_thread (wait_status);
- }
- else
- {
-
- inferior_ptid = get_current_thread (wait_status);
- if (ptid_equal (inferior_ptid, null_ptid))
- {
-
- inferior_ptid = thread_list->ptid;
- }
- }
-
- init_wait_for_inferior ();
- get_offsets ();
-
- if (remote_read_description_p (target)
- && gdbarch_target_desc (target_gdbarch ()) == NULL)
- {
- target_clear_description ();
- target_find_description ();
- }
-
- gdb_assert (wait_status != NULL);
- strcpy (rs->buf, wait_status);
- rs->cached_wait_status = 1;
- immediate_quit--;
- start_remote (from_tty);
- }
- else
- {
-
- init_wait_for_inferior ();
-
- if (strcmp (rs->buf, "OK") != 0)
- {
- struct notif_client *notif = ¬if_client_stop;
-
- rs->notif_state->pending_event[notif_client_stop.id]
- = remote_notif_parse (notif, rs->buf);
- remote_notif_get_pending_events (notif);
-
- iterate_over_threads (set_stop_requested_callback, NULL);
- }
- if (target_can_async_p ())
- target_async (inferior_event_handler, 0);
- if (thread_count () == 0)
- {
- if (!extended_p)
- error (_("The target is not running (try extended-remote?)"));
-
- rs->starting_up = 0;
- return;
- }
-
-
- set_general_thread (null_ptid);
-
- inferior_ptid = remote_current_thread (minus_one_ptid);
- if (ptid_equal (inferior_ptid, minus_one_ptid))
- error (_("remote didn't report the current thread in non-stop mode"));
- get_offsets ();
-
- gdb_assert (wait_status == NULL);
-
- remote_pass_signals (target, 0, NULL);
- }
-
- if (target_has_execution)
- {
- if (symfile_objfile)
- remote_check_symbols ();
- }
-
- if (remote_get_trace_status (target, current_trace_status ()) != -1)
- {
- struct uploaded_tp *uploaded_tps = NULL;
- if (current_trace_status ()->running)
- printf_filtered (_("Trace is already running on the target.\n"));
- remote_upload_tracepoints (target, &uploaded_tps);
- merge_uploaded_tracepoints (&uploaded_tps);
- }
-
- rs->starting_up = 0;
-
- if (breakpoints_should_be_inserted_now ())
- insert_breakpoints ();
- }
- static void
- remote_open (const char *name, int from_tty)
- {
- remote_open_1 (name, from_tty, &remote_ops, 0);
- }
- static void
- extended_remote_open (const char *name, int from_tty)
- {
- remote_open_1 (name, from_tty, &extended_remote_ops, 1 );
- }
- static void
- reset_all_packet_configs_support (void)
- {
- int i;
- for (i = 0; i < PACKET_MAX; i++)
- remote_protocol_packets[i].support = PACKET_SUPPORT_UNKNOWN;
- }
- static void
- init_all_packet_configs (void)
- {
- int i;
- for (i = 0; i < PACKET_MAX; i++)
- {
- remote_protocol_packets[i].detect = AUTO_BOOLEAN_AUTO;
- remote_protocol_packets[i].support = PACKET_SUPPORT_UNKNOWN;
- }
- }
- static void
- remote_check_symbols (void)
- {
- struct remote_state *rs = get_remote_state ();
- char *msg, *reply, *tmp;
- struct bound_minimal_symbol sym;
- int end;
-
- if (!target_has_execution)
- return;
- if (packet_support (PACKET_qSymbol) == PACKET_DISABLE)
- return;
-
- set_general_process ();
-
- msg = alloca (get_remote_packet_size ());
-
- putpkt ("qSymbol::");
- getpkt (&rs->buf, &rs->buf_size, 0);
- packet_ok (rs->buf, &remote_protocol_packets[PACKET_qSymbol]);
- reply = rs->buf;
- while (strncmp (reply, "qSymbol:", 8) == 0)
- {
- struct bound_minimal_symbol sym;
- tmp = &reply[8];
- end = hex2bin (tmp, (gdb_byte *) msg, strlen (tmp) / 2);
- msg[end] = '\0';
- sym = lookup_minimal_symbol (msg, NULL, NULL);
- if (sym.minsym == NULL)
- xsnprintf (msg, get_remote_packet_size (), "qSymbol::%s", &reply[8]);
- else
- {
- int addr_size = gdbarch_addr_bit (target_gdbarch ()) / 8;
- CORE_ADDR sym_addr = BMSYMBOL_VALUE_ADDRESS (sym);
-
- sym_addr = gdbarch_convert_from_func_ptr_addr (target_gdbarch (),
- sym_addr,
- ¤t_target);
- xsnprintf (msg, get_remote_packet_size (), "qSymbol:%s:%s",
- phex_nz (sym_addr, addr_size), &reply[8]);
- }
- putpkt (msg);
- getpkt (&rs->buf, &rs->buf_size, 0);
- reply = rs->buf;
- }
- }
- static struct serial *
- remote_serial_open (const char *name)
- {
- static int udp_warning = 0;
- FIXME
- if (!udp_warning && strncmp (name, "udp:", 4) == 0)
- {
- warning (_("The remote protocol may be unreliable over UDP.\n"
- "Some events may be lost, rendering further debugging "
- "impossible."));
- udp_warning = 1;
- }
- return serial_open (name);
- }
- void
- remote_set_permissions (struct target_ops *self)
- {
- struct remote_state *rs = get_remote_state ();
- xsnprintf (rs->buf, get_remote_packet_size (), "QAllow:"
- "WriteReg:%x;WriteMem:%x;"
- "InsertBreak:%x;InsertTrace:%x;"
- "InsertFastTrace:%x;Stop:%x",
- may_write_registers, may_write_memory,
- may_insert_breakpoints, may_insert_tracepoints,
- may_insert_fast_tracepoints, may_stop);
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
-
- if (strcmp (rs->buf, "OK") != 0)
- warning (_("Remote refused setting permissions with: %s"), rs->buf);
- }
- struct protocol_feature
- {
-
- const char *name;
-
- enum packet_support default_support;
-
- void (*func) (const struct protocol_feature *, enum packet_support,
- const char *);
-
- int packet;
- };
- static void
- remote_supported_packet (const struct protocol_feature *feature,
- enum packet_support support,
- const char *argument)
- {
- if (argument)
- {
- warning (_("Remote qSupported response supplied an unexpected value for"
- " \"%s\"."), feature->name);
- return;
- }
- remote_protocol_packets[feature->packet].support = support;
- }
- static void
- remote_packet_size (const struct protocol_feature *feature,
- enum packet_support support, const char *value)
- {
- struct remote_state *rs = get_remote_state ();
- int packet_size;
- char *value_end;
- if (support != PACKET_ENABLE)
- return;
- if (value == NULL || *value == '\0')
- {
- warning (_("Remote target reported \"%s\" without a size."),
- feature->name);
- return;
- }
- errno = 0;
- packet_size = strtol (value, &value_end, 16);
- if (errno != 0 || *value_end != '\0' || packet_size < 0)
- {
- warning (_("Remote target reported \"%s\" with a bad size: \"%s\"."),
- feature->name, value);
- return;
- }
- if (packet_size > MAX_REMOTE_PACKET_SIZE)
- {
- warning (_("limiting remote suggested packet size (%d bytes) to %d"),
- packet_size, MAX_REMOTE_PACKET_SIZE);
- packet_size = MAX_REMOTE_PACKET_SIZE;
- }
-
- rs->explicit_packet_size = packet_size;
- }
- static const struct protocol_feature remote_protocol_features[] = {
- { "PacketSize", PACKET_DISABLE, remote_packet_size, -1 },
- { "qXfer:auxv:read", PACKET_DISABLE, remote_supported_packet,
- PACKET_qXfer_auxv },
- { "qXfer:features:read", PACKET_DISABLE, remote_supported_packet,
- PACKET_qXfer_features },
- { "qXfer:libraries:read", PACKET_DISABLE, remote_supported_packet,
- PACKET_qXfer_libraries },
- { "qXfer:libraries-svr4:read", PACKET_DISABLE, remote_supported_packet,
- PACKET_qXfer_libraries_svr4 },
- { "augmented-libraries-svr4-read", PACKET_DISABLE,
- remote_supported_packet, PACKET_augmented_libraries_svr4_read_feature },
- { "qXfer:memory-map:read", PACKET_DISABLE, remote_supported_packet,
- PACKET_qXfer_memory_map },
- { "qXfer:spu:read", PACKET_DISABLE, remote_supported_packet,
- PACKET_qXfer_spu_read },
- { "qXfer:spu:write", PACKET_DISABLE, remote_supported_packet,
- PACKET_qXfer_spu_write },
- { "qXfer:osdata:read", PACKET_DISABLE, remote_supported_packet,
- PACKET_qXfer_osdata },
- { "qXfer:threads:read", PACKET_DISABLE, remote_supported_packet,
- PACKET_qXfer_threads },
- { "qXfer:traceframe-info:read", PACKET_DISABLE, remote_supported_packet,
- PACKET_qXfer_traceframe_info },
- { "QPassSignals", PACKET_DISABLE, remote_supported_packet,
- PACKET_QPassSignals },
- { "QProgramSignals", PACKET_DISABLE, remote_supported_packet,
- PACKET_QProgramSignals },
- { "QStartNoAckMode", PACKET_DISABLE, remote_supported_packet,
- PACKET_QStartNoAckMode },
- { "multiprocess", PACKET_DISABLE, remote_supported_packet,
- PACKET_multiprocess_feature },
- { "QNonStop", PACKET_DISABLE, remote_supported_packet, PACKET_QNonStop },
- { "qXfer:siginfo:read", PACKET_DISABLE, remote_supported_packet,
- PACKET_qXfer_siginfo_read },
- { "qXfer:siginfo:write", PACKET_DISABLE, remote_supported_packet,
- PACKET_qXfer_siginfo_write },
- { "ConditionalTracepoints", PACKET_DISABLE, remote_supported_packet,
- PACKET_ConditionalTracepoints },
- { "ConditionalBreakpoints", PACKET_DISABLE, remote_supported_packet,
- PACKET_ConditionalBreakpoints },
- { "BreakpointCommands", PACKET_DISABLE, remote_supported_packet,
- PACKET_BreakpointCommands },
- { "FastTracepoints", PACKET_DISABLE, remote_supported_packet,
- PACKET_FastTracepoints },
- { "StaticTracepoints", PACKET_DISABLE, remote_supported_packet,
- PACKET_StaticTracepoints },
- {"InstallInTrace", PACKET_DISABLE, remote_supported_packet,
- PACKET_InstallInTrace},
- { "DisconnectedTracing", PACKET_DISABLE, remote_supported_packet,
- PACKET_DisconnectedTracing_feature },
- { "ReverseContinue", PACKET_DISABLE, remote_supported_packet,
- PACKET_bc },
- { "ReverseStep", PACKET_DISABLE, remote_supported_packet,
- PACKET_bs },
- { "TracepointSource", PACKET_DISABLE, remote_supported_packet,
- PACKET_TracepointSource },
- { "QAllow", PACKET_DISABLE, remote_supported_packet,
- PACKET_QAllow },
- { "EnableDisableTracepoints", PACKET_DISABLE, remote_supported_packet,
- PACKET_EnableDisableTracepoints_feature },
- { "qXfer:fdpic:read", PACKET_DISABLE, remote_supported_packet,
- PACKET_qXfer_fdpic },
- { "qXfer:uib:read", PACKET_DISABLE, remote_supported_packet,
- PACKET_qXfer_uib },
- { "QDisableRandomization", PACKET_DISABLE, remote_supported_packet,
- PACKET_QDisableRandomization },
- { "QAgent", PACKET_DISABLE, remote_supported_packet, PACKET_QAgent},
- { "QTBuffer:size", PACKET_DISABLE,
- remote_supported_packet, PACKET_QTBuffer_size},
- { "tracenz", PACKET_DISABLE, remote_supported_packet, PACKET_tracenz_feature },
- { "Qbtrace:off", PACKET_DISABLE, remote_supported_packet, PACKET_Qbtrace_off },
- { "Qbtrace:bts", PACKET_DISABLE, remote_supported_packet, PACKET_Qbtrace_bts },
- { "qXfer:btrace:read", PACKET_DISABLE, remote_supported_packet,
- PACKET_qXfer_btrace }
- };
- static char *remote_support_xml;
- void
- register_remote_support_xml (const char *xml)
- {
- #if defined(HAVE_LIBEXPAT)
- if (remote_support_xml == NULL)
- remote_support_xml = concat ("xmlRegisters=", xml, (char *) NULL);
- else
- {
- char *copy = xstrdup (remote_support_xml + 13);
- char *p = strtok (copy, ",");
- do
- {
- if (strcmp (p, xml) == 0)
- {
-
- xfree (copy);
- return;
- }
- }
- while ((p = strtok (NULL, ",")) != NULL);
- xfree (copy);
- remote_support_xml = reconcat (remote_support_xml,
- remote_support_xml, ",", xml,
- (char *) NULL);
- }
- #endif
- }
- static char *
- remote_query_supported_append (char *msg, const char *append)
- {
- if (msg)
- return reconcat (msg, msg, ";", append, (char *) NULL);
- else
- return xstrdup (append);
- }
- static void
- remote_query_supported (void)
- {
- struct remote_state *rs = get_remote_state ();
- char *next;
- int i;
- unsigned char seen [ARRAY_SIZE (remote_protocol_features)];
-
- rs->buf[0] = 0;
- if (packet_support (PACKET_qSupported) != PACKET_DISABLE)
- {
- char *q = NULL;
- struct cleanup *old_chain = make_cleanup (free_current_contents, &q);
- q = remote_query_supported_append (q, "multiprocess+");
- if (remote_support_xml)
- q = remote_query_supported_append (q, remote_support_xml);
- q = remote_query_supported_append (q, "qRelocInsn+");
- q = reconcat (q, "qSupported:", q, (char *) NULL);
- putpkt (q);
- do_cleanups (old_chain);
- getpkt (&rs->buf, &rs->buf_size, 0);
-
- if (packet_ok (rs->buf, &remote_protocol_packets[PACKET_qSupported])
- == PACKET_ERROR)
- {
- warning (_("Remote failure reply: %s"), rs->buf);
- rs->buf[0] = 0;
- }
- }
- memset (seen, 0, sizeof (seen));
- next = rs->buf;
- while (*next)
- {
- enum packet_support is_supported;
- char *p, *end, *name_end, *value;
-
- p = next;
- end = strchr (p, ';');
- if (end == NULL)
- {
- end = p + strlen (p);
- next = end;
- }
- else
- {
- *end = '\0';
- next = end + 1;
- if (end == p)
- {
- warning (_("empty item in \"qSupported\" response"));
- continue;
- }
- }
- name_end = strchr (p, '=');
- if (name_end)
- {
-
- is_supported = PACKET_ENABLE;
- value = name_end + 1;
- *name_end = '\0';
- }
- else
- {
- value = NULL;
- switch (end[-1])
- {
- case '+':
- is_supported = PACKET_ENABLE;
- break;
- case '-':
- is_supported = PACKET_DISABLE;
- break;
- case '?':
- is_supported = PACKET_SUPPORT_UNKNOWN;
- break;
- default:
- warning (_("unrecognized item \"%s\" "
- "in \"qSupported\" response"), p);
- continue;
- }
- end[-1] = '\0';
- }
- for (i = 0; i < ARRAY_SIZE (remote_protocol_features); i++)
- if (strcmp (remote_protocol_features[i].name, p) == 0)
- {
- const struct protocol_feature *feature;
- seen[i] = 1;
- feature = &remote_protocol_features[i];
- feature->func (feature, is_supported, value);
- break;
- }
- }
-
- if (rs->buf_size < rs->explicit_packet_size)
- {
- rs->buf_size = rs->explicit_packet_size;
- rs->buf = xrealloc (rs->buf, rs->buf_size);
- }
-
- for (i = 0; i < ARRAY_SIZE (remote_protocol_features); i++)
- if (!seen[i])
- {
- const struct protocol_feature *feature;
- feature = &remote_protocol_features[i];
- feature->func (feature, feature->default_support, NULL);
- }
- }
- static void
- remote_unpush_target (void)
- {
- pop_all_targets_above (process_stratum - 1);
- }
- static void
- remote_open_1 (const char *name, int from_tty,
- struct target_ops *target, int extended_p)
- {
- struct remote_state *rs = get_remote_state ();
- if (name == 0)
- error (_("To open a remote debug connection, you need to specify what\n"
- "serial device is attached to the remote system\n"
- "(e.g. /dev/ttyS0, /dev/ttya, COM1, etc.)."));
- FIXME
- if (!target_async_permitted)
- wait_forever_enabled_p = 1;
-
- if (rs->remote_desc != NULL && !have_inferiors ())
- {
- if (from_tty
- && !query (_("Already connected to a remote target. Disconnect? ")))
- error (_("Still connected."));
- }
-
- target_preopen (from_tty);
-
- xfree (rs->last_pass_packet);
- rs->last_pass_packet = NULL;
-
- xfree (rs->last_program_signals_packet);
- rs->last_program_signals_packet = NULL;
- remote_fileio_reset ();
- reopen_exec_file ();
- reread_symbols ();
- rs->remote_desc = remote_serial_open (name);
- if (!rs->remote_desc)
- perror_with_name (name);
- if (baud_rate != -1)
- {
- if (serial_setbaudrate (rs->remote_desc, baud_rate))
- {
-
- serial_close (rs->remote_desc);
- rs->remote_desc = NULL;
- perror_with_name (name);
- }
- }
- serial_raw (rs->remote_desc);
-
- serial_flush_input (rs->remote_desc);
- if (from_tty)
- {
- puts_filtered ("Remote debugging using ");
- puts_filtered (name);
- puts_filtered ("\n");
- }
- push_target (target);
-
- remote_async_inferior_event_token
- = create_async_event_handler (remote_async_inferior_event_handler,
- NULL);
- rs->notif_state = remote_notif_state_allocate ();
-
- reset_all_packet_configs_support ();
- rs->cached_wait_status = 0;
- rs->explicit_packet_size = 0;
- rs->noack_mode = 0;
- rs->extended = extended_p;
- rs->waiting_for_stop_reply = 0;
- rs->ctrlc_pending_p = 0;
- rs->general_thread = not_sent_ptid;
- rs->continue_thread = not_sent_ptid;
- rs->remote_traceframe_number = -1;
-
- rs->use_threadinfo_query = 1;
- rs->use_threadextra_query = 1;
- if (target_async_permitted)
- {
-
- remote_async_terminal_ours_p = 1;
- FIXME
- wait_forever_enabled_p = 0;
- }
-
- no_shared_libraries (NULL, 0);
-
- init_thread_list ();
-
- FIXME
- {
- volatile struct gdb_exception ex;
- TRY_CATCH (ex, RETURN_MASK_ALL)
- {
- remote_start_remote (from_tty, target, extended_p);
- }
- if (ex.reason < 0)
- {
-
- if (rs->remote_desc != NULL)
- remote_unpush_target ();
- if (target_async_permitted)
- wait_forever_enabled_p = 1;
- throw_exception (ex);
- }
- }
- if (target_async_permitted)
- wait_forever_enabled_p = 1;
- }
- static void
- remote_detach_1 (const char *args, int from_tty, int extended)
- {
- int pid = ptid_get_pid (inferior_ptid);
- struct remote_state *rs = get_remote_state ();
- if (args)
- error (_("Argument given to \"detach\" when remotely debugging."));
- if (!target_has_execution)
- error (_("No process to detach from."));
- if (from_tty)
- {
- char *exec_file = get_exec_file (0);
- if (exec_file == NULL)
- exec_file = "";
- printf_unfiltered (_("Detaching from program: %s, %s\n"), exec_file,
- target_pid_to_str (pid_to_ptid (pid)));
- gdb_flush (gdb_stdout);
- }
-
- if (remote_multi_process_p (rs))
- xsnprintf (rs->buf, get_remote_packet_size (), "D;%x", pid);
- else
- strcpy (rs->buf, "D");
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
- if (rs->buf[0] == 'O' && rs->buf[1] == 'K')
- ;
- else if (rs->buf[0] == '\0')
- error (_("Remote doesn't know how to detach"));
- else
- error (_("Can't detach process."));
- if (from_tty && !extended)
- puts_filtered (_("Ending remote debugging.\n"));
- target_mourn_inferior ();
- }
- static void
- remote_detach (struct target_ops *ops, const char *args, int from_tty)
- {
- remote_detach_1 (args, from_tty, 0);
- }
- static void
- extended_remote_detach (struct target_ops *ops, const char *args, int from_tty)
- {
- remote_detach_1 (args, from_tty, 1);
- }
- static void
- remote_disconnect (struct target_ops *target, const char *args, int from_tty)
- {
- if (args)
- error (_("Argument given to \"disconnect\" when remotely debugging."));
-
- remote_mourn_1 (target);
- if (from_tty)
- puts_filtered ("Ending remote debugging.\n");
- }
- static void
- extended_remote_attach_1 (struct target_ops *target, const char *args,
- int from_tty)
- {
- struct remote_state *rs = get_remote_state ();
- int pid;
- char *wait_status = NULL;
- pid = parse_pid_to_attach (args);
-
- if (packet_support (PACKET_vAttach) == PACKET_DISABLE)
- error (_("This target does not support attaching to a process"));
- if (from_tty)
- {
- char *exec_file = get_exec_file (0);
- if (exec_file)
- printf_unfiltered (_("Attaching to program: %s, %s\n"), exec_file,
- target_pid_to_str (pid_to_ptid (pid)));
- else
- printf_unfiltered (_("Attaching to %s\n"),
- target_pid_to_str (pid_to_ptid (pid)));
- gdb_flush (gdb_stdout);
- }
- xsnprintf (rs->buf, get_remote_packet_size (), "vAttach;%x", pid);
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
- switch (packet_ok (rs->buf,
- &remote_protocol_packets[PACKET_vAttach]))
- {
- case PACKET_OK:
- if (!non_stop)
- {
-
- wait_status = alloca (strlen (rs->buf) + 1);
- strcpy (wait_status, rs->buf);
- }
- else if (strcmp (rs->buf, "OK") != 0)
- error (_("Attaching to %s failed with: %s"),
- target_pid_to_str (pid_to_ptid (pid)),
- rs->buf);
- break;
- case PACKET_UNKNOWN:
- error (_("This target does not support attaching to a process"));
- default:
- error (_("Attaching to %s failed"),
- target_pid_to_str (pid_to_ptid (pid)));
- }
- set_current_inferior (remote_add_inferior (0, pid, 1));
- inferior_ptid = pid_to_ptid (pid);
- if (non_stop)
- {
- struct thread_info *thread;
-
- remote_update_thread_list (target);
- thread = first_thread_of_process (pid);
- if (thread)
- inferior_ptid = thread->ptid;
- else
- inferior_ptid = pid_to_ptid (pid);
-
- record_currthread (rs, minus_one_ptid);
- }
- else
- {
-
- inferior_ptid = remote_current_thread (inferior_ptid);
-
- add_thread_silent (inferior_ptid);
- }
-
- target_find_description ();
- if (!non_stop)
- {
-
- gdb_assert (wait_status != NULL);
- if (target_can_async_p ())
- {
- struct notif_event *reply
- = remote_notif_parse (¬if_client_stop, wait_status);
- push_stop_reply ((struct stop_reply *) reply);
- target_async (inferior_event_handler, 0);
- }
- else
- {
- gdb_assert (wait_status != NULL);
- strcpy (rs->buf, wait_status);
- rs->cached_wait_status = 1;
- }
- }
- else
- gdb_assert (wait_status == NULL);
- }
- static void
- extended_remote_attach (struct target_ops *ops, const char *args, int from_tty)
- {
- extended_remote_attach_1 (ops, args, from_tty);
- }
- static void
- extended_remote_post_attach (struct target_ops *ops, int pid)
- {
-
- if (symfile_objfile != NULL)
- remote_check_symbols();
- }
- static void
- remote_vcont_probe (struct remote_state *rs)
- {
- char *buf;
- strcpy (rs->buf, "vCont?");
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
- buf = rs->buf;
-
- if (strncmp (buf, "vCont", 5) == 0)
- {
- char *p = &buf[5];
- int support_s, support_S, support_c, support_C;
- support_s = 0;
- support_S = 0;
- support_c = 0;
- support_C = 0;
- rs->supports_vCont.t = 0;
- rs->supports_vCont.r = 0;
- while (p && *p == ';')
- {
- p++;
- if (*p == 's' && (*(p + 1) == ';' || *(p + 1) == 0))
- support_s = 1;
- else if (*p == 'S' && (*(p + 1) == ';' || *(p + 1) == 0))
- support_S = 1;
- else if (*p == 'c' && (*(p + 1) == ';' || *(p + 1) == 0))
- support_c = 1;
- else if (*p == 'C' && (*(p + 1) == ';' || *(p + 1) == 0))
- support_C = 1;
- else if (*p == 't' && (*(p + 1) == ';' || *(p + 1) == 0))
- rs->supports_vCont.t = 1;
- else if (*p == 'r' && (*(p + 1) == ';' || *(p + 1) == 0))
- rs->supports_vCont.r = 1;
- p = strchr (p, ';');
- }
-
- if (!support_s || !support_S || !support_c || !support_C)
- buf[0] = 0;
- }
- packet_ok (buf, &remote_protocol_packets[PACKET_vCont]);
- }
- static char *
- append_resumption (char *p, char *endp,
- ptid_t ptid, int step, enum gdb_signal siggnal)
- {
- struct remote_state *rs = get_remote_state ();
- if (step && siggnal != GDB_SIGNAL_0)
- p += xsnprintf (p, endp - p, ";S%02x", siggnal);
- else if (step
-
- && use_range_stepping
-
- && rs->supports_vCont.r
-
- && !(remote_multi_process_p (rs) && ptid_is_pid (ptid)))
- {
- struct thread_info *tp;
- if (ptid_equal (ptid, minus_one_ptid))
- {
-
- tp = find_thread_ptid (magic_null_ptid);
- }
- else
- tp = find_thread_ptid (ptid);
- gdb_assert (tp != NULL);
- if (tp->control.may_range_step)
- {
- int addr_size = gdbarch_addr_bit (target_gdbarch ()) / 8;
- p += xsnprintf (p, endp - p, ";r%s,%s",
- phex_nz (tp->control.step_range_start,
- addr_size),
- phex_nz (tp->control.step_range_end,
- addr_size));
- }
- else
- p += xsnprintf (p, endp - p, ";s");
- }
- else if (step)
- p += xsnprintf (p, endp - p, ";s");
- else if (siggnal != GDB_SIGNAL_0)
- p += xsnprintf (p, endp - p, ";C%02x", siggnal);
- else
- p += xsnprintf (p, endp - p, ";c");
- if (remote_multi_process_p (rs) && ptid_is_pid (ptid))
- {
- ptid_t nptid;
-
- nptid = ptid_build (ptid_get_pid (ptid), -1, 0);
- p += xsnprintf (p, endp - p, ":");
- p = write_ptid (p, endp, nptid);
- }
- else if (!ptid_equal (ptid, minus_one_ptid))
- {
- p += xsnprintf (p, endp - p, ":");
- p = write_ptid (p, endp, ptid);
- }
- return p;
- }
- static char *
- append_pending_thread_resumptions (char *p, char *endp, ptid_t ptid)
- {
- struct thread_info *thread;
- ALL_NON_EXITED_THREADS (thread)
- if (ptid_match (thread->ptid, ptid)
- && !ptid_equal (inferior_ptid, thread->ptid)
- && thread->suspend.stop_signal != GDB_SIGNAL_0)
- {
- p = append_resumption (p, endp, thread->ptid,
- 0, thread->suspend.stop_signal);
- thread->suspend.stop_signal = GDB_SIGNAL_0;
- }
- return p;
- }
- static int
- remote_vcont_resume (ptid_t ptid, int step, enum gdb_signal siggnal)
- {
- struct remote_state *rs = get_remote_state ();
- char *p;
- char *endp;
- if (packet_support (PACKET_vCont) == PACKET_SUPPORT_UNKNOWN)
- remote_vcont_probe (rs);
- if (packet_support (PACKET_vCont) == PACKET_DISABLE)
- return 0;
- p = rs->buf;
- endp = rs->buf + get_remote_packet_size ();
-
- p += xsnprintf (p, endp - p, "vCont");
- if (ptid_equal (ptid, magic_null_ptid))
- {
-
- append_resumption (p, endp, minus_one_ptid, step, siggnal);
- }
- else if (ptid_equal (ptid, minus_one_ptid) || ptid_is_pid (ptid))
- {
-
- if (step || siggnal != GDB_SIGNAL_0)
- {
-
- p = append_resumption (p, endp, inferior_ptid, step, siggnal);
- }
-
- p = append_pending_thread_resumptions (p, endp, ptid);
-
- append_resumption (p, endp, ptid, 0, GDB_SIGNAL_0);
- }
- else
- {
-
- append_resumption (p, endp, ptid, step, siggnal);
- }
- gdb_assert (strlen (rs->buf) < get_remote_packet_size ());
- putpkt (rs->buf);
- if (non_stop)
- {
-
- getpkt (&rs->buf, &rs->buf_size, 0);
- if (strcmp (rs->buf, "OK") != 0)
- error (_("Unexpected vCont reply in non-stop mode: %s"), rs->buf);
- }
- return 1;
- }
- static void
- remote_resume (struct target_ops *ops,
- ptid_t ptid, int step, enum gdb_signal siggnal)
- {
- struct remote_state *rs = get_remote_state ();
- char *buf;
-
- if (!non_stop)
- remote_notif_process (rs->notif_state, ¬if_client_stop);
- rs->last_sent_signal = siggnal;
- rs->last_sent_step = step;
-
-
- if (execution_direction != EXEC_REVERSE)
- if (remote_vcont_resume (ptid, step, siggnal))
- goto done;
-
- if (ptid_equal (ptid, minus_one_ptid))
- set_continue_thread (any_thread_ptid);
- else
- set_continue_thread (ptid);
- buf = rs->buf;
- if (execution_direction == EXEC_REVERSE)
- {
-
- if (info_verbose && siggnal != GDB_SIGNAL_0)
- warning (_(" - Can't pass signal %d to target in reverse: ignored."),
- siggnal);
- if (step && packet_support (PACKET_bs) == PACKET_DISABLE)
- error (_("Remote reverse-step not supported."));
- if (!step && packet_support (PACKET_bc) == PACKET_DISABLE)
- error (_("Remote reverse-continue not supported."));
- strcpy (buf, step ? "bs" : "bc");
- }
- else if (siggnal != GDB_SIGNAL_0)
- {
- buf[0] = step ? 'S' : 'C';
- buf[1] = tohex (((int) siggnal >> 4) & 0xf);
- buf[2] = tohex (((int) siggnal) & 0xf);
- buf[3] = '\0';
- }
- else
- strcpy (buf, step ? "s" : "c");
- putpkt (buf);
- done:
-
- FIXME
- if (target_can_async_p ())
- target_async (inferior_event_handler, 0);
-
- if (!non_stop)
- rs->waiting_for_stop_reply = 1;
- }
- static void
- async_initialize_sigint_signal_handler (void)
- {
- signal (SIGINT, async_handle_remote_sigint);
- }
- static void
- async_handle_remote_sigint (int sig)
- {
- signal (sig, async_handle_remote_sigint_twice);
-
- gdb_call_async_signal_handler (async_sigint_remote_token, 0);
- }
- static void
- async_handle_remote_sigint_twice (int sig)
- {
- signal (sig, async_handle_remote_sigint);
-
- gdb_call_async_signal_handler (async_sigint_remote_twice_token, 0);
- }
- static void
- async_remote_interrupt (gdb_client_data arg)
- {
- if (remote_debug)
- fprintf_unfiltered (gdb_stdlog, "async_remote_interrupt called\n");
- target_stop (inferior_ptid);
- }
- static void
- async_remote_interrupt_twice (gdb_client_data arg)
- {
- if (remote_debug)
- fprintf_unfiltered (gdb_stdlog, "async_remote_interrupt_twice called\n");
- interrupt_query ();
- }
- static void
- async_cleanup_sigint_signal_handler (void *dummy)
- {
- signal (SIGINT, handle_sigint);
- }
- static void (*ofunc) (int);
- static void
- sync_remote_interrupt (int signo)
- {
-
- signal (signo, sync_remote_interrupt_twice);
- gdb_call_async_signal_handler (async_sigint_remote_token, 1);
- }
- static void
- sync_remote_interrupt_twice (int signo)
- {
- signal (signo, ofunc);
- gdb_call_async_signal_handler (async_sigint_remote_twice_token, 1);
- signal (signo, sync_remote_interrupt);
- }
- static void
- remote_stop_ns (ptid_t ptid)
- {
- struct remote_state *rs = get_remote_state ();
- char *p = rs->buf;
- char *endp = rs->buf + get_remote_packet_size ();
- if (packet_support (PACKET_vCont) == PACKET_SUPPORT_UNKNOWN)
- remote_vcont_probe (rs);
- if (!rs->supports_vCont.t)
- error (_("Remote server does not support stopping threads"));
- if (ptid_equal (ptid, minus_one_ptid)
- || (!remote_multi_process_p (rs) && ptid_is_pid (ptid)))
- p += xsnprintf (p, endp - p, "vCont;t");
- else
- {
- ptid_t nptid;
- p += xsnprintf (p, endp - p, "vCont;t:");
- if (ptid_is_pid (ptid))
-
- nptid = ptid_build (ptid_get_pid (ptid), -1, 0);
- else
- {
-
- if (peek_stop_reply (ptid))
- return;
- nptid = ptid;
- }
- write_ptid (p, endp, nptid);
- }
-
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
- if (strcmp (rs->buf, "OK") != 0)
- error (_("Stopping %s failed: %s"), target_pid_to_str (ptid), rs->buf);
- }
- static void
- remote_stop_as (ptid_t ptid)
- {
- struct remote_state *rs = get_remote_state ();
- rs->ctrlc_pending_p = 1;
-
- if (rs->cached_wait_status)
- return;
-
- send_interrupt_sequence ();
- }
- static void
- remote_stop (struct target_ops *self, ptid_t ptid)
- {
- if (remote_debug)
- fprintf_unfiltered (gdb_stdlog, "remote_stop called\n");
- if (non_stop)
- remote_stop_ns (ptid);
- else
- remote_stop_as (ptid);
- }
- static void
- interrupt_query (void)
- {
- target_terminal_ours ();
- if (target_can_async_p ())
- {
- signal (SIGINT, handle_sigint);
- quit ();
- }
- else
- {
- if (query (_("Interrupted while waiting for the program.\n\
- Give up (and stop debugging it)? ")))
- {
- remote_unpush_target ();
- quit ();
- }
- }
- target_terminal_inferior ();
- }
- static void
- remote_terminal_inferior (struct target_ops *self)
- {
- if (!target_async_permitted)
-
- return;
- FIXME
- if (!remote_async_terminal_ours_p)
- return;
- delete_file_handler (input_fd);
- remote_async_terminal_ours_p = 0;
- async_initialize_sigint_signal_handler ();
-
- }
- static void
- remote_terminal_ours (struct target_ops *self)
- {
- if (!target_async_permitted)
-
- return;
- FIXME
- if (remote_async_terminal_ours_p)
- return;
- async_cleanup_sigint_signal_handler (NULL);
- add_file_handler (input_fd, stdin_event_handler, 0);
- remote_async_terminal_ours_p = 1;
- }
- static void
- remote_console_output (char *msg)
- {
- char *p;
- for (p = msg; p[0] && p[1]; p += 2)
- {
- char tb[2];
- char c = fromhex (p[0]) * 16 + fromhex (p[1]);
- tb[0] = c;
- tb[1] = 0;
- fputs_unfiltered (tb, gdb_stdtarg);
- }
- gdb_flush (gdb_stdtarg);
- }
- typedef struct cached_reg
- {
- int num;
- gdb_byte data[MAX_REGISTER_SIZE];
- } cached_reg_t;
- DEF_VEC_O(cached_reg_t);
- typedef struct stop_reply
- {
- struct notif_event base;
-
- ptid_t ptid;
-
- struct remote_state *rs;
- struct target_waitstatus ws;
-
- VEC(cached_reg_t) *regcache;
- int stopped_by_watchpoint_p;
- CORE_ADDR watch_data_address;
- int core;
- } *stop_reply_p;
- DECLARE_QUEUE_P (stop_reply_p);
- DEFINE_QUEUE_P (stop_reply_p);
- static QUEUE (stop_reply_p) *stop_reply_queue;
- static void
- stop_reply_xfree (struct stop_reply *r)
- {
- notif_event_xfree ((struct notif_event *) r);
- }
- static void
- remote_notif_stop_parse (struct notif_client *self, char *buf,
- struct notif_event *event)
- {
- remote_parse_stop_reply (buf, (struct stop_reply *) event);
- }
- static void
- remote_notif_stop_ack (struct notif_client *self, char *buf,
- struct notif_event *event)
- {
- struct stop_reply *stop_reply = (struct stop_reply *) event;
-
- putpkt ((char *) self->ack_command);
- if (stop_reply->ws.kind == TARGET_WAITKIND_IGNORE)
-
- error (_("Unknown stop reply"));
- push_stop_reply (stop_reply);
- }
- static int
- remote_notif_stop_can_get_pending_events (struct notif_client *self)
- {
-
- mark_async_event_handler (remote_async_inferior_event_token);
- return 0;
- }
- static void
- stop_reply_dtr (struct notif_event *event)
- {
- struct stop_reply *r = (struct stop_reply *) event;
- VEC_free (cached_reg_t, r->regcache);
- }
- static struct notif_event *
- remote_notif_stop_alloc_reply (void)
- {
- struct notif_event *r
- = (struct notif_event *) XNEW (struct stop_reply);
- r->dtr = stop_reply_dtr;
- return r;
- }
- struct notif_client notif_client_stop =
- {
- "Stop",
- "vStopped",
- remote_notif_stop_parse,
- remote_notif_stop_ack,
- remote_notif_stop_can_get_pending_events,
- remote_notif_stop_alloc_reply,
- REMOTE_NOTIF_STOP,
- };
- struct queue_iter_param
- {
- void *input;
- struct stop_reply *output;
- };
- static int
- remove_stop_reply_for_inferior (QUEUE (stop_reply_p) *q,
- QUEUE_ITER (stop_reply_p) *iter,
- stop_reply_p event,
- void *data)
- {
- struct queue_iter_param *param = data;
- struct inferior *inf = param->input;
- if (ptid_get_pid (event->ptid) == inf->pid)
- {
- stop_reply_xfree (event);
- QUEUE_remove_elem (stop_reply_p, q, iter);
- }
- return 1;
- }
- static void
- discard_pending_stop_replies (struct inferior *inf)
- {
- int i;
- struct queue_iter_param param;
- struct stop_reply *reply;
- struct remote_state *rs = get_remote_state ();
- struct remote_notif_state *rns = rs->notif_state;
-
- if (rs->remote_desc == NULL)
- return;
- reply = (struct stop_reply *) rns->pending_event[notif_client_stop.id];
-
- if (reply != NULL && ptid_get_pid (reply->ptid) == inf->pid)
- {
- stop_reply_xfree (reply);
- rns->pending_event[notif_client_stop.id] = NULL;
- }
- param.input = inf;
- param.output = NULL;
-
- QUEUE_iterate (stop_reply_p, stop_reply_queue,
- remove_stop_reply_for_inferior, ¶m);
- }
- static int
- remove_stop_reply_of_remote_state (QUEUE (stop_reply_p) *q,
- QUEUE_ITER (stop_reply_p) *iter,
- stop_reply_p event,
- void *data)
- {
- struct queue_iter_param *param = data;
- struct remote_state *rs = param->input;
- if (event->rs == rs)
- {
- stop_reply_xfree (event);
- QUEUE_remove_elem (stop_reply_p, q, iter);
- }
- return 1;
- }
- static void
- discard_pending_stop_replies_in_queue (struct remote_state *rs)
- {
- struct queue_iter_param param;
- param.input = rs;
- param.output = NULL;
-
- QUEUE_iterate (stop_reply_p, stop_reply_queue,
- remove_stop_reply_of_remote_state, ¶m);
- }
- static int
- remote_notif_remove_once_on_match (QUEUE (stop_reply_p) *q,
- QUEUE_ITER (stop_reply_p) *iter,
- stop_reply_p event,
- void *data)
- {
- struct queue_iter_param *param = data;
- ptid_t *ptid = param->input;
- if (ptid_match (event->ptid, *ptid))
- {
- param->output = event;
- QUEUE_remove_elem (stop_reply_p, q, iter);
- return 0;
- }
- return 1;
- }
- static struct stop_reply *
- remote_notif_remove_queued_reply (ptid_t ptid)
- {
- struct queue_iter_param param;
- param.input = &ptid;
- param.output = NULL;
- QUEUE_iterate (stop_reply_p, stop_reply_queue,
- remote_notif_remove_once_on_match, ¶m);
- if (notif_debug)
- fprintf_unfiltered (gdb_stdlog,
- "notif: discard queued event: 'Stop' in %s\n",
- target_pid_to_str (ptid));
- return param.output;
- }
- static struct stop_reply *
- queued_stop_reply (ptid_t ptid)
- {
- struct stop_reply *r = remote_notif_remove_queued_reply (ptid);
- if (!QUEUE_is_empty (stop_reply_p, stop_reply_queue))
-
- mark_async_event_handler (remote_async_inferior_event_token);
- return r;
- }
- static void
- push_stop_reply (struct stop_reply *new_event)
- {
- QUEUE_enque (stop_reply_p, stop_reply_queue, new_event);
- if (notif_debug)
- fprintf_unfiltered (gdb_stdlog,
- "notif: push 'Stop' %s to queue %d\n",
- target_pid_to_str (new_event->ptid),
- QUEUE_length (stop_reply_p,
- stop_reply_queue));
- mark_async_event_handler (remote_async_inferior_event_token);
- }
- static int
- stop_reply_match_ptid_and_ws (QUEUE (stop_reply_p) *q,
- QUEUE_ITER (stop_reply_p) *iter,
- struct stop_reply *event,
- void *data)
- {
- ptid_t *ptid = data;
- return !(ptid_equal (*ptid, event->ptid)
- && event->ws.kind == TARGET_WAITKIND_STOPPED);
- }
- static int
- peek_stop_reply (ptid_t ptid)
- {
- return !QUEUE_iterate (stop_reply_p, stop_reply_queue,
- stop_reply_match_ptid_and_ws, &ptid);
- }
- static void
- remote_parse_stop_reply (char *buf, struct stop_reply *event)
- {
- struct remote_arch_state *rsa = get_remote_arch_state ();
- ULONGEST addr;
- char *p;
- event->ptid = null_ptid;
- event->rs = get_remote_state ();
- event->ws.kind = TARGET_WAITKIND_IGNORE;
- event->ws.value.integer = 0;
- event->stopped_by_watchpoint_p = 0;
- event->regcache = NULL;
- event->core = -1;
- switch (buf[0])
- {
- case 'T':
-
-
- p = &buf[3];
- while (*p)
- {
- char *p1;
- char *p_temp;
- int fieldsize;
- LONGEST pnum = 0;
-
-
- if (strncmp (p, "awatch", strlen("awatch")) != 0
- && strncmp (p, "core", strlen ("core") != 0))
- {
-
- pnum = strtol (p, &p_temp, 16);
- p1 = p_temp;
- }
- else
- p1 = p;
- if (p1 == p)
- {
- p1 = strchr (p, ':');
- if (p1 == NULL)
- error (_("Malformed packet(a) (missing colon): %s\n\
- Packet: '%s'\n"),
- p, buf);
- if (strncmp (p, "thread", p1 - p) == 0)
- event->ptid = read_ptid (++p1, &p);
- else if ((strncmp (p, "watch", p1 - p) == 0)
- || (strncmp (p, "rwatch", p1 - p) == 0)
- || (strncmp (p, "awatch", p1 - p) == 0))
- {
- event->stopped_by_watchpoint_p = 1;
- p = unpack_varlen_hex (++p1, &addr);
- event->watch_data_address = (CORE_ADDR) addr;
- }
- else if (strncmp (p, "library", p1 - p) == 0)
- {
- p1++;
- p_temp = p1;
- while (*p_temp && *p_temp != ';')
- p_temp++;
- event->ws.kind = TARGET_WAITKIND_LOADED;
- p = p_temp;
- }
- else if (strncmp (p, "replaylog", p1 - p) == 0)
- {
- event->ws.kind = TARGET_WAITKIND_NO_HISTORY;
-
- p_temp = strchr (p1 + 1, ';');
- if (p_temp)
- p = p_temp;
- }
- else if (strncmp (p, "core", p1 - p) == 0)
- {
- ULONGEST c;
- p = unpack_varlen_hex (++p1, &c);
- event->core = c;
- }
- else
- {
-
- p_temp = strchr (p1 + 1, ';');
- if (p_temp)
- p = p_temp;
- }
- }
- else
- {
- struct packet_reg *reg = packet_reg_from_pnum (rsa, pnum);
- cached_reg_t cached_reg;
- p = p1;
- if (*p != ':')
- error (_("Malformed packet(b) (missing colon): %s\n\
- Packet: '%s'\n"),
- p, buf);
- ++p;
- if (reg == NULL)
- error (_("Remote sent bad register number %s: %s\n\
- Packet: '%s'\n"),
- hex_string (pnum), p, buf);
- cached_reg.num = reg->regnum;
- fieldsize = hex2bin (p, cached_reg.data,
- register_size (target_gdbarch (),
- reg->regnum));
- p += 2 * fieldsize;
- if (fieldsize < register_size (target_gdbarch (),
- reg->regnum))
- warning (_("Remote reply is too short: %s"), buf);
- VEC_safe_push (cached_reg_t, event->regcache, &cached_reg);
- }
- if (*p != ';')
- error (_("Remote register badly formatted: %s\nhere: %s"),
- buf, p);
- ++p;
- }
- if (event->ws.kind != TARGET_WAITKIND_IGNORE)
- break;
-
- case 'S':
- {
- int sig;
- event->ws.kind = TARGET_WAITKIND_STOPPED;
- sig = (fromhex (buf[1]) << 4) + fromhex (buf[2]);
- if (GDB_SIGNAL_FIRST <= sig && sig < GDB_SIGNAL_LAST)
- event->ws.value.sig = (enum gdb_signal) sig;
- else
- event->ws.value.sig = GDB_SIGNAL_UNKNOWN;
- }
- break;
- case 'W':
- case 'X':
- {
- char *p;
- int pid;
- ULONGEST value;
-
- p = unpack_varlen_hex (&buf[1], &value);
- if (buf[0] == 'W')
- {
-
- event->ws.kind = TARGET_WAITKIND_EXITED;
- event->ws.value.integer = value;
- }
- else
- {
-
- event->ws.kind = TARGET_WAITKIND_SIGNALLED;
- if (GDB_SIGNAL_FIRST <= value && value < GDB_SIGNAL_LAST)
- event->ws.value.sig = (enum gdb_signal) value;
- else
- event->ws.value.sig = GDB_SIGNAL_UNKNOWN;
- }
-
- pid = ptid_get_pid (inferior_ptid);
- if (*p == '\0')
- ;
- else if (*p == ';')
- {
- p++;
- if (p == '\0')
- ;
- else if (strncmp (p,
- "process:", sizeof ("process:") - 1) == 0)
- {
- ULONGEST upid;
- p += sizeof ("process:") - 1;
- unpack_varlen_hex (p, &upid);
- pid = upid;
- }
- else
- error (_("unknown stop reply packet: %s"), buf);
- }
- else
- error (_("unknown stop reply packet: %s"), buf);
- event->ptid = pid_to_ptid (pid);
- }
- break;
- }
- if (non_stop && ptid_equal (event->ptid, null_ptid))
- error (_("No process or thread specified in stop reply: %s"), buf);
- }
- void
- remote_notif_get_pending_events (struct notif_client *nc)
- {
- struct remote_state *rs = get_remote_state ();
- if (rs->notif_state->pending_event[nc->id] != NULL)
- {
- if (notif_debug)
- fprintf_unfiltered (gdb_stdlog,
- "notif: process: '%s' ack pending event\n",
- nc->name);
-
- nc->ack (nc, rs->buf, rs->notif_state->pending_event[nc->id]);
- rs->notif_state->pending_event[nc->id] = NULL;
- while (1)
- {
- getpkt (&rs->buf, &rs->buf_size, 0);
- if (strcmp (rs->buf, "OK") == 0)
- break;
- else
- remote_notif_ack (nc, rs->buf);
- }
- }
- else
- {
- if (notif_debug)
- fprintf_unfiltered (gdb_stdlog,
- "notif: process: '%s' no pending reply\n",
- nc->name);
- }
- }
- static ptid_t
- process_stop_reply (struct stop_reply *stop_reply,
- struct target_waitstatus *status)
- {
- ptid_t ptid;
- *status = stop_reply->ws;
- ptid = stop_reply->ptid;
-
- if (ptid_equal (ptid, null_ptid))
- ptid = inferior_ptid;
- if (status->kind != TARGET_WAITKIND_EXITED
- && status->kind != TARGET_WAITKIND_SIGNALLED)
- {
- struct remote_state *rs = get_remote_state ();
-
- if (stop_reply->regcache)
- {
- struct regcache *regcache
- = get_thread_arch_regcache (ptid, target_gdbarch ());
- cached_reg_t *reg;
- int ix;
- for (ix = 0;
- VEC_iterate(cached_reg_t, stop_reply->regcache, ix, reg);
- ix++)
- regcache_raw_supply (regcache, reg->num, reg->data);
- VEC_free (cached_reg_t, stop_reply->regcache);
- }
- rs->remote_stopped_by_watchpoint_p = stop_reply->stopped_by_watchpoint_p;
- rs->remote_watch_data_address = stop_reply->watch_data_address;
- remote_notice_new_inferior (ptid, 0);
- demand_private_info (ptid)->core = stop_reply->core;
- }
- stop_reply_xfree (stop_reply);
- return ptid;
- }
- static ptid_t
- remote_wait_ns (ptid_t ptid, struct target_waitstatus *status, int options)
- {
- struct remote_state *rs = get_remote_state ();
- struct stop_reply *stop_reply;
- int ret;
- int is_notif = 0;
-
- ret = getpkt_or_notif_sane (&rs->buf, &rs->buf_size,
- 0 , &is_notif);
- while (1)
- {
- if (ret != -1 && !is_notif)
- switch (rs->buf[0])
- {
- case 'E':
-
- warning (_("Remote failure reply: %s"), rs->buf);
- break;
- case 'O':
- remote_console_output (rs->buf + 1);
- break;
- default:
- warning (_("Invalid remote reply: %s"), rs->buf);
- break;
- }
-
- if (rs->notif_state->pending_event[notif_client_stop.id] != NULL)
- remote_notif_get_pending_events (¬if_client_stop);
-
- stop_reply = queued_stop_reply (ptid);
- if (stop_reply != NULL)
- return process_stop_reply (stop_reply, status);
-
- if (options & TARGET_WNOHANG)
- {
- status->kind = TARGET_WAITKIND_IGNORE;
- return minus_one_ptid;
- }
-
- ret = getpkt_or_notif_sane (&rs->buf, &rs->buf_size,
- 1 , &is_notif);
- }
- }
- static ptid_t
- remote_wait_as (ptid_t ptid, struct target_waitstatus *status, int options)
- {
- struct remote_state *rs = get_remote_state ();
- ptid_t event_ptid = null_ptid;
- char *buf;
- struct stop_reply *stop_reply;
- again:
- status->kind = TARGET_WAITKIND_IGNORE;
- status->value.integer = 0;
- stop_reply = queued_stop_reply (ptid);
- if (stop_reply != NULL)
- return process_stop_reply (stop_reply, status);
- if (rs->cached_wait_status)
-
- rs->cached_wait_status = 0;
- else
- {
- int ret;
- int is_notif;
- if (!target_is_async_p ())
- {
- ofunc = signal (SIGINT, sync_remote_interrupt);
-
- if (check_quit_flag ())
- {
- clear_quit_flag ();
- sync_remote_interrupt (SIGINT);
- }
- }
- FIXME
- ret = getpkt_or_notif_sane (&rs->buf, &rs->buf_size,
- wait_forever_enabled_p, &is_notif);
- if (!target_is_async_p ())
- signal (SIGINT, ofunc);
-
- if (ret != -1 && is_notif)
- return minus_one_ptid;
- }
- buf = rs->buf;
- rs->remote_stopped_by_watchpoint_p = 0;
-
- rs->waiting_for_stop_reply = 0;
-
- if (buf[0] != 'F' && buf[0] != 'O')
- rs->ctrlc_pending_p = 0;
- switch (buf[0])
- {
- case 'E':
-
- warning (_("Remote failure reply: %s"), buf);
- status->kind = TARGET_WAITKIND_STOPPED;
- status->value.sig = GDB_SIGNAL_0;
- break;
- case 'F':
- remote_fileio_request (buf, rs->ctrlc_pending_p);
- rs->ctrlc_pending_p = 0;
- break;
- case 'T': case 'S': case 'X': case 'W':
- {
- struct stop_reply *stop_reply
- = (struct stop_reply *) remote_notif_parse (¬if_client_stop,
- rs->buf);
- event_ptid = process_stop_reply (stop_reply, status);
- break;
- }
- case 'O':
- remote_console_output (buf + 1);
-
- rs->waiting_for_stop_reply = 1;
- break;
- case '\0':
- if (rs->last_sent_signal != GDB_SIGNAL_0)
- {
-
- target_terminal_ours_for_output ();
- printf_filtered
- ("Can't send signals to this remote system. %s not sent.\n",
- gdb_signal_to_name (rs->last_sent_signal));
- rs->last_sent_signal = GDB_SIGNAL_0;
- target_terminal_inferior ();
- strcpy ((char *) buf, rs->last_sent_step ? "s" : "c");
- putpkt ((char *) buf);
-
- rs->waiting_for_stop_reply = 1;
- break;
- }
-
- default:
- warning (_("Invalid remote reply: %s"), buf);
-
- rs->waiting_for_stop_reply = 1;
- break;
- }
- if (status->kind == TARGET_WAITKIND_IGNORE)
- {
-
- if (options & TARGET_WNOHANG)
- return minus_one_ptid;
- else
- goto again;
- }
- else if (status->kind != TARGET_WAITKIND_EXITED
- && status->kind != TARGET_WAITKIND_SIGNALLED)
- {
- if (!ptid_equal (event_ptid, null_ptid))
- record_currthread (rs, event_ptid);
- else
- event_ptid = inferior_ptid;
- }
- else
-
- record_currthread (rs, minus_one_ptid);
- return event_ptid;
- }
- static ptid_t
- remote_wait (struct target_ops *ops,
- ptid_t ptid, struct target_waitstatus *status, int options)
- {
- ptid_t event_ptid;
- if (non_stop)
- event_ptid = remote_wait_ns (ptid, status, options);
- else
- event_ptid = remote_wait_as (ptid, status, options);
- if (target_can_async_p ())
- {
-
- if (!QUEUE_is_empty (stop_reply_p, stop_reply_queue))
- mark_async_event_handler (remote_async_inferior_event_token);
- }
- return event_ptid;
- }
- static int
- fetch_register_using_p (struct regcache *regcache, struct packet_reg *reg)
- {
- struct remote_state *rs = get_remote_state ();
- char *buf, *p;
- char regp[MAX_REGISTER_SIZE];
- int i;
- if (packet_support (PACKET_p) == PACKET_DISABLE)
- return 0;
- if (reg->pnum == -1)
- return 0;
- p = rs->buf;
- *p++ = 'p';
- p += hexnumstr (p, reg->pnum);
- *p++ = '\0';
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
- buf = rs->buf;
- switch (packet_ok (buf, &remote_protocol_packets[PACKET_p]))
- {
- case PACKET_OK:
- break;
- case PACKET_UNKNOWN:
- return 0;
- case PACKET_ERROR:
- error (_("Could not fetch register \"%s\"; remote failure reply '%s'"),
- gdbarch_register_name (get_regcache_arch (regcache),
- reg->regnum),
- buf);
- }
-
- if (buf[0] == 'x')
- {
- regcache_raw_supply (regcache, reg->regnum, NULL);
- return 1;
- }
-
- p = buf;
- i = 0;
- while (p[0] != 0)
- {
- if (p[1] == 0)
- error (_("fetch_register_using_p: early buf termination"));
- regp[i++] = fromhex (p[0]) * 16 + fromhex (p[1]);
- p += 2;
- }
- regcache_raw_supply (regcache, reg->regnum, regp);
- return 1;
- }
- static int
- send_g_packet (void)
- {
- struct remote_state *rs = get_remote_state ();
- int buf_len;
- xsnprintf (rs->buf, get_remote_packet_size (), "g");
- remote_send (&rs->buf, &rs->buf_size);
-
- while ((rs->buf[0] < '0' || rs->buf[0] > '9')
- && (rs->buf[0] < 'A' || rs->buf[0] > 'F')
- && (rs->buf[0] < 'a' || rs->buf[0] > 'f')
- && rs->buf[0] != 'x')
- {
- if (remote_debug)
- fprintf_unfiltered (gdb_stdlog,
- "Bad register packet; fetching a new packet\n");
- getpkt (&rs->buf, &rs->buf_size, 0);
- }
- buf_len = strlen (rs->buf);
-
- if (buf_len % 2 != 0)
- error (_("Remote 'g' packet reply is of odd length: %s"), rs->buf);
- return buf_len / 2;
- }
- static void
- process_g_packet (struct regcache *regcache)
- {
- struct gdbarch *gdbarch = get_regcache_arch (regcache);
- struct remote_state *rs = get_remote_state ();
- struct remote_arch_state *rsa = get_remote_arch_state ();
- int i, buf_len;
- char *p;
- char *regs;
- buf_len = strlen (rs->buf);
-
- if (buf_len > 2 * rsa->sizeof_g_packet)
- error (_("Remote 'g' packet reply is too long: %s"), rs->buf);
-
- if (rsa->actual_register_packet_size == 0)
- rsa->actual_register_packet_size = buf_len;
-
- if (buf_len < 2 * rsa->sizeof_g_packet)
- {
- rsa->sizeof_g_packet = buf_len / 2;
- for (i = 0; i < gdbarch_num_regs (gdbarch); i++)
- {
- if (rsa->regs[i].pnum == -1)
- continue;
- if (rsa->regs[i].offset >= rsa->sizeof_g_packet)
- rsa->regs[i].in_g_packet = 0;
- else
- rsa->regs[i].in_g_packet = 1;
- }
- }
- regs = alloca (rsa->sizeof_g_packet);
-
- memset (regs, 0, rsa->sizeof_g_packet);
-
- p = rs->buf;
- for (i = 0; i < rsa->sizeof_g_packet; i++)
- {
- if (p[0] == 0 || p[1] == 0)
-
- internal_error (__FILE__, __LINE__,
- _("unexpected end of 'g' packet reply"));
- if (p[0] == 'x' && p[1] == 'x')
- regs[i] = 0;
- else
- regs[i] = fromhex (p[0]) * 16 + fromhex (p[1]);
- p += 2;
- }
- for (i = 0; i < gdbarch_num_regs (gdbarch); i++)
- {
- struct packet_reg *r = &rsa->regs[i];
- if (r->in_g_packet)
- {
- if (r->offset * 2 >= strlen (rs->buf))
-
- internal_error (__FILE__, __LINE__,
- _("unexpected end of 'g' packet reply"));
- else if (rs->buf[r->offset * 2] == 'x')
- {
- gdb_assert (r->offset * 2 < strlen (rs->buf));
-
- regcache_raw_supply (regcache, r->regnum, NULL);
- }
- else
- regcache_raw_supply (regcache, r->regnum,
- regs + r->offset);
- }
- }
- }
- static void
- fetch_registers_using_g (struct regcache *regcache)
- {
- send_g_packet ();
- process_g_packet (regcache);
- }
- static void
- set_remote_traceframe (void)
- {
- int newnum;
- struct remote_state *rs = get_remote_state ();
- if (rs->remote_traceframe_number == get_traceframe_number ())
- return;
-
- rs->remote_traceframe_number = get_traceframe_number ();
- newnum = target_trace_find (tfind_number,
- get_traceframe_number (), 0, 0, NULL);
-
- if (newnum != get_traceframe_number ())
- warning (_("could not set remote traceframe"));
- }
- static void
- remote_fetch_registers (struct target_ops *ops,
- struct regcache *regcache, int regnum)
- {
- struct remote_arch_state *rsa = get_remote_arch_state ();
- int i;
- set_remote_traceframe ();
- set_general_thread (inferior_ptid);
- if (regnum >= 0)
- {
- struct packet_reg *reg = packet_reg_from_regnum (rsa, regnum);
- gdb_assert (reg != NULL);
-
- if (reg->in_g_packet)
- {
- fetch_registers_using_g (regcache);
- if (reg->in_g_packet)
- return;
- }
- if (fetch_register_using_p (regcache, reg))
- return;
-
- regcache_raw_supply (regcache, reg->regnum, NULL);
- return;
- }
- fetch_registers_using_g (regcache);
- for (i = 0; i < gdbarch_num_regs (get_regcache_arch (regcache)); i++)
- if (!rsa->regs[i].in_g_packet)
- if (!fetch_register_using_p (regcache, &rsa->regs[i]))
- {
-
- regcache_raw_supply (regcache, i, NULL);
- }
- }
- static void
- remote_prepare_to_store (struct target_ops *self, struct regcache *regcache)
- {
- struct remote_arch_state *rsa = get_remote_arch_state ();
- int i;
- gdb_byte buf[MAX_REGISTER_SIZE];
-
- switch (packet_support (PACKET_P))
- {
- case PACKET_DISABLE:
- case PACKET_SUPPORT_UNKNOWN:
-
- for (i = 0; i < gdbarch_num_regs (get_regcache_arch (regcache)); i++)
- if (rsa->regs[i].in_g_packet)
- regcache_raw_read (regcache, rsa->regs[i].regnum, buf);
- break;
- case PACKET_ENABLE:
- break;
- }
- }
- static int
- store_register_using_P (const struct regcache *regcache,
- struct packet_reg *reg)
- {
- struct gdbarch *gdbarch = get_regcache_arch (regcache);
- struct remote_state *rs = get_remote_state ();
-
- char *buf = rs->buf;
- gdb_byte regp[MAX_REGISTER_SIZE];
- char *p;
- if (packet_support (PACKET_P) == PACKET_DISABLE)
- return 0;
- if (reg->pnum == -1)
- return 0;
- xsnprintf (buf, get_remote_packet_size (), "P%s=", phex_nz (reg->pnum, 0));
- p = buf + strlen (buf);
- regcache_raw_collect (regcache, reg->regnum, regp);
- bin2hex (regp, p, register_size (gdbarch, reg->regnum));
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
- switch (packet_ok (rs->buf, &remote_protocol_packets[PACKET_P]))
- {
- case PACKET_OK:
- return 1;
- case PACKET_ERROR:
- error (_("Could not write register \"%s\"; remote failure reply '%s'"),
- gdbarch_register_name (gdbarch, reg->regnum), rs->buf);
- case PACKET_UNKNOWN:
- return 0;
- default:
- internal_error (__FILE__, __LINE__, _("Bad result from packet_ok"));
- }
- }
- FIXME
- static void
- store_registers_using_G (const struct regcache *regcache)
- {
- struct remote_state *rs = get_remote_state ();
- struct remote_arch_state *rsa = get_remote_arch_state ();
- gdb_byte *regs;
- char *p;
-
- {
- int i;
- regs = alloca (rsa->sizeof_g_packet);
- memset (regs, 0, rsa->sizeof_g_packet);
- for (i = 0; i < gdbarch_num_regs (get_regcache_arch (regcache)); i++)
- {
- struct packet_reg *r = &rsa->regs[i];
- if (r->in_g_packet)
- regcache_raw_collect (regcache, r->regnum, regs + r->offset);
- }
- }
-
- p = rs->buf;
- *p++ = 'G';
-
- bin2hex (regs, p, rsa->sizeof_g_packet);
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
- if (packet_check_result (rs->buf) == PACKET_ERROR)
- error (_("Could not write registers; remote failure reply '%s'"),
- rs->buf);
- }
- FIXME
- static void
- remote_store_registers (struct target_ops *ops,
- struct regcache *regcache, int regnum)
- {
- struct remote_arch_state *rsa = get_remote_arch_state ();
- int i;
- set_remote_traceframe ();
- set_general_thread (inferior_ptid);
- if (regnum >= 0)
- {
- struct packet_reg *reg = packet_reg_from_regnum (rsa, regnum);
- gdb_assert (reg != NULL);
-
- if (store_register_using_P (regcache, reg))
- return;
-
- if (!reg->in_g_packet)
- return;
- store_registers_using_G (regcache);
- return;
- }
- store_registers_using_G (regcache);
- for (i = 0; i < gdbarch_num_regs (get_regcache_arch (regcache)); i++)
- if (!rsa->regs[i].in_g_packet)
- if (!store_register_using_P (regcache, &rsa->regs[i]))
-
- continue;
- }
- static int
- hexnumlen (ULONGEST num)
- {
- int i;
- for (i = 0; num != 0; i++)
- num >>= 4;
- return max (i, 1);
- }
- static int
- hexnumstr (char *buf, ULONGEST num)
- {
- int len = hexnumlen (num);
- return hexnumnstr (buf, num, len);
- }
- static int
- hexnumnstr (char *buf, ULONGEST num, int width)
- {
- int i;
- buf[width] = '\0';
- for (i = width - 1; i >= 0; i--)
- {
- buf[i] = "0123456789abcdef"[(num & 0xf)];
- num >>= 4;
- }
- return width;
- }
- static CORE_ADDR
- remote_address_masked (CORE_ADDR addr)
- {
- unsigned int address_size = remote_address_size;
-
- if (!address_size)
- address_size = gdbarch_addr_bit (target_gdbarch ());
- if (address_size > 0
- && address_size < (sizeof (ULONGEST) * 8))
- {
-
- ULONGEST mask = 1;
- mask = (mask << address_size) - 1;
- addr &= mask;
- }
- return addr;
- }
- static void
- check_binary_download (CORE_ADDR addr)
- {
- struct remote_state *rs = get_remote_state ();
- switch (packet_support (PACKET_X))
- {
- case PACKET_DISABLE:
- break;
- case PACKET_ENABLE:
- break;
- case PACKET_SUPPORT_UNKNOWN:
- {
- char *p;
- p = rs->buf;
- *p++ = 'X';
- p += hexnumstr (p, (ULONGEST) addr);
- *p++ = ',';
- p += hexnumstr (p, (ULONGEST) 0);
- *p++ = ':';
- *p = '\0';
- putpkt_binary (rs->buf, (int) (p - rs->buf));
- getpkt (&rs->buf, &rs->buf_size, 0);
- if (rs->buf[0] == '\0')
- {
- if (remote_debug)
- fprintf_unfiltered (gdb_stdlog,
- "binary downloading NOT "
- "supported by target\n");
- remote_protocol_packets[PACKET_X].support = PACKET_DISABLE;
- }
- else
- {
- if (remote_debug)
- fprintf_unfiltered (gdb_stdlog,
- "binary downloading supported by target\n");
- remote_protocol_packets[PACKET_X].support = PACKET_ENABLE;
- }
- break;
- }
- }
- }
- static enum target_xfer_status
- remote_write_bytes_aux (const char *header, CORE_ADDR memaddr,
- const gdb_byte *myaddr, ULONGEST len,
- ULONGEST *xfered_len, char packet_format,
- int use_length)
- {
- struct remote_state *rs = get_remote_state ();
- char *p;
- char *plen = NULL;
- int plenlen = 0;
- int todo;
- int nr_bytes;
- int payload_size;
- int payload_length;
- int header_length;
- if (packet_format != 'X' && packet_format != 'M')
- internal_error (__FILE__, __LINE__,
- _("remote_write_bytes_aux: bad packet format"));
- if (len == 0)
- return TARGET_XFER_EOF;
- payload_size = get_memory_write_packet_size ();
-
- rs->buf[0] = '\0';
-
- payload_size -= strlen ("$,:#NN");
- if (!use_length)
-
- payload_size += 1;
- header_length = strlen (header);
- payload_size -= header_length;
- payload_size -= hexnumlen (memaddr);
-
- strcat (rs->buf, header);
- p = rs->buf + strlen (header);
-
- if (packet_format == 'X')
- {
-
- todo = min (len, payload_size);
- if (use_length)
- payload_size -= hexnumlen (todo);
- todo = min (todo, payload_size);
- }
- else
- {
-
- todo = min (len, payload_size / 2);
- if (use_length)
- payload_size -= hexnumlen (todo);
- todo = min (todo, payload_size / 2);
- }
- if (todo <= 0)
- internal_error (__FILE__, __LINE__,
- _("minimum packet size too small to write data"));
-
- if (todo > 2 * REMOTE_ALIGN_WRITES && todo < len)
- todo = ((memaddr + todo) & ~(REMOTE_ALIGN_WRITES - 1)) - memaddr;
-
- memaddr = remote_address_masked (memaddr);
- p += hexnumstr (p, (ULONGEST) memaddr);
- if (use_length)
- {
-
- *p++ = ',';
-
- plen = p;
- plenlen = hexnumstr (p, (ULONGEST) todo);
- p += plenlen;
- }
-
- *p++ = ':';
- *p = '\0';
-
- if (packet_format == 'X')
- {
-
- payload_length = remote_escape_output (myaddr, todo, (gdb_byte *) p,
- &nr_bytes, payload_size);
- TODO
- if (nr_bytes < todo && nr_bytes > 2 * REMOTE_ALIGN_WRITES)
- {
- int new_nr_bytes;
- new_nr_bytes = (((memaddr + nr_bytes) & ~(REMOTE_ALIGN_WRITES - 1))
- - memaddr);
- if (new_nr_bytes != nr_bytes)
- payload_length = remote_escape_output (myaddr, new_nr_bytes,
- (gdb_byte *) p, &nr_bytes,
- payload_size);
- }
- p += payload_length;
- if (use_length && nr_bytes < todo)
- {
-
- plen += hexnumnstr (plen, (ULONGEST) nr_bytes, plenlen);
- *plen = ':';
- }
- }
- else
- {
-
- nr_bytes = bin2hex (myaddr, p, todo);
- p += 2 * nr_bytes;
- }
- putpkt_binary (rs->buf, (int) (p - rs->buf));
- getpkt (&rs->buf, &rs->buf_size, 0);
- if (rs->buf[0] == 'E')
- return TARGET_XFER_E_IO;
- TODO
- *xfered_len = (ULONGEST) nr_bytes;
- return TARGET_XFER_OK;
- }
- static enum target_xfer_status
- remote_write_bytes (CORE_ADDR memaddr, const gdb_byte *myaddr, ULONGEST len,
- ULONGEST *xfered_len)
- {
- char *packet_format = 0;
-
- check_binary_download (memaddr);
- switch (packet_support (PACKET_X))
- {
- case PACKET_ENABLE:
- packet_format = "X";
- break;
- case PACKET_DISABLE:
- packet_format = "M";
- break;
- case PACKET_SUPPORT_UNKNOWN:
- internal_error (__FILE__, __LINE__,
- _("remote_write_bytes: bad internal state"));
- default:
- internal_error (__FILE__, __LINE__, _("bad switch"));
- }
- return remote_write_bytes_aux (packet_format,
- memaddr, myaddr, len, xfered_len,
- packet_format[0], 1);
- }
- static enum target_xfer_status
- remote_read_bytes_1 (CORE_ADDR memaddr, gdb_byte *myaddr, ULONGEST len,
- ULONGEST *xfered_len)
- {
- struct remote_state *rs = get_remote_state ();
- int max_buf_size;
- char *p;
- int todo;
- int i;
- max_buf_size = get_memory_read_packet_size ();
-
-
- todo = min (len, max_buf_size / 2);
-
- memaddr = remote_address_masked (memaddr);
- p = rs->buf;
- *p++ = 'm';
- p += hexnumstr (p, (ULONGEST) memaddr);
- *p++ = ',';
- p += hexnumstr (p, (ULONGEST) todo);
- *p = '\0';
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
- if (rs->buf[0] == 'E'
- && isxdigit (rs->buf[1]) && isxdigit (rs->buf[2])
- && rs->buf[3] == '\0')
- return TARGET_XFER_E_IO;
-
- p = rs->buf;
- i = hex2bin (p, myaddr, todo);
-
- *xfered_len = (ULONGEST) i;
- return TARGET_XFER_OK;
- }
- static enum target_xfer_status
- remote_xfer_live_readonly_partial (struct target_ops *ops, gdb_byte *readbuf,
- ULONGEST memaddr, ULONGEST len,
- ULONGEST *xfered_len)
- {
- 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))
- {
- struct target_section *p;
- ULONGEST memend = memaddr + len;
- table = target_get_section_table (ops);
- for (p = table->sections; p < table->sections_end; p++)
- {
- if (memaddr >= p->addr)
- {
- if (memend <= p->endaddr)
- {
-
- return remote_read_bytes_1 (memaddr, readbuf, len,
- xfered_len);
- }
- else if (memaddr >= p->endaddr)
- {
-
- continue;
- }
- else
- {
-
- len = p->endaddr - memaddr;
- return remote_read_bytes_1 (memaddr, readbuf, len,
- xfered_len);
- }
- }
- }
- }
- return TARGET_XFER_EOF;
- }
- static enum target_xfer_status
- remote_read_bytes (struct target_ops *ops, CORE_ADDR memaddr,
- gdb_byte *myaddr, ULONGEST len, ULONGEST *xfered_len)
- {
- if (len == 0)
- return TARGET_XFER_EOF;
- if (get_traceframe_number () != -1)
- {
- VEC(mem_range_s) *available;
-
- if (traceframe_available_memory (&available, memaddr, len))
- {
- struct cleanup *old_chain;
- old_chain = make_cleanup (VEC_cleanup(mem_range_s), &available);
- if (VEC_empty (mem_range_s, available)
- || VEC_index (mem_range_s, available, 0)->start != memaddr)
- {
- enum target_xfer_status res;
-
- if (!VEC_empty (mem_range_s, available))
- {
- LONGEST oldlen = len;
- len = VEC_index (mem_range_s, available, 0)->start - memaddr;
- gdb_assert (len <= oldlen);
- }
- do_cleanups (old_chain);
-
- res = remote_xfer_live_readonly_partial (ops, myaddr, memaddr,
- len, xfered_len);
- if (res == TARGET_XFER_OK)
- return TARGET_XFER_OK;
- else
- {
-
- *xfered_len = len;
- return TARGET_XFER_UNAVAILABLE;
- }
- }
-
- len = VEC_index (mem_range_s, available, 0)->length;
- do_cleanups (old_chain);
- }
- }
- return remote_read_bytes_1 (memaddr, myaddr, len, xfered_len);
- }
- static enum packet_result
- remote_send_printf (const char *format, ...)
- {
- struct remote_state *rs = get_remote_state ();
- int max_size = get_remote_packet_size ();
- va_list ap;
- va_start (ap, format);
- rs->buf[0] = '\0';
- if (vsnprintf (rs->buf, max_size, format, ap) >= max_size)
- internal_error (__FILE__, __LINE__, _("Too long remote packet."));
- if (putpkt (rs->buf) < 0)
- error (_("Communication problem with target."));
- rs->buf[0] = '\0';
- getpkt (&rs->buf, &rs->buf_size, 0);
- return packet_check_result (rs->buf);
- }
- static void
- restore_remote_timeout (void *p)
- {
- int value = *(int *)p;
- remote_timeout = value;
- }
- static const int remote_flash_timeout = 1000;
- static void
- remote_flash_erase (struct target_ops *ops,
- ULONGEST address, LONGEST length)
- {
- int addr_size = gdbarch_addr_bit (target_gdbarch ()) / 8;
- int saved_remote_timeout = remote_timeout;
- enum packet_result ret;
- struct cleanup *back_to = make_cleanup (restore_remote_timeout,
- &saved_remote_timeout);
- remote_timeout = remote_flash_timeout;
- ret = remote_send_printf ("vFlashErase:%s,%s",
- phex (address, addr_size),
- phex (length, 4));
- switch (ret)
- {
- case PACKET_UNKNOWN:
- error (_("Remote target does not support flash erase"));
- case PACKET_ERROR:
- error (_("Error erasing flash with vFlashErase packet"));
- default:
- break;
- }
- do_cleanups (back_to);
- }
- static enum target_xfer_status
- remote_flash_write (struct target_ops *ops, ULONGEST address,
- ULONGEST length, ULONGEST *xfered_len,
- const gdb_byte *data)
- {
- int saved_remote_timeout = remote_timeout;
- enum target_xfer_status ret;
- struct cleanup *back_to = make_cleanup (restore_remote_timeout,
- &saved_remote_timeout);
- remote_timeout = remote_flash_timeout;
- ret = remote_write_bytes_aux ("vFlashWrite:", address, data, length,
- xfered_len,'X', 0);
- do_cleanups (back_to);
- return ret;
- }
- static void
- remote_flash_done (struct target_ops *ops)
- {
- int saved_remote_timeout = remote_timeout;
- int ret;
- struct cleanup *back_to = make_cleanup (restore_remote_timeout,
- &saved_remote_timeout);
- remote_timeout = remote_flash_timeout;
- ret = remote_send_printf ("vFlashDone");
- do_cleanups (back_to);
- switch (ret)
- {
- case PACKET_UNKNOWN:
- error (_("Remote target does not support vFlashDone"));
- case PACKET_ERROR:
- error (_("Error finishing flash operation"));
- default:
- break;
- }
- }
- static void
- remote_files_info (struct target_ops *ignore)
- {
- puts_filtered ("Debugging a target over a serial line.\n");
- }
- static void
- unpush_and_perror (const char *string)
- {
- int saved_errno = errno;
- remote_unpush_target ();
- throw_error (TARGET_CLOSE_ERROR, "%s: %s.", string,
- safe_strerror (saved_errno));
- }
- static int
- readchar (int timeout)
- {
- int ch;
- struct remote_state *rs = get_remote_state ();
- ch = serial_readchar (rs->remote_desc, timeout);
- if (ch >= 0)
- return ch;
- switch ((enum serial_rc) ch)
- {
- case SERIAL_EOF:
- remote_unpush_target ();
- throw_error (TARGET_CLOSE_ERROR, _("Remote connection closed"));
-
- case SERIAL_ERROR:
- unpush_and_perror (_("Remote communication error. "
- "Target disconnected."));
-
- case SERIAL_TIMEOUT:
- break;
- }
- return ch;
- }
- static void
- remote_serial_write (const char *str, int len)
- {
- struct remote_state *rs = get_remote_state ();
- if (serial_write (rs->remote_desc, str, len))
- {
- unpush_and_perror (_("Remote communication error. "
- "Target disconnected."));
- }
- }
- static void
- remote_send (char **buf,
- long *sizeof_buf)
- {
- putpkt (*buf);
- getpkt (buf, sizeof_buf, 0);
- if ((*buf)[0] == 'E')
- error (_("Remote failure reply: %s"), *buf);
- }
- static char *
- escape_buffer (const char *buf, int n)
- {
- struct cleanup *old_chain;
- struct ui_file *stb;
- char *str;
- stb = mem_fileopen ();
- old_chain = make_cleanup_ui_file_delete (stb);
- fputstrn_unfiltered (buf, n, '\\', stb);
- str = ui_file_xstrdup (stb, NULL);
- do_cleanups (old_chain);
- return str;
- }
- static void
- print_packet (const char *buf)
- {
- puts_filtered ("\"");
- fputstr_filtered (buf, '"', gdb_stdout);
- puts_filtered ("\"");
- }
- int
- putpkt (const char *buf)
- {
- return putpkt_binary (buf, strlen (buf));
- }
- static int
- putpkt_binary (const char *buf, int cnt)
- {
- struct remote_state *rs = get_remote_state ();
- int i;
- unsigned char csum = 0;
- char *buf2 = alloca (cnt + 6);
- int ch;
- int tcount = 0;
- char *p;
- char *message;
-
- if (!non_stop && target_can_async_p () && rs->waiting_for_stop_reply)
- {
- error (_("Cannot execute this command while the target is running.\n"
- "Use the \"interrupt\" command to stop the target\n"
- "and then try again."));
- }
-
- rs->cached_wait_status = 0;
-
- p = buf2;
- *p++ = '$';
- for (i = 0; i < cnt; i++)
- {
- csum += buf[i];
- *p++ = buf[i];
- }
- *p++ = '#';
- *p++ = tohex ((csum >> 4) & 0xf);
- *p++ = tohex (csum & 0xf);
-
- while (1)
- {
- int started_error_output = 0;
- if (remote_debug)
- {
- struct cleanup *old_chain;
- char *str;
- *p = '\0';
- str = escape_buffer (buf2, p - buf2);
- old_chain = make_cleanup (xfree, str);
- fprintf_unfiltered (gdb_stdlog, "Sending packet: %s...", str);
- gdb_flush (gdb_stdlog);
- do_cleanups (old_chain);
- }
- remote_serial_write (buf2, p - buf2);
-
- if (rs->noack_mode)
- break;
-
- while (1)
- {
- ch = readchar (remote_timeout);
- if (remote_debug)
- {
- switch (ch)
- {
- case '+':
- case '-':
- case SERIAL_TIMEOUT:
- case '$':
- case '%':
- if (started_error_output)
- {
- putchar_unfiltered ('\n');
- started_error_output = 0;
- }
- }
- }
- switch (ch)
- {
- case '+':
- if (remote_debug)
- fprintf_unfiltered (gdb_stdlog, "Ack\n");
- return 1;
- case '-':
- if (remote_debug)
- fprintf_unfiltered (gdb_stdlog, "Nak\n");
-
- case SERIAL_TIMEOUT:
- tcount++;
- if (tcount > 3)
- return 0;
- break;
- case '$':
- {
- if (remote_debug)
- fprintf_unfiltered (gdb_stdlog,
- "Packet instead of Ack, ignoring it\n");
-
- skip_frame ();
- remote_serial_write ("+", 1);
- continue;
- }
- case '%':
- {
- int val;
-
-
- val = read_frame (&rs->buf, &rs->buf_size);
- if (val >= 0)
- {
- if (remote_debug)
- {
- struct cleanup *old_chain;
- char *str;
- str = escape_buffer (rs->buf, val);
- old_chain = make_cleanup (xfree, str);
- fprintf_unfiltered (gdb_stdlog,
- " Notification received: %s\n",
- str);
- do_cleanups (old_chain);
- }
- handle_notification (rs->notif_state, rs->buf);
-
- tcount = 0;
- }
- else
- {
- if (remote_debug)
- {
- if (!started_error_output)
- {
- started_error_output = 1;
- fprintf_unfiltered (gdb_stdlog, "putpkt: Junk: ");
- }
- fputc_unfiltered (ch & 0177, gdb_stdlog);
- fprintf_unfiltered (gdb_stdlog, "%s", rs->buf);
- }
- }
- continue;
- }
-
- default:
- if (remote_debug)
- {
- if (!started_error_output)
- {
- started_error_output = 1;
- fprintf_unfiltered (gdb_stdlog, "putpkt: Junk: ");
- }
- fputc_unfiltered (ch & 0177, gdb_stdlog);
- }
- continue;
- }
- break;
- }
- #if 0
- #endif
- }
- return 0;
- }
- static void
- skip_frame (void)
- {
- int c;
- while (1)
- {
- c = readchar (remote_timeout);
- switch (c)
- {
- case SERIAL_TIMEOUT:
-
- return;
- case '#':
-
- c = readchar (remote_timeout);
- if (c >= 0)
- c = readchar (remote_timeout);
- return;
- case '*':
-
- c = readchar (remote_timeout);
- if (c < 0)
- return;
- break;
- default:
-
- break;
- }
- }
- }
- static long
- read_frame (char **buf_p,
- long *sizeof_buf)
- {
- unsigned char csum;
- long bc;
- int c;
- char *buf = *buf_p;
- struct remote_state *rs = get_remote_state ();
- csum = 0;
- bc = 0;
- while (1)
- {
- c = readchar (remote_timeout);
- switch (c)
- {
- case SERIAL_TIMEOUT:
- if (remote_debug)
- fputs_filtered ("Timeout in mid-packet, retrying\n", gdb_stdlog);
- return -1;
- case '$':
- if (remote_debug)
- fputs_filtered ("Saw new packet start in middle of old one\n",
- gdb_stdlog);
- return -1;
- case '#':
- {
- unsigned char pktcsum;
- int check_0 = 0;
- int check_1 = 0;
- buf[bc] = '\0';
- check_0 = readchar (remote_timeout);
- if (check_0 >= 0)
- check_1 = readchar (remote_timeout);
- if (check_0 == SERIAL_TIMEOUT || check_1 == SERIAL_TIMEOUT)
- {
- if (remote_debug)
- fputs_filtered ("Timeout in checksum, retrying\n",
- gdb_stdlog);
- return -1;
- }
- else if (check_0 < 0 || check_1 < 0)
- {
- if (remote_debug)
- fputs_filtered ("Communication error in checksum\n",
- gdb_stdlog);
- return -1;
- }
-
- if (rs->noack_mode)
- return bc;
- pktcsum = (fromhex (check_0) << 4) | fromhex (check_1);
- if (csum == pktcsum)
- return bc;
- if (remote_debug)
- {
- struct cleanup *old_chain;
- char *str;
- str = escape_buffer (buf, bc);
- old_chain = make_cleanup (xfree, str);
- fprintf_unfiltered (gdb_stdlog,
- "Bad checksum, sentsum=0x%x, "
- "csum=0x%x, buf=%s\n",
- pktcsum, csum, str);
- do_cleanups (old_chain);
- }
-
- return -1;
- }
- case '*':
- {
- int repeat;
- csum += c;
- c = readchar (remote_timeout);
- csum += c;
- repeat = c - ' ' + 3;
-
- if (repeat > 0 && repeat <= 255 && bc > 0)
- {
- if (bc + repeat - 1 >= *sizeof_buf - 1)
- {
-
- *sizeof_buf += repeat;
- *buf_p = xrealloc (*buf_p, *sizeof_buf);
- buf = *buf_p;
- }
- memset (&buf[bc], buf[bc - 1], repeat);
- bc += repeat;
- continue;
- }
- buf[bc] = '\0';
- printf_filtered (_("Invalid run length encoding: %s\n"), buf);
- return -1;
- }
- default:
- if (bc >= *sizeof_buf - 1)
- {
-
- *sizeof_buf *= 2;
- *buf_p = xrealloc (*buf_p, *sizeof_buf);
- buf = *buf_p;
- }
- buf[bc++] = c;
- csum += c;
- continue;
- }
- }
- }
- FIXME
- void
- getpkt (char **buf,
- long *sizeof_buf,
- int forever)
- {
- int timed_out;
- timed_out = getpkt_sane (buf, sizeof_buf, forever);
- }
- static int
- getpkt_or_notif_sane_1 (char **buf, long *sizeof_buf, int forever,
- int expecting_notif, int *is_notif)
- {
- struct remote_state *rs = get_remote_state ();
- int c;
- int tries;
- int timeout;
- int val = -1;
-
- rs->cached_wait_status = 0;
- strcpy (*buf, "timeout");
- if (forever)
- timeout = watchdog > 0 ? watchdog : -1;
- else if (expecting_notif)
- timeout = 0;
- else
- timeout = remote_timeout;
- #define MAX_TRIES 3
-
- for (;;)
- {
-
- for (tries = 1; tries <= MAX_TRIES; tries++)
- {
-
- do
- c = readchar (timeout);
- while (c != SERIAL_TIMEOUT && c != '$' && c != '%');
- if (c == SERIAL_TIMEOUT)
- {
- if (expecting_notif)
- return -1;
- if (forever)
- {
- QUIT;
- remote_unpush_target ();
- throw_error (TARGET_CLOSE_ERROR,
- _("Watchdog timeout has expired. "
- "Target detached."));
- }
- if (remote_debug)
- fputs_filtered ("Timed out.\n", gdb_stdlog);
- }
- else
- {
-
- val = read_frame (buf, sizeof_buf);
- if (val >= 0)
- break;
- }
- remote_serial_write ("-", 1);
- }
- if (tries > MAX_TRIES)
- {
-
- printf_unfiltered (_("Ignoring packet error, continuing...\n"));
-
- if (!rs->noack_mode)
- remote_serial_write ("+", 1);
- return -1;
- }
-
- if (c == '$')
- {
- if (remote_debug)
- {
- struct cleanup *old_chain;
- char *str;
- str = escape_buffer (*buf, val);
- old_chain = make_cleanup (xfree, str);
- fprintf_unfiltered (gdb_stdlog, "Packet received: %s\n", str);
- do_cleanups (old_chain);
- }
-
- if (!rs->noack_mode)
- remote_serial_write ("+", 1);
- if (is_notif != NULL)
- *is_notif = 0;
- return val;
- }
-
- else
- {
- gdb_assert (c == '%');
- if (remote_debug)
- {
- struct cleanup *old_chain;
- char *str;
- str = escape_buffer (*buf, val);
- old_chain = make_cleanup (xfree, str);
- fprintf_unfiltered (gdb_stdlog,
- " Notification received: %s\n",
- str);
- do_cleanups (old_chain);
- }
- if (is_notif != NULL)
- *is_notif = 1;
- handle_notification (rs->notif_state, *buf);
-
- if (expecting_notif)
- return val;
- }
- }
- }
- static int
- getpkt_sane (char **buf, long *sizeof_buf, int forever)
- {
- return getpkt_or_notif_sane_1 (buf, sizeof_buf, forever, 0, NULL);
- }
- static int
- getpkt_or_notif_sane (char **buf, long *sizeof_buf, int forever,
- int *is_notif)
- {
- return getpkt_or_notif_sane_1 (buf, sizeof_buf, forever, 1,
- is_notif);
- }
- static void
- remote_kill (struct target_ops *ops)
- {
- volatile struct gdb_exception ex;
-
- TRY_CATCH (ex, RETURN_MASK_ERROR)
- {
- putpkt ("k");
- }
- if (ex.reason < 0)
- {
- if (ex.error == TARGET_CLOSE_ERROR)
- {
-
- return;
- }
-
- throw_exception (ex);
- }
-
- target_mourn_inferior ();
- }
- static int
- remote_vkill (int pid, struct remote_state *rs)
- {
- if (packet_support (PACKET_vKill) == PACKET_DISABLE)
- return -1;
-
- xsnprintf (rs->buf, get_remote_packet_size (), "vKill;%x", pid);
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
- switch (packet_ok (rs->buf,
- &remote_protocol_packets[PACKET_vKill]))
- {
- case PACKET_OK:
- return 0;
- case PACKET_ERROR:
- return 1;
- case PACKET_UNKNOWN:
- return -1;
- default:
- internal_error (__FILE__, __LINE__, _("Bad result from packet_ok"));
- }
- }
- static void
- extended_remote_kill (struct target_ops *ops)
- {
- int res;
- int pid = ptid_get_pid (inferior_ptid);
- struct remote_state *rs = get_remote_state ();
- res = remote_vkill (pid, rs);
- if (res == -1 && !(rs->extended && remote_multi_process_p (rs)))
- {
-
- putpkt ("k");
- #if 0
- #else
-
- res = 0;
- #endif
- }
- if (res != 0)
- error (_("Can't kill process"));
- target_mourn_inferior ();
- }
- static void
- remote_mourn (struct target_ops *ops)
- {
- remote_mourn_1 (ops);
- }
- static void
- remote_mourn_1 (struct target_ops *target)
- {
- unpush_target (target);
-
- generic_mourn_inferior ();
- }
- static void
- extended_remote_mourn_1 (struct target_ops *target)
- {
- struct remote_state *rs = get_remote_state ();
-
- rs->waiting_for_stop_reply = 0;
-
- record_currthread (rs, minus_one_ptid);
-
-
- generic_mourn_inferior ();
- if (!have_inferiors ())
- {
- if (!remote_multi_process_p (rs))
- {
-
- putpkt ("?");
- getpkt (&rs->buf, &rs->buf_size, 0);
- if (rs->buf[0] == 'S' || rs->buf[0] == 'T')
- {
-
- inferior_ptid = magic_null_ptid;
- }
- }
- }
- }
- static void
- extended_remote_mourn (struct target_ops *ops)
- {
- extended_remote_mourn_1 (ops);
- }
- static int
- extended_remote_supports_disable_randomization (struct target_ops *self)
- {
- return packet_support (PACKET_QDisableRandomization) == PACKET_ENABLE;
- }
- static void
- extended_remote_disable_randomization (int val)
- {
- struct remote_state *rs = get_remote_state ();
- char *reply;
- xsnprintf (rs->buf, get_remote_packet_size (), "QDisableRandomization:%x",
- val);
- putpkt (rs->buf);
- reply = remote_get_noisy_reply (&target_buf, &target_buf_size);
- if (*reply == '\0')
- error (_("Target does not support QDisableRandomization."));
- if (strcmp (reply, "OK") != 0)
- error (_("Bogus QDisableRandomization reply from target: %s"), reply);
- }
- static int
- extended_remote_run (char *args)
- {
- struct remote_state *rs = get_remote_state ();
- int len;
-
- if (packet_support (PACKET_vRun) == PACKET_DISABLE)
- return -1;
- strcpy (rs->buf, "vRun;");
- len = strlen (rs->buf);
- if (strlen (remote_exec_file) * 2 + len >= get_remote_packet_size ())
- error (_("Remote file name too long for run packet"));
- len += 2 * bin2hex ((gdb_byte *) remote_exec_file, rs->buf + len,
- strlen (remote_exec_file));
- gdb_assert (args != NULL);
- if (*args)
- {
- struct cleanup *back_to;
- int i;
- char **argv;
- argv = gdb_buildargv (args);
- back_to = make_cleanup_freeargv (argv);
- for (i = 0; argv[i] != NULL; i++)
- {
- if (strlen (argv[i]) * 2 + 1 + len >= get_remote_packet_size ())
- error (_("Argument list too long for run packet"));
- rs->buf[len++] = ';';
- len += 2 * bin2hex ((gdb_byte *) argv[i], rs->buf + len,
- strlen (argv[i]));
- }
- do_cleanups (back_to);
- }
- rs->buf[len++] = '\0';
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
- switch (packet_ok (rs->buf, &remote_protocol_packets[PACKET_vRun]))
- {
- case PACKET_OK:
-
- return 0;
- case PACKET_UNKNOWN:
- return -1;
- case PACKET_ERROR:
- if (remote_exec_file[0] == '\0')
- error (_("Running the default executable on the remote target failed; "
- "try \"set remote exec-file\"?"));
- else
- error (_("Running \"%s\" on the remote target failed"),
- remote_exec_file);
- default:
- gdb_assert_not_reached (_("bad switch"));
- }
- }
- static void
- extended_remote_create_inferior (struct target_ops *ops,
- char *exec_file, char *args,
- char **env, int from_tty)
- {
- int run_worked;
- char *stop_reply;
- struct remote_state *rs = get_remote_state ();
-
- if (target_can_async_p ())
- target_async (inferior_event_handler, 0);
-
- if (extended_remote_supports_disable_randomization (ops))
- extended_remote_disable_randomization (disable_randomization);
-
- run_worked = extended_remote_run (args) != -1;
- if (!run_worked)
- {
-
- if (remote_exec_file[0])
- error (_("Remote target does not support \"set remote exec-file\""));
- if (args[0])
- error (_("Remote target does not support \"set args\" or run <ARGS>"));
-
- extended_remote_restart ();
- }
- if (!have_inferiors ())
- {
-
- init_thread_list ();
- init_wait_for_inferior ();
- }
-
- stop_reply = run_worked ? rs->buf : NULL;
- add_current_inferior_and_thread (stop_reply);
-
- get_offsets ();
- }
- static int
- remote_add_target_side_condition (struct gdbarch *gdbarch,
- struct bp_target_info *bp_tgt, char *buf,
- char *buf_end)
- {
- struct agent_expr *aexpr = NULL;
- int i, ix;
- char *pkt;
- char *buf_start = buf;
- if (VEC_empty (agent_expr_p, bp_tgt->conditions))
- return 0;
- buf += strlen (buf);
- xsnprintf (buf, buf_end - buf, "%s", ";");
- buf++;
-
- for (ix = 0;
- VEC_iterate (agent_expr_p, bp_tgt->conditions, ix, aexpr);
- ix++)
- {
- xsnprintf (buf, buf_end - buf, "X%x,", aexpr->len);
- buf += strlen (buf);
- for (i = 0; i < aexpr->len; ++i)
- buf = pack_hex_byte (buf, aexpr->buf[i]);
- *buf = '\0';
- }
- return 0;
- }
- static void
- remote_add_target_side_commands (struct gdbarch *gdbarch,
- struct bp_target_info *bp_tgt, char *buf)
- {
- struct agent_expr *aexpr = NULL;
- int i, ix;
- if (VEC_empty (agent_expr_p, bp_tgt->tcommands))
- return;
- buf += strlen (buf);
- sprintf (buf, ";cmds:%x,", bp_tgt->persist);
- buf += strlen (buf);
-
- for (ix = 0;
- VEC_iterate (agent_expr_p, bp_tgt->tcommands, ix, aexpr);
- ix++)
- {
- sprintf (buf, "X%x,", aexpr->len);
- buf += strlen (buf);
- for (i = 0; i < aexpr->len; ++i)
- buf = pack_hex_byte (buf, aexpr->buf[i]);
- *buf = '\0';
- }
- }
- static int
- remote_insert_breakpoint (struct target_ops *ops,
- struct gdbarch *gdbarch,
- struct bp_target_info *bp_tgt)
- {
-
- if (packet_support (PACKET_Z0) != PACKET_DISABLE)
- {
- CORE_ADDR addr = bp_tgt->reqstd_address;
- struct remote_state *rs;
- char *p, *endbuf;
- int bpsize;
- struct condition_list *cond = NULL;
-
- if (!gdbarch_has_global_breakpoints (target_gdbarch ()))
- set_general_process ();
- gdbarch_remote_breakpoint_from_pc (gdbarch, &addr, &bpsize);
- rs = get_remote_state ();
- p = rs->buf;
- endbuf = rs->buf + get_remote_packet_size ();
- *(p++) = 'Z';
- *(p++) = '0';
- *(p++) = ',';
- addr = (ULONGEST) remote_address_masked (addr);
- p += hexnumstr (p, addr);
- xsnprintf (p, endbuf - p, ",%d", bpsize);
- if (remote_supports_cond_breakpoints (ops))
- remote_add_target_side_condition (gdbarch, bp_tgt, p, endbuf);
- if (remote_can_run_breakpoint_commands (ops))
- remote_add_target_side_commands (gdbarch, bp_tgt, p);
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
- switch (packet_ok (rs->buf, &remote_protocol_packets[PACKET_Z0]))
- {
- case PACKET_ERROR:
- return -1;
- case PACKET_OK:
- bp_tgt->placed_address = addr;
- bp_tgt->placed_size = bpsize;
- return 0;
- case PACKET_UNKNOWN:
- break;
- }
- }
-
- if (!VEC_empty (agent_expr_p, bp_tgt->tcommands))
- throw_error (NOT_SUPPORTED_ERROR, _("\
- Target doesn't support breakpoints that have target side commands."));
- return memory_insert_breakpoint (ops, gdbarch, bp_tgt);
- }
- static int
- remote_remove_breakpoint (struct target_ops *ops,
- struct gdbarch *gdbarch,
- struct bp_target_info *bp_tgt)
- {
- CORE_ADDR addr = bp_tgt->placed_address;
- struct remote_state *rs = get_remote_state ();
- if (packet_support (PACKET_Z0) != PACKET_DISABLE)
- {
- char *p = rs->buf;
- char *endbuf = rs->buf + get_remote_packet_size ();
-
- if (!gdbarch_has_global_breakpoints (target_gdbarch ()))
- set_general_process ();
- *(p++) = 'z';
- *(p++) = '0';
- *(p++) = ',';
- addr = (ULONGEST) remote_address_masked (bp_tgt->placed_address);
- p += hexnumstr (p, addr);
- xsnprintf (p, endbuf - p, ",%d", bp_tgt->placed_size);
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
- return (rs->buf[0] == 'E');
- }
- return memory_remove_breakpoint (ops, gdbarch, bp_tgt);
- }
- static int
- watchpoint_to_Z_packet (int type)
- {
- switch (type)
- {
- case hw_write:
- return Z_PACKET_WRITE_WP;
- break;
- case hw_read:
- return Z_PACKET_READ_WP;
- break;
- case hw_access:
- return Z_PACKET_ACCESS_WP;
- break;
- default:
- internal_error (__FILE__, __LINE__,
- _("hw_bp_to_z: bad watchpoint type %d"), type);
- }
- }
- static int
- remote_insert_watchpoint (struct target_ops *self,
- CORE_ADDR addr, int len, int type,
- struct expression *cond)
- {
- struct remote_state *rs = get_remote_state ();
- char *endbuf = rs->buf + get_remote_packet_size ();
- char *p;
- enum Z_packet_type packet = watchpoint_to_Z_packet (type);
- if (packet_support (PACKET_Z0 + packet) == PACKET_DISABLE)
- return 1;
-
- if (!gdbarch_has_global_breakpoints (target_gdbarch ()))
- set_general_process ();
- xsnprintf (rs->buf, endbuf - rs->buf, "Z%x,", packet);
- p = strchr (rs->buf, '\0');
- addr = remote_address_masked (addr);
- p += hexnumstr (p, (ULONGEST) addr);
- xsnprintf (p, endbuf - p, ",%x", len);
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
- switch (packet_ok (rs->buf, &remote_protocol_packets[PACKET_Z0 + packet]))
- {
- case PACKET_ERROR:
- return -1;
- case PACKET_UNKNOWN:
- return 1;
- case PACKET_OK:
- return 0;
- }
- internal_error (__FILE__, __LINE__,
- _("remote_insert_watchpoint: reached end of function"));
- }
- static int
- remote_watchpoint_addr_within_range (struct target_ops *target, CORE_ADDR addr,
- CORE_ADDR start, int length)
- {
- CORE_ADDR diff = remote_address_masked (addr - start);
- return diff < length;
- }
- static int
- remote_remove_watchpoint (struct target_ops *self,
- CORE_ADDR addr, int len, int type,
- struct expression *cond)
- {
- struct remote_state *rs = get_remote_state ();
- char *endbuf = rs->buf + get_remote_packet_size ();
- char *p;
- enum Z_packet_type packet = watchpoint_to_Z_packet (type);
- if (packet_support (PACKET_Z0 + packet) == PACKET_DISABLE)
- return -1;
-
- if (!gdbarch_has_global_breakpoints (target_gdbarch ()))
- set_general_process ();
- xsnprintf (rs->buf, endbuf - rs->buf, "z%x,", packet);
- p = strchr (rs->buf, '\0');
- addr = remote_address_masked (addr);
- p += hexnumstr (p, (ULONGEST) addr);
- xsnprintf (p, endbuf - p, ",%x", len);
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
- switch (packet_ok (rs->buf, &remote_protocol_packets[PACKET_Z0 + packet]))
- {
- case PACKET_ERROR:
- case PACKET_UNKNOWN:
- return -1;
- case PACKET_OK:
- return 0;
- }
- internal_error (__FILE__, __LINE__,
- _("remote_remove_watchpoint: reached end of function"));
- }
- int remote_hw_watchpoint_limit = -1;
- int remote_hw_watchpoint_length_limit = -1;
- int remote_hw_breakpoint_limit = -1;
- static int
- remote_region_ok_for_hw_watchpoint (struct target_ops *self,
- CORE_ADDR addr, int len)
- {
- if (remote_hw_watchpoint_length_limit == 0)
- return 0;
- else if (remote_hw_watchpoint_length_limit < 0)
- return 1;
- else if (len <= remote_hw_watchpoint_length_limit)
- return 1;
- else
- return 0;
- }
- static int
- remote_check_watch_resources (struct target_ops *self,
- int type, int cnt, int ot)
- {
- if (type == bp_hardware_breakpoint)
- {
- if (remote_hw_breakpoint_limit == 0)
- return 0;
- else if (remote_hw_breakpoint_limit < 0)
- return 1;
- else if (cnt <= remote_hw_breakpoint_limit)
- return 1;
- }
- else
- {
- if (remote_hw_watchpoint_limit == 0)
- return 0;
- else if (remote_hw_watchpoint_limit < 0)
- return 1;
- else if (ot)
- return -1;
- else if (cnt <= remote_hw_watchpoint_limit)
- return 1;
- }
- return -1;
- }
- static int
- remote_stopped_by_watchpoint (struct target_ops *ops)
- {
- struct remote_state *rs = get_remote_state ();
- return rs->remote_stopped_by_watchpoint_p;
- }
- static int
- remote_stopped_data_address (struct target_ops *target, CORE_ADDR *addr_p)
- {
- struct remote_state *rs = get_remote_state ();
- int rc = 0;
- if (remote_stopped_by_watchpoint (target))
- {
- *addr_p = rs->remote_watch_data_address;
- rc = 1;
- }
- return rc;
- }
- static int
- remote_insert_hw_breakpoint (struct target_ops *self, struct gdbarch *gdbarch,
- struct bp_target_info *bp_tgt)
- {
- CORE_ADDR addr = bp_tgt->reqstd_address;
- struct remote_state *rs;
- char *p, *endbuf;
- char *message;
- int bpsize;
-
- gdbarch_remote_breakpoint_from_pc (gdbarch, &addr, &bpsize);
- if (packet_support (PACKET_Z1) == PACKET_DISABLE)
- return -1;
-
- if (!gdbarch_has_global_breakpoints (target_gdbarch ()))
- set_general_process ();
- rs = get_remote_state ();
- p = rs->buf;
- endbuf = rs->buf + get_remote_packet_size ();
- *(p++) = 'Z';
- *(p++) = '1';
- *(p++) = ',';
- addr = remote_address_masked (addr);
- p += hexnumstr (p, (ULONGEST) addr);
- xsnprintf (p, endbuf - p, ",%x", bpsize);
- if (remote_supports_cond_breakpoints (self))
- remote_add_target_side_condition (gdbarch, bp_tgt, p, endbuf);
- if (remote_can_run_breakpoint_commands (self))
- remote_add_target_side_commands (gdbarch, bp_tgt, p);
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
- switch (packet_ok (rs->buf, &remote_protocol_packets[PACKET_Z1]))
- {
- case PACKET_ERROR:
- if (rs->buf[1] == '.')
- {
- message = strchr (rs->buf + 2, '.');
- if (message)
- error (_("Remote failure reply: %s"), message + 1);
- }
- return -1;
- case PACKET_UNKNOWN:
- return -1;
- case PACKET_OK:
- bp_tgt->placed_address = addr;
- bp_tgt->placed_size = bpsize;
- return 0;
- }
- internal_error (__FILE__, __LINE__,
- _("remote_insert_hw_breakpoint: reached end of function"));
- }
- static int
- remote_remove_hw_breakpoint (struct target_ops *self, struct gdbarch *gdbarch,
- struct bp_target_info *bp_tgt)
- {
- CORE_ADDR addr;
- struct remote_state *rs = get_remote_state ();
- char *p = rs->buf;
- char *endbuf = rs->buf + get_remote_packet_size ();
- if (packet_support (PACKET_Z1) == PACKET_DISABLE)
- return -1;
-
- if (!gdbarch_has_global_breakpoints (target_gdbarch ()))
- set_general_process ();
- *(p++) = 'z';
- *(p++) = '1';
- *(p++) = ',';
- addr = remote_address_masked (bp_tgt->placed_address);
- p += hexnumstr (p, (ULONGEST) addr);
- xsnprintf (p, endbuf - p, ",%x", bp_tgt->placed_size);
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
- switch (packet_ok (rs->buf, &remote_protocol_packets[PACKET_Z1]))
- {
- case PACKET_ERROR:
- case PACKET_UNKNOWN:
- return -1;
- case PACKET_OK:
- return 0;
- }
- internal_error (__FILE__, __LINE__,
- _("remote_remove_hw_breakpoint: reached end of function"));
- }
- static int
- remote_verify_memory (struct target_ops *ops,
- const gdb_byte *data, CORE_ADDR lma, ULONGEST size)
- {
- struct remote_state *rs = get_remote_state ();
- unsigned long host_crc, target_crc;
- char *tmp;
-
- if (target_has_execution && packet_support (PACKET_qCRC) != PACKET_DISABLE)
- {
- enum packet_result result;
-
- set_general_process ();
- FIXME
- xsnprintf (rs->buf, get_remote_packet_size (), "qCRC:%lx,%lx",
- (long) lma, (long) size);
- putpkt (rs->buf);
-
- host_crc = xcrc32 (data, size, 0xffffffff);
- getpkt (&rs->buf, &rs->buf_size, 0);
- result = packet_ok (rs->buf,
- &remote_protocol_packets[PACKET_qCRC]);
- if (result == PACKET_ERROR)
- return -1;
- else if (result == PACKET_OK)
- {
- for (target_crc = 0, tmp = &rs->buf[1]; *tmp; tmp++)
- target_crc = target_crc * 16 + fromhex (*tmp);
- return (host_crc == target_crc);
- }
- }
- return simple_verify_memory (ops, data, lma, size);
- }
- static void
- compare_sections_command (char *args, int from_tty)
- {
- asection *s;
- struct cleanup *old_chain;
- gdb_byte *sectdata;
- const char *sectname;
- bfd_size_type size;
- bfd_vma lma;
- int matched = 0;
- int mismatched = 0;
- int res;
- int read_only = 0;
- if (!exec_bfd)
- error (_("command cannot be used without an exec file"));
-
- set_general_process ();
- if (args != NULL && strcmp (args, "-r") == 0)
- {
- read_only = 1;
- args = NULL;
- }
- for (s = exec_bfd->sections; s; s = s->next)
- {
- if (!(s->flags & SEC_LOAD))
- continue;
- if (read_only && (s->flags & SEC_READONLY) == 0)
- continue;
- size = bfd_get_section_size (s);
- if (size == 0)
- continue;
- sectname = bfd_get_section_name (exec_bfd, s);
- if (args && strcmp (args, sectname) != 0)
- continue;
- matched = 1;
- lma = s->lma;
- sectdata = xmalloc (size);
- old_chain = make_cleanup (xfree, sectdata);
- bfd_get_section_contents (exec_bfd, s, sectdata, 0, size);
- res = target_verify_memory (sectdata, lma, size);
- if (res == -1)
- error (_("target memory fault, section %s, range %s -- %s"), sectname,
- paddress (target_gdbarch (), lma),
- paddress (target_gdbarch (), lma + size));
- printf_filtered ("Section %s, range %s -- %s: ", sectname,
- paddress (target_gdbarch (), lma),
- paddress (target_gdbarch (), lma + size));
- if (res)
- printf_filtered ("matched.\n");
- else
- {
- printf_filtered ("MIS-MATCHED!\n");
- mismatched++;
- }
- do_cleanups (old_chain);
- }
- if (mismatched > 0)
- warning (_("One or more sections of the target image does not match\n\
- the loaded file\n"));
- if (args && !matched)
- printf_filtered (_("No loaded section named '%s'.\n"), args);
- }
- static enum target_xfer_status
- remote_write_qxfer (struct target_ops *ops, const char *object_name,
- const char *annex, const gdb_byte *writebuf,
- ULONGEST offset, LONGEST len, ULONGEST *xfered_len,
- struct packet_config *packet)
- {
- int i, buf_len;
- ULONGEST n;
- struct remote_state *rs = get_remote_state ();
- int max_size = get_memory_write_packet_size ();
- if (packet->support == PACKET_DISABLE)
- return TARGET_XFER_E_IO;
-
- i = snprintf (rs->buf, max_size,
- "qXfer:%s:write:%s:%s:",
- object_name, annex ? annex : "",
- phex_nz (offset, sizeof offset));
- max_size -= (i + 1);
-
- buf_len = remote_escape_output
- (writebuf, len, (gdb_byte *) rs->buf + i, &max_size, max_size);
- if (putpkt_binary (rs->buf, i + buf_len) < 0
- || getpkt_sane (&rs->buf, &rs->buf_size, 0) < 0
- || packet_ok (rs->buf, packet) != PACKET_OK)
- return TARGET_XFER_E_IO;
- unpack_varlen_hex (rs->buf, &n);
- *xfered_len = n;
- return TARGET_XFER_OK;
- }
- static enum target_xfer_status
- remote_read_qxfer (struct target_ops *ops, const char *object_name,
- const char *annex,
- gdb_byte *readbuf, ULONGEST offset, LONGEST len,
- ULONGEST *xfered_len,
- struct packet_config *packet)
- {
- struct remote_state *rs = get_remote_state ();
- LONGEST i, n, packet_len;
- if (packet->support == PACKET_DISABLE)
- return TARGET_XFER_E_IO;
-
- if (rs->finished_object)
- {
- if (strcmp (object_name, rs->finished_object) == 0
- && strcmp (annex ? annex : "", rs->finished_annex) == 0
- && offset == rs->finished_offset)
- return TARGET_XFER_EOF;
-
- xfree (rs->finished_object);
- xfree (rs->finished_annex);
- rs->finished_object = NULL;
- rs->finished_annex = NULL;
- }
-
- n = min (get_remote_packet_size () - 5, len);
- snprintf (rs->buf, get_remote_packet_size () - 4, "qXfer:%s:read:%s:%s,%s",
- object_name, annex ? annex : "",
- phex_nz (offset, sizeof offset),
- phex_nz (n, sizeof n));
- i = putpkt (rs->buf);
- if (i < 0)
- return TARGET_XFER_E_IO;
- rs->buf[0] = '\0';
- packet_len = getpkt_sane (&rs->buf, &rs->buf_size, 0);
- if (packet_len < 0 || packet_ok (rs->buf, packet) != PACKET_OK)
- return TARGET_XFER_E_IO;
- if (rs->buf[0] != 'l' && rs->buf[0] != 'm')
- error (_("Unknown remote qXfer reply: %s"), rs->buf);
-
- if (rs->buf[0] == 'm' && packet_len == 1)
- error (_("Remote qXfer reply contained no data."));
-
- i = remote_unescape_input ((gdb_byte *) rs->buf + 1,
- packet_len - 1, readbuf, n);
-
- if (rs->buf[0] == 'l' && offset + i > 0)
- {
- rs->finished_object = xstrdup (object_name);
- rs->finished_annex = xstrdup (annex ? annex : "");
- rs->finished_offset = offset + i;
- }
- if (i == 0)
- return TARGET_XFER_EOF;
- else
- {
- *xfered_len = i;
- return TARGET_XFER_OK;
- }
- }
- static enum target_xfer_status
- remote_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)
- {
- struct remote_state *rs;
- int i;
- char *p2;
- char query_type;
- set_remote_traceframe ();
- set_general_thread (inferior_ptid);
- rs = get_remote_state ();
-
- if (object == TARGET_OBJECT_MEMORY)
- {
-
- if (!target_has_execution)
- return TARGET_XFER_EOF;
- if (writebuf != NULL)
- return remote_write_bytes (offset, writebuf, len, xfered_len);
- else
- return remote_read_bytes (ops, offset, readbuf, len, xfered_len);
- }
-
- if (object == TARGET_OBJECT_SPU)
- {
- if (readbuf)
- return remote_read_qxfer (ops, "spu", annex, readbuf, offset, len,
- xfered_len, &remote_protocol_packets
- [PACKET_qXfer_spu_read]);
- else
- return remote_write_qxfer (ops, "spu", annex, writebuf, offset, len,
- xfered_len, &remote_protocol_packets
- [PACKET_qXfer_spu_write]);
- }
-
- if (object == TARGET_OBJECT_SIGNAL_INFO)
- {
- if (readbuf)
- return remote_read_qxfer (ops, "siginfo", annex, readbuf, offset, len,
- xfered_len, &remote_protocol_packets
- [PACKET_qXfer_siginfo_read]);
- else
- return remote_write_qxfer (ops, "siginfo", annex,
- writebuf, offset, len, xfered_len,
- &remote_protocol_packets
- [PACKET_qXfer_siginfo_write]);
- }
- if (object == TARGET_OBJECT_STATIC_TRACE_DATA)
- {
- if (readbuf)
- return remote_read_qxfer (ops, "statictrace", annex,
- readbuf, offset, len, xfered_len,
- &remote_protocol_packets
- [PACKET_qXfer_statictrace_read]);
- else
- return TARGET_XFER_E_IO;
- }
-
- if (writebuf != NULL)
- {
- LONGEST xfered;
- switch (object)
- {
- case TARGET_OBJECT_FLASH:
- return remote_flash_write (ops, offset, len, xfered_len,
- writebuf);
- default:
- return TARGET_XFER_E_IO;
- }
- }
-
- switch (object)
- {
- case TARGET_OBJECT_AVR:
- query_type = 'R';
- break;
- case TARGET_OBJECT_AUXV:
- gdb_assert (annex == NULL);
- return remote_read_qxfer (ops, "auxv", annex, readbuf, offset, len,
- xfered_len,
- &remote_protocol_packets[PACKET_qXfer_auxv]);
- case TARGET_OBJECT_AVAILABLE_FEATURES:
- return remote_read_qxfer
- (ops, "features", annex, readbuf, offset, len, xfered_len,
- &remote_protocol_packets[PACKET_qXfer_features]);
- case TARGET_OBJECT_LIBRARIES:
- return remote_read_qxfer
- (ops, "libraries", annex, readbuf, offset, len, xfered_len,
- &remote_protocol_packets[PACKET_qXfer_libraries]);
- case TARGET_OBJECT_LIBRARIES_SVR4:
- return remote_read_qxfer
- (ops, "libraries-svr4", annex, readbuf, offset, len, xfered_len,
- &remote_protocol_packets[PACKET_qXfer_libraries_svr4]);
- case TARGET_OBJECT_MEMORY_MAP:
- gdb_assert (annex == NULL);
- return remote_read_qxfer (ops, "memory-map", annex, readbuf, offset, len,
- xfered_len,
- &remote_protocol_packets[PACKET_qXfer_memory_map]);
- case TARGET_OBJECT_OSDATA:
-
- gdb_assert (rs->remote_desc);
- return remote_read_qxfer
- (ops, "osdata", annex, readbuf, offset, len, xfered_len,
- &remote_protocol_packets[PACKET_qXfer_osdata]);
- case TARGET_OBJECT_THREADS:
- gdb_assert (annex == NULL);
- return remote_read_qxfer (ops, "threads", annex, readbuf, offset, len,
- xfered_len,
- &remote_protocol_packets[PACKET_qXfer_threads]);
- case TARGET_OBJECT_TRACEFRAME_INFO:
- gdb_assert (annex == NULL);
- return remote_read_qxfer
- (ops, "traceframe-info", annex, readbuf, offset, len, xfered_len,
- &remote_protocol_packets[PACKET_qXfer_traceframe_info]);
- case TARGET_OBJECT_FDPIC:
- return remote_read_qxfer (ops, "fdpic", annex, readbuf, offset, len,
- xfered_len,
- &remote_protocol_packets[PACKET_qXfer_fdpic]);
- case TARGET_OBJECT_OPENVMS_UIB:
- return remote_read_qxfer (ops, "uib", annex, readbuf, offset, len,
- xfered_len,
- &remote_protocol_packets[PACKET_qXfer_uib]);
- case TARGET_OBJECT_BTRACE:
- return remote_read_qxfer (ops, "btrace", annex, readbuf, offset, len,
- xfered_len,
- &remote_protocol_packets[PACKET_qXfer_btrace]);
- default:
- return TARGET_XFER_E_IO;
- }
-
- if (len < get_remote_packet_size ())
- return TARGET_XFER_E_IO;
- len = get_remote_packet_size ();
-
- if (!rs->remote_desc)
- error (_("remote query is only available after target open"));
- gdb_assert (annex != NULL);
- gdb_assert (readbuf != NULL);
- p2 = rs->buf;
- *p2++ = 'q';
- *p2++ = query_type;
-
- i = 0;
- while (annex[i] && (i < (get_remote_packet_size () - 8)))
- {
-
- gdb_assert (isprint (annex[i]) && annex[i] != '$' && annex[i] != '#');
- *p2++ = annex[i];
- i++;
- }
- *p2 = '\0';
- gdb_assert (annex[i] == '\0');
- i = putpkt (rs->buf);
- if (i < 0)
- return TARGET_XFER_E_IO;
- getpkt (&rs->buf, &rs->buf_size, 0);
- strcpy ((char *) readbuf, rs->buf);
- *xfered_len = strlen ((char *) readbuf);
- return TARGET_XFER_OK;
- }
- static int
- remote_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)
- {
- int addr_size = gdbarch_addr_bit (target_gdbarch ()) / 8;
- struct remote_state *rs = get_remote_state ();
- int max_size = get_memory_write_packet_size ();
- struct packet_config *packet =
- &remote_protocol_packets[PACKET_qSearch_memory];
-
- int escaped_pattern_len;
-
- int used_pattern_len;
- int i;
- int found;
- ULONGEST found_addr;
-
- if (pattern_len > search_space_len)
- return 0;
- if (pattern_len == 0)
- {
- *found_addrp = start_addr;
- return 1;
- }
-
- if (packet_config_support (packet) == PACKET_DISABLE)
- {
-
- return simple_search_memory (ops, start_addr, search_space_len,
- pattern, pattern_len, found_addrp);
- }
-
- set_general_process ();
-
- i = snprintf (rs->buf, max_size,
- "qSearch:memory:%s;%s;",
- phex_nz (start_addr, addr_size),
- phex_nz (search_space_len, sizeof (search_space_len)));
- max_size -= (i + 1);
-
- escaped_pattern_len =
- remote_escape_output (pattern, pattern_len, (gdb_byte *) rs->buf + i,
- &used_pattern_len, max_size);
-
- if (used_pattern_len != pattern_len)
- error (_("Pattern is too large to transmit to remote target."));
- if (putpkt_binary (rs->buf, i + escaped_pattern_len) < 0
- || getpkt_sane (&rs->buf, &rs->buf_size, 0) < 0
- || packet_ok (rs->buf, packet) != PACKET_OK)
- {
-
- if (packet->support == PACKET_DISABLE)
- {
- return simple_search_memory (ops, start_addr, search_space_len,
- pattern, pattern_len, found_addrp);
- }
- return -1;
- }
- if (rs->buf[0] == '0')
- found = 0;
- else if (rs->buf[0] == '1')
- {
- found = 1;
- if (rs->buf[1] != ',')
- error (_("Unknown qSearch:memory reply: %s"), rs->buf);
- unpack_varlen_hex (rs->buf + 2, &found_addr);
- *found_addrp = found_addr;
- }
- else
- error (_("Unknown qSearch:memory reply: %s"), rs->buf);
- return found;
- }
- static void
- remote_rcmd (struct target_ops *self, const char *command,
- struct ui_file *outbuf)
- {
- struct remote_state *rs = get_remote_state ();
- char *p = rs->buf;
- if (!rs->remote_desc)
- error (_("remote rcmd is only available after target open"));
-
- if (command == NULL)
- command = "";
-
- strcpy (rs->buf, "qRcmd,");
- p = strchr (rs->buf, '\0');
- if ((strlen (rs->buf) + strlen (command) * 2 + 8)
- > get_remote_packet_size ())
- error (_("\"monitor\" command ``%s'' is too long."), command);
-
- bin2hex ((const gdb_byte *) command, p, strlen (command));
- if (putpkt (rs->buf) < 0)
- error (_("Communication problem with target."));
-
- while (1)
- {
- char *buf;
- XXX
- QUIT;
- rs->buf[0] = '\0';
- if (getpkt_sane (&rs->buf, &rs->buf_size, 0) == -1)
- {
-
- continue;
- }
- buf = rs->buf;
- if (buf[0] == '\0')
- error (_("Target does not support this command."));
- if (buf[0] == 'O' && buf[1] != 'K')
- {
- remote_console_output (buf + 1);
- continue;
- }
- if (strcmp (buf, "OK") == 0)
- break;
- if (strlen (buf) == 3 && buf[0] == 'E'
- && isdigit (buf[1]) && isdigit (buf[2]))
- {
- error (_("Protocol error with Rcmd"));
- }
- for (p = buf; p[0] != '\0' && p[1] != '\0'; p += 2)
- {
- char c = (fromhex (p[0]) << 4) + fromhex (p[1]);
- fputc_unfiltered (c, outbuf);
- }
- break;
- }
- }
- static VEC(mem_region_s) *
- remote_memory_map (struct target_ops *ops)
- {
- VEC(mem_region_s) *result = NULL;
- char *text = target_read_stralloc (¤t_target,
- TARGET_OBJECT_MEMORY_MAP, NULL);
- if (text)
- {
- struct cleanup *back_to = make_cleanup (xfree, text);
- result = parse_memory_map (text);
- do_cleanups (back_to);
- }
- return result;
- }
- static void
- packet_command (char *args, int from_tty)
- {
- struct remote_state *rs = get_remote_state ();
- if (!rs->remote_desc)
- error (_("command can only be used with remote target"));
- if (!args)
- error (_("remote-packet command requires packet text as argument"));
- puts_filtered ("sending: ");
- print_packet (args);
- puts_filtered ("\n");
- putpkt (args);
- getpkt (&rs->buf, &rs->buf_size, 0);
- puts_filtered ("received: ");
- print_packet (rs->buf);
- puts_filtered ("\n");
- }
- #if 0
- #endif
- static char *
- remote_pid_to_str (struct target_ops *ops, ptid_t ptid)
- {
- static char buf[64];
- struct remote_state *rs = get_remote_state ();
- if (ptid_equal (ptid, null_ptid))
- return normal_pid_to_str (ptid);
- else if (ptid_is_pid (ptid))
- {
-
-
- if (!remote_multi_process_p (rs))
- {
- xsnprintf (buf, sizeof buf, "Remote target");
- return buf;
- }
- return normal_pid_to_str (ptid);
- }
- else
- {
- if (ptid_equal (magic_null_ptid, ptid))
- xsnprintf (buf, sizeof buf, "Thread <main>");
- else if (rs->extended && remote_multi_process_p (rs))
- xsnprintf (buf, sizeof buf, "Thread %d.%ld",
- ptid_get_pid (ptid), ptid_get_lwp (ptid));
- else
- xsnprintf (buf, sizeof buf, "Thread %ld",
- ptid_get_lwp (ptid));
- return buf;
- }
- }
- static CORE_ADDR
- remote_get_thread_local_address (struct target_ops *ops,
- ptid_t ptid, CORE_ADDR lm, CORE_ADDR offset)
- {
- if (packet_support (PACKET_qGetTLSAddr) != PACKET_DISABLE)
- {
- struct remote_state *rs = get_remote_state ();
- char *p = rs->buf;
- char *endp = rs->buf + get_remote_packet_size ();
- enum packet_result result;
- strcpy (p, "qGetTLSAddr:");
- p += strlen (p);
- p = write_ptid (p, endp, ptid);
- *p++ = ',';
- p += hexnumstr (p, offset);
- *p++ = ',';
- p += hexnumstr (p, lm);
- *p++ = '\0';
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
- result = packet_ok (rs->buf,
- &remote_protocol_packets[PACKET_qGetTLSAddr]);
- if (result == PACKET_OK)
- {
- ULONGEST result;
- unpack_varlen_hex (rs->buf, &result);
- return result;
- }
- else if (result == PACKET_UNKNOWN)
- throw_error (TLS_GENERIC_ERROR,
- _("Remote target doesn't support qGetTLSAddr packet"));
- else
- throw_error (TLS_GENERIC_ERROR,
- _("Remote target failed to process qGetTLSAddr request"));
- }
- else
- throw_error (TLS_GENERIC_ERROR,
- _("TLS not supported or disabled on this target"));
-
- return 0;
- }
- static int
- remote_get_tib_address (struct target_ops *self, ptid_t ptid, CORE_ADDR *addr)
- {
- if (packet_support (PACKET_qGetTIBAddr) != PACKET_DISABLE)
- {
- struct remote_state *rs = get_remote_state ();
- char *p = rs->buf;
- char *endp = rs->buf + get_remote_packet_size ();
- enum packet_result result;
- strcpy (p, "qGetTIBAddr:");
- p += strlen (p);
- p = write_ptid (p, endp, ptid);
- *p++ = '\0';
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
- result = packet_ok (rs->buf,
- &remote_protocol_packets[PACKET_qGetTIBAddr]);
- if (result == PACKET_OK)
- {
- ULONGEST result;
- unpack_varlen_hex (rs->buf, &result);
- if (addr)
- *addr = (CORE_ADDR) result;
- return 1;
- }
- else if (result == PACKET_UNKNOWN)
- error (_("Remote target doesn't support qGetTIBAddr packet"));
- else
- error (_("Remote target failed to process qGetTIBAddr request"));
- }
- else
- error (_("qGetTIBAddr not supported or disabled on this target"));
-
- return 0;
- }
- struct remote_g_packet_guess
- {
- int bytes;
- const struct target_desc *tdesc;
- };
- typedef struct remote_g_packet_guess remote_g_packet_guess_s;
- DEF_VEC_O(remote_g_packet_guess_s);
- struct remote_g_packet_data
- {
- VEC(remote_g_packet_guess_s) *guesses;
- };
- static struct gdbarch_data *remote_g_packet_data_handle;
- static void *
- remote_g_packet_data_init (struct obstack *obstack)
- {
- return OBSTACK_ZALLOC (obstack, struct remote_g_packet_data);
- }
- void
- register_remote_g_packet_guess (struct gdbarch *gdbarch, int bytes,
- const struct target_desc *tdesc)
- {
- struct remote_g_packet_data *data
- = gdbarch_data (gdbarch, remote_g_packet_data_handle);
- struct remote_g_packet_guess new_guess, *guess;
- int ix;
- gdb_assert (tdesc != NULL);
- for (ix = 0;
- VEC_iterate (remote_g_packet_guess_s, data->guesses, ix, guess);
- ix++)
- if (guess->bytes == bytes)
- internal_error (__FILE__, __LINE__,
- _("Duplicate g packet description added for size %d"),
- bytes);
- new_guess.bytes = bytes;
- new_guess.tdesc = tdesc;
- VEC_safe_push (remote_g_packet_guess_s, data->guesses, &new_guess);
- }
- static int
- remote_read_description_p (struct target_ops *target)
- {
- struct remote_g_packet_data *data
- = gdbarch_data (target_gdbarch (), remote_g_packet_data_handle);
- if (!VEC_empty (remote_g_packet_guess_s, data->guesses))
- return 1;
- return 0;
- }
- static const struct target_desc *
- remote_read_description (struct target_ops *target)
- {
- struct remote_g_packet_data *data
- = gdbarch_data (target_gdbarch (), remote_g_packet_data_handle);
-
- if (!target_has_execution || ptid_equal (inferior_ptid, null_ptid))
- return target->beneath->to_read_description (target->beneath);
- if (!VEC_empty (remote_g_packet_guess_s, data->guesses))
- {
- struct remote_g_packet_guess *guess;
- int ix;
- int bytes = send_g_packet ();
- for (ix = 0;
- VEC_iterate (remote_g_packet_guess_s, data->guesses, ix, guess);
- ix++)
- if (guess->bytes == bytes)
- return guess->tdesc;
-
- }
- return target->beneath->to_read_description (target->beneath);
- }
- static void
- remote_buffer_add_string (char **buffer, int *left, char *string)
- {
- int len = strlen (string);
- if (len > *left)
- error (_("Packet too long for target."));
- memcpy (*buffer, string, len);
- *buffer += len;
- *left -= len;
-
- if (*left)
- **buffer = '\0';
- }
- static void
- remote_buffer_add_bytes (char **buffer, int *left, const gdb_byte *bytes,
- int len)
- {
- if (2 * len > *left)
- error (_("Packet too long for target."));
- bin2hex (bytes, *buffer, len);
- *buffer += 2 * len;
- *left -= 2 * len;
-
- if (*left)
- **buffer = '\0';
- }
- static void
- remote_buffer_add_int (char **buffer, int *left, ULONGEST value)
- {
- int len = hexnumlen (value);
- if (len > *left)
- error (_("Packet too long for target."));
- hexnumstr (*buffer, value);
- *buffer += len;
- *left -= len;
-
- if (*left)
- **buffer = '\0';
- }
- static int
- remote_hostio_parse_result (char *buffer, int *retcode,
- int *remote_errno, char **attachment)
- {
- char *p, *p2;
- *remote_errno = 0;
- *attachment = NULL;
- if (buffer[0] != 'F')
- return -1;
- errno = 0;
- *retcode = strtol (&buffer[1], &p, 16);
- if (errno != 0 || p == &buffer[1])
- return -1;
-
- if (*p == ',')
- {
- errno = 0;
- *remote_errno = strtol (p + 1, &p2, 16);
- if (errno != 0 || p + 1 == p2)
- return -1;
- p = p2;
- }
-
- if (*p == ';')
- {
- *attachment = p + 1;
- return 0;
- }
- else if (*p == '\0')
- return 0;
- else
- return -1;
- }
- static int
- remote_hostio_send_command (int command_bytes, int which_packet,
- int *remote_errno, char **attachment,
- int *attachment_len)
- {
- struct remote_state *rs = get_remote_state ();
- int ret, bytes_read;
- char *attachment_tmp;
- if (!rs->remote_desc
- || packet_support (which_packet) == PACKET_DISABLE)
- {
- *remote_errno = FILEIO_ENOSYS;
- return -1;
- }
- putpkt_binary (rs->buf, command_bytes);
- bytes_read = getpkt_sane (&rs->buf, &rs->buf_size, 0);
-
- if (bytes_read < 0)
- {
- *remote_errno = FILEIO_EINVAL;
- return -1;
- }
- switch (packet_ok (rs->buf, &remote_protocol_packets[which_packet]))
- {
- case PACKET_ERROR:
- *remote_errno = FILEIO_EINVAL;
- return -1;
- case PACKET_UNKNOWN:
- *remote_errno = FILEIO_ENOSYS;
- return -1;
- case PACKET_OK:
- break;
- }
- if (remote_hostio_parse_result (rs->buf, &ret, remote_errno,
- &attachment_tmp))
- {
- *remote_errno = FILEIO_EINVAL;
- return -1;
- }
-
- if ((attachment_tmp == NULL && attachment != NULL)
- || (attachment_tmp != NULL && attachment == NULL))
- {
- *remote_errno = FILEIO_EINVAL;
- return -1;
- }
-
- if (attachment_tmp != NULL)
- {
- *attachment = attachment_tmp;
- *attachment_len = bytes_read - (*attachment - rs->buf);
- }
- return ret;
- }
- static int
- remote_hostio_open (struct target_ops *self,
- const char *filename, int flags, int mode,
- int *remote_errno)
- {
- struct remote_state *rs = get_remote_state ();
- char *p = rs->buf;
- int left = get_remote_packet_size () - 1;
- remote_buffer_add_string (&p, &left, "vFile:open:");
- remote_buffer_add_bytes (&p, &left, (const gdb_byte *) filename,
- strlen (filename));
- remote_buffer_add_string (&p, &left, ",");
- remote_buffer_add_int (&p, &left, flags);
- remote_buffer_add_string (&p, &left, ",");
- remote_buffer_add_int (&p, &left, mode);
- return remote_hostio_send_command (p - rs->buf, PACKET_vFile_open,
- remote_errno, NULL, NULL);
- }
- static int
- remote_hostio_pwrite (struct target_ops *self,
- int fd, const gdb_byte *write_buf, int len,
- ULONGEST offset, int *remote_errno)
- {
- struct remote_state *rs = get_remote_state ();
- char *p = rs->buf;
- int left = get_remote_packet_size ();
- int out_len;
- remote_buffer_add_string (&p, &left, "vFile:pwrite:");
- remote_buffer_add_int (&p, &left, fd);
- remote_buffer_add_string (&p, &left, ",");
- remote_buffer_add_int (&p, &left, offset);
- remote_buffer_add_string (&p, &left, ",");
- p += remote_escape_output (write_buf, len, (gdb_byte *) p, &out_len,
- get_remote_packet_size () - (p - rs->buf));
- return remote_hostio_send_command (p - rs->buf, PACKET_vFile_pwrite,
- remote_errno, NULL, NULL);
- }
- static int
- remote_hostio_pread (struct target_ops *self,
- int fd, gdb_byte *read_buf, int len,
- ULONGEST offset, int *remote_errno)
- {
- struct remote_state *rs = get_remote_state ();
- char *p = rs->buf;
- char *attachment;
- int left = get_remote_packet_size ();
- int ret, attachment_len;
- int read_len;
- remote_buffer_add_string (&p, &left, "vFile:pread:");
- remote_buffer_add_int (&p, &left, fd);
- remote_buffer_add_string (&p, &left, ",");
- remote_buffer_add_int (&p, &left, len);
- remote_buffer_add_string (&p, &left, ",");
- remote_buffer_add_int (&p, &left, offset);
- ret = remote_hostio_send_command (p - rs->buf, PACKET_vFile_pread,
- remote_errno, &attachment,
- &attachment_len);
- if (ret < 0)
- return ret;
- read_len = remote_unescape_input ((gdb_byte *) attachment, attachment_len,
- read_buf, len);
- if (read_len != ret)
- error (_("Read returned %d, but %d bytes."), ret, (int) read_len);
- return ret;
- }
- static int
- remote_hostio_close (struct target_ops *self, int fd, int *remote_errno)
- {
- struct remote_state *rs = get_remote_state ();
- char *p = rs->buf;
- int left = get_remote_packet_size () - 1;
- remote_buffer_add_string (&p, &left, "vFile:close:");
- remote_buffer_add_int (&p, &left, fd);
- return remote_hostio_send_command (p - rs->buf, PACKET_vFile_close,
- remote_errno, NULL, NULL);
- }
- static int
- remote_hostio_unlink (struct target_ops *self,
- const char *filename, int *remote_errno)
- {
- struct remote_state *rs = get_remote_state ();
- char *p = rs->buf;
- int left = get_remote_packet_size () - 1;
- remote_buffer_add_string (&p, &left, "vFile:unlink:");
- remote_buffer_add_bytes (&p, &left, (const gdb_byte *) filename,
- strlen (filename));
- return remote_hostio_send_command (p - rs->buf, PACKET_vFile_unlink,
- remote_errno, NULL, NULL);
- }
- static char *
- remote_hostio_readlink (struct target_ops *self,
- const char *filename, int *remote_errno)
- {
- struct remote_state *rs = get_remote_state ();
- char *p = rs->buf;
- char *attachment;
- int left = get_remote_packet_size ();
- int len, attachment_len;
- int read_len;
- char *ret;
- remote_buffer_add_string (&p, &left, "vFile:readlink:");
- remote_buffer_add_bytes (&p, &left, (const gdb_byte *) filename,
- strlen (filename));
- len = remote_hostio_send_command (p - rs->buf, PACKET_vFile_readlink,
- remote_errno, &attachment,
- &attachment_len);
- if (len < 0)
- return NULL;
- ret = xmalloc (len + 1);
- read_len = remote_unescape_input ((gdb_byte *) attachment, attachment_len,
- (gdb_byte *) ret, len);
- if (read_len != len)
- error (_("Readlink returned %d, but %d bytes."), len, read_len);
- ret[len] = '\0';
- return ret;
- }
- static int
- remote_fileio_errno_to_host (int errnum)
- {
- switch (errnum)
- {
- case FILEIO_EPERM:
- return EPERM;
- case FILEIO_ENOENT:
- return ENOENT;
- case FILEIO_EINTR:
- return EINTR;
- case FILEIO_EIO:
- return EIO;
- case FILEIO_EBADF:
- return EBADF;
- case FILEIO_EACCES:
- return EACCES;
- case FILEIO_EFAULT:
- return EFAULT;
- case FILEIO_EBUSY:
- return EBUSY;
- case FILEIO_EEXIST:
- return EEXIST;
- case FILEIO_ENODEV:
- return ENODEV;
- case FILEIO_ENOTDIR:
- return ENOTDIR;
- case FILEIO_EISDIR:
- return EISDIR;
- case FILEIO_EINVAL:
- return EINVAL;
- case FILEIO_ENFILE:
- return ENFILE;
- case FILEIO_EMFILE:
- return EMFILE;
- case FILEIO_EFBIG:
- return EFBIG;
- case FILEIO_ENOSPC:
- return ENOSPC;
- case FILEIO_ESPIPE:
- return ESPIPE;
- case FILEIO_EROFS:
- return EROFS;
- case FILEIO_ENOSYS:
- return ENOSYS;
- case FILEIO_ENAMETOOLONG:
- return ENAMETOOLONG;
- }
- return -1;
- }
- static char *
- remote_hostio_error (int errnum)
- {
- int host_error = remote_fileio_errno_to_host (errnum);
- if (host_error == -1)
- error (_("Unknown remote I/O error %d"), errnum);
- else
- error (_("Remote I/O error: %s"), safe_strerror (host_error));
- }
- static void
- remote_hostio_close_cleanup (void *opaque)
- {
- int fd = *(int *) opaque;
- int remote_errno;
- remote_hostio_close (find_target_at (process_stratum), fd, &remote_errno);
- }
- static void *
- remote_bfd_iovec_open (struct bfd *abfd, void *open_closure)
- {
- const char *filename = bfd_get_filename (abfd);
- int fd, remote_errno;
- int *stream;
- gdb_assert (remote_filename_p (filename));
- fd = remote_hostio_open (find_target_at (process_stratum),
- filename + 7, FILEIO_O_RDONLY, 0, &remote_errno);
- if (fd == -1)
- {
- errno = remote_fileio_errno_to_host (remote_errno);
- bfd_set_error (bfd_error_system_call);
- return NULL;
- }
- stream = xmalloc (sizeof (int));
- *stream = fd;
- return stream;
- }
- static int
- remote_bfd_iovec_close (struct bfd *abfd, void *stream)
- {
- int fd = *(int *)stream;
- int remote_errno;
- xfree (stream);
-
- remote_hostio_close (find_target_at (process_stratum), fd, &remote_errno);
-
- return 0;
- }
- static file_ptr
- remote_bfd_iovec_pread (struct bfd *abfd, void *stream, void *buf,
- file_ptr nbytes, file_ptr offset)
- {
- int fd = *(int *)stream;
- int remote_errno;
- file_ptr pos, bytes;
- pos = 0;
- while (nbytes > pos)
- {
- bytes = remote_hostio_pread (find_target_at (process_stratum),
- fd, (gdb_byte *) buf + pos, nbytes - pos,
- offset + pos, &remote_errno);
- if (bytes == 0)
-
- break;
- if (bytes == -1)
- {
- errno = remote_fileio_errno_to_host (remote_errno);
- bfd_set_error (bfd_error_system_call);
- return -1;
- }
- pos += bytes;
- }
- return pos;
- }
- static int
- remote_bfd_iovec_stat (struct bfd *abfd, void *stream, struct stat *sb)
- {
- FIXME
- sb->st_size = INT_MAX;
- return 0;
- }
- int
- remote_filename_p (const char *filename)
- {
- return strncmp (filename,
- REMOTE_SYSROOT_PREFIX,
- sizeof (REMOTE_SYSROOT_PREFIX) - 1) == 0;
- }
- bfd *
- remote_bfd_open (const char *remote_file, const char *target)
- {
- bfd *abfd = gdb_bfd_openr_iovec (remote_file, target,
- remote_bfd_iovec_open, NULL,
- remote_bfd_iovec_pread,
- remote_bfd_iovec_close,
- remote_bfd_iovec_stat);
- return abfd;
- }
- void
- remote_file_put (const char *local_file, const char *remote_file, int from_tty)
- {
- struct cleanup *back_to, *close_cleanup;
- int retcode, fd, remote_errno, bytes, io_size;
- FILE *file;
- gdb_byte *buffer;
- int bytes_in_buffer;
- int saw_eof;
- ULONGEST offset;
- struct remote_state *rs = get_remote_state ();
- if (!rs->remote_desc)
- error (_("command can only be used with remote target"));
- file = gdb_fopen_cloexec (local_file, "rb");
- if (file == NULL)
- perror_with_name (local_file);
- back_to = make_cleanup_fclose (file);
- fd = remote_hostio_open (find_target_at (process_stratum),
- remote_file, (FILEIO_O_WRONLY | FILEIO_O_CREAT
- | FILEIO_O_TRUNC),
- 0700, &remote_errno);
- if (fd == -1)
- remote_hostio_error (remote_errno);
-
- io_size = get_remote_packet_size ();
- buffer = xmalloc (io_size);
- make_cleanup (xfree, buffer);
- close_cleanup = make_cleanup (remote_hostio_close_cleanup, &fd);
- bytes_in_buffer = 0;
- saw_eof = 0;
- offset = 0;
- while (bytes_in_buffer || !saw_eof)
- {
- if (!saw_eof)
- {
- bytes = fread (buffer + bytes_in_buffer, 1,
- io_size - bytes_in_buffer,
- file);
- if (bytes == 0)
- {
- if (ferror (file))
- error (_("Error reading %s."), local_file);
- else
- {
-
- saw_eof = 1;
- if (bytes_in_buffer == 0)
- break;
- }
- }
- }
- else
- bytes = 0;
- bytes += bytes_in_buffer;
- bytes_in_buffer = 0;
- retcode = remote_hostio_pwrite (find_target_at (process_stratum),
- fd, buffer, bytes,
- offset, &remote_errno);
- if (retcode < 0)
- remote_hostio_error (remote_errno);
- else if (retcode == 0)
- error (_("Remote write of %d bytes returned 0!"), bytes);
- else if (retcode < bytes)
- {
-
- bytes_in_buffer = bytes - retcode;
- memmove (buffer, buffer + retcode, bytes_in_buffer);
- }
- offset += retcode;
- }
- discard_cleanups (close_cleanup);
- if (remote_hostio_close (find_target_at (process_stratum), fd, &remote_errno))
- remote_hostio_error (remote_errno);
- if (from_tty)
- printf_filtered (_("Successfully sent file \"%s\".\n"), local_file);
- do_cleanups (back_to);
- }
- void
- remote_file_get (const char *remote_file, const char *local_file, int from_tty)
- {
- struct cleanup *back_to, *close_cleanup;
- int fd, remote_errno, bytes, io_size;
- FILE *file;
- gdb_byte *buffer;
- ULONGEST offset;
- struct remote_state *rs = get_remote_state ();
- if (!rs->remote_desc)
- error (_("command can only be used with remote target"));
- fd = remote_hostio_open (find_target_at (process_stratum),
- remote_file, FILEIO_O_RDONLY, 0, &remote_errno);
- if (fd == -1)
- remote_hostio_error (remote_errno);
- file = gdb_fopen_cloexec (local_file, "wb");
- if (file == NULL)
- perror_with_name (local_file);
- back_to = make_cleanup_fclose (file);
-
- io_size = get_remote_packet_size ();
- buffer = xmalloc (io_size);
- make_cleanup (xfree, buffer);
- close_cleanup = make_cleanup (remote_hostio_close_cleanup, &fd);
- offset = 0;
- while (1)
- {
- bytes = remote_hostio_pread (find_target_at (process_stratum),
- fd, buffer, io_size, offset, &remote_errno);
- if (bytes == 0)
-
- break;
- if (bytes == -1)
- remote_hostio_error (remote_errno);
- offset += bytes;
- bytes = fwrite (buffer, 1, bytes, file);
- if (bytes == 0)
- perror_with_name (local_file);
- }
- discard_cleanups (close_cleanup);
- if (remote_hostio_close (find_target_at (process_stratum), fd, &remote_errno))
- remote_hostio_error (remote_errno);
- if (from_tty)
- printf_filtered (_("Successfully fetched file \"%s\".\n"), remote_file);
- do_cleanups (back_to);
- }
- void
- remote_file_delete (const char *remote_file, int from_tty)
- {
- int retcode, remote_errno;
- struct remote_state *rs = get_remote_state ();
- if (!rs->remote_desc)
- error (_("command can only be used with remote target"));
- retcode = remote_hostio_unlink (find_target_at (process_stratum),
- remote_file, &remote_errno);
- if (retcode == -1)
- remote_hostio_error (remote_errno);
- if (from_tty)
- printf_filtered (_("Successfully deleted file \"%s\".\n"), remote_file);
- }
- static void
- remote_put_command (char *args, int from_tty)
- {
- struct cleanup *back_to;
- char **argv;
- if (args == NULL)
- error_no_arg (_("file to put"));
- argv = gdb_buildargv (args);
- back_to = make_cleanup_freeargv (argv);
- if (argv[0] == NULL || argv[1] == NULL || argv[2] != NULL)
- error (_("Invalid parameters to remote put"));
- remote_file_put (argv[0], argv[1], from_tty);
- do_cleanups (back_to);
- }
- static void
- remote_get_command (char *args, int from_tty)
- {
- struct cleanup *back_to;
- char **argv;
- if (args == NULL)
- error_no_arg (_("file to get"));
- argv = gdb_buildargv (args);
- back_to = make_cleanup_freeargv (argv);
- if (argv[0] == NULL || argv[1] == NULL || argv[2] != NULL)
- error (_("Invalid parameters to remote get"));
- remote_file_get (argv[0], argv[1], from_tty);
- do_cleanups (back_to);
- }
- static void
- remote_delete_command (char *args, int from_tty)
- {
- struct cleanup *back_to;
- char **argv;
- if (args == NULL)
- error_no_arg (_("file to delete"));
- argv = gdb_buildargv (args);
- back_to = make_cleanup_freeargv (argv);
- if (argv[0] == NULL || argv[1] != NULL)
- error (_("Invalid parameters to remote delete"));
- remote_file_delete (argv[0], from_tty);
- do_cleanups (back_to);
- }
- static void
- remote_command (char *args, int from_tty)
- {
- help_list (remote_cmdlist, "remote ", all_commands, gdb_stdout);
- }
- static int
- remote_can_execute_reverse (struct target_ops *self)
- {
- if (packet_support (PACKET_bs) == PACKET_ENABLE
- || packet_support (PACKET_bc) == PACKET_ENABLE)
- return 1;
- else
- return 0;
- }
- static int
- remote_supports_non_stop (struct target_ops *self)
- {
- return 1;
- }
- static int
- remote_supports_disable_randomization (struct target_ops *self)
- {
-
- return 0;
- }
- static int
- remote_supports_multi_process (struct target_ops *self)
- {
- struct remote_state *rs = get_remote_state ();
-
- return rs->extended && remote_multi_process_p (rs);
- }
- static int
- remote_supports_cond_tracepoints (void)
- {
- return packet_support (PACKET_ConditionalTracepoints) == PACKET_ENABLE;
- }
- static int
- remote_supports_cond_breakpoints (struct target_ops *self)
- {
- return packet_support (PACKET_ConditionalBreakpoints) == PACKET_ENABLE;
- }
- static int
- remote_supports_fast_tracepoints (void)
- {
- return packet_support (PACKET_FastTracepoints) == PACKET_ENABLE;
- }
- static int
- remote_supports_static_tracepoints (void)
- {
- return packet_support (PACKET_StaticTracepoints) == PACKET_ENABLE;
- }
- static int
- remote_supports_install_in_trace (void)
- {
- return packet_support (PACKET_InstallInTrace) == PACKET_ENABLE;
- }
- static int
- remote_supports_enable_disable_tracepoint (struct target_ops *self)
- {
- return (packet_support (PACKET_EnableDisableTracepoints_feature)
- == PACKET_ENABLE);
- }
- static int
- remote_supports_string_tracing (struct target_ops *self)
- {
- return packet_support (PACKET_tracenz_feature) == PACKET_ENABLE;
- }
- static int
- remote_can_run_breakpoint_commands (struct target_ops *self)
- {
- return packet_support (PACKET_BreakpointCommands) == PACKET_ENABLE;
- }
- static void
- remote_trace_init (struct target_ops *self)
- {
- putpkt ("QTinit");
- remote_get_noisy_reply (&target_buf, &target_buf_size);
- if (strcmp (target_buf, "OK") != 0)
- error (_("Target does not support this command."));
- }
- static void free_actions_list (char **actions_list);
- static void free_actions_list_cleanup_wrapper (void *);
- static void
- free_actions_list_cleanup_wrapper (void *al)
- {
- free_actions_list (al);
- }
- static void
- free_actions_list (char **actions_list)
- {
- int ndx;
- if (actions_list == 0)
- return;
- for (ndx = 0; actions_list[ndx]; ndx++)
- xfree (actions_list[ndx]);
- xfree (actions_list);
- }
- static void
- remote_download_command_source (int num, ULONGEST addr,
- struct command_line *cmds)
- {
- struct remote_state *rs = get_remote_state ();
- struct command_line *cmd;
- for (cmd = cmds; cmd; cmd = cmd->next)
- {
- QUIT;
- strcpy (rs->buf, "QTDPsrc:");
- encode_source_string (num, addr, "cmd", cmd->line,
- rs->buf + strlen (rs->buf),
- rs->buf_size - strlen (rs->buf));
- putpkt (rs->buf);
- remote_get_noisy_reply (&target_buf, &target_buf_size);
- if (strcmp (target_buf, "OK"))
- warning (_("Target does not support source download."));
- if (cmd->control_type == while_control
- || cmd->control_type == while_stepping_control)
- {
- remote_download_command_source (num, addr, *cmd->body_list);
- QUIT;
- strcpy (rs->buf, "QTDPsrc:");
- encode_source_string (num, addr, "cmd", "end",
- rs->buf + strlen (rs->buf),
- rs->buf_size - strlen (rs->buf));
- putpkt (rs->buf);
- remote_get_noisy_reply (&target_buf, &target_buf_size);
- if (strcmp (target_buf, "OK"))
- warning (_("Target does not support source download."));
- }
- }
- }
- static void
- remote_download_tracepoint (struct target_ops *self, struct bp_location *loc)
- {
- #define BUF_SIZE 2048
- CORE_ADDR tpaddr;
- char addrbuf[40];
- char buf[BUF_SIZE];
- char **tdp_actions;
- char **stepping_actions;
- int ndx;
- struct cleanup *old_chain = NULL;
- struct agent_expr *aexpr;
- struct cleanup *aexpr_chain = NULL;
- char *pkt;
- struct breakpoint *b = loc->owner;
- struct tracepoint *t = (struct tracepoint *) b;
- encode_actions_rsp (loc, &tdp_actions, &stepping_actions);
- old_chain = make_cleanup (free_actions_list_cleanup_wrapper,
- tdp_actions);
- (void) make_cleanup (free_actions_list_cleanup_wrapper,
- stepping_actions);
- tpaddr = loc->address;
- sprintf_vma (addrbuf, tpaddr);
- xsnprintf (buf, BUF_SIZE, "QTDP:%x:%s:%c:%lx:%x", b->number,
- addrbuf,
- (b->enable_state == bp_enabled ? 'E' : 'D'),
- t->step_count, t->pass_count);
-
- if (b->type == bp_fast_tracepoint)
- {
-
- if (remote_supports_fast_tracepoints ())
- {
- int isize;
- if (gdbarch_fast_tracepoint_valid_at (target_gdbarch (),
- tpaddr, &isize, NULL))
- xsnprintf (buf + strlen (buf), BUF_SIZE - strlen (buf), ":F%x",
- isize);
- else
-
- internal_error (__FILE__, __LINE__,
- _("Fast tracepoint not "
- "valid during download"));
- }
- else
-
- warning (_("Target does not support fast tracepoints, "
- "downloading %d as regular tracepoint"), b->number);
- }
- else if (b->type == bp_static_tracepoint)
- {
-
- if (remote_supports_static_tracepoints ())
- {
- struct static_tracepoint_marker marker;
- if (target_static_tracepoint_marker_at (tpaddr, &marker))
- strcat (buf, ":S");
- else
- error (_("Static tracepoint not valid during download"));
- }
- else
-
- error (_("Target does not support static tracepoints"));
- }
-
- if (loc->cond)
- {
-
- if (remote_supports_cond_tracepoints ())
- {
- aexpr = gen_eval_for_expr (tpaddr, loc->cond);
- aexpr_chain = make_cleanup_free_agent_expr (aexpr);
- xsnprintf (buf + strlen (buf), BUF_SIZE - strlen (buf), ":X%x,",
- aexpr->len);
- pkt = buf + strlen (buf);
- for (ndx = 0; ndx < aexpr->len; ++ndx)
- pkt = pack_hex_byte (pkt, aexpr->buf[ndx]);
- *pkt = '\0';
- do_cleanups (aexpr_chain);
- }
- else
- warning (_("Target does not support conditional tracepoints, "
- "ignoring tp %d cond"), b->number);
- }
- if (b->commands || *default_collect)
- strcat (buf, "-");
- putpkt (buf);
- remote_get_noisy_reply (&target_buf, &target_buf_size);
- if (strcmp (target_buf, "OK"))
- error (_("Target does not support tracepoints."));
-
- if (tdp_actions)
- {
- for (ndx = 0; tdp_actions[ndx]; ndx++)
- {
- QUIT;
- xsnprintf (buf, BUF_SIZE, "QTDP:-%x:%s:%s%c",
- b->number, addrbuf,
- tdp_actions[ndx],
- ((tdp_actions[ndx + 1] || stepping_actions)
- ? '-' : 0));
- putpkt (buf);
- remote_get_noisy_reply (&target_buf,
- &target_buf_size);
- if (strcmp (target_buf, "OK"))
- error (_("Error on target while setting tracepoints."));
- }
- }
- if (stepping_actions)
- {
- for (ndx = 0; stepping_actions[ndx]; ndx++)
- {
- QUIT;
- xsnprintf (buf, BUF_SIZE, "QTDP:-%x:%s:%s%s%s",
- b->number, addrbuf,
- ((ndx == 0) ? "S" : ""),
- stepping_actions[ndx],
- (stepping_actions[ndx + 1] ? "-" : ""));
- putpkt (buf);
- remote_get_noisy_reply (&target_buf,
- &target_buf_size);
- if (strcmp (target_buf, "OK"))
- error (_("Error on target while setting tracepoints."));
- }
- }
- if (packet_support (PACKET_TracepointSource) == PACKET_ENABLE)
- {
- if (b->addr_string)
- {
- strcpy (buf, "QTDPsrc:");
- encode_source_string (b->number, loc->address,
- "at", b->addr_string, buf + strlen (buf),
- 2048 - strlen (buf));
- putpkt (buf);
- remote_get_noisy_reply (&target_buf, &target_buf_size);
- if (strcmp (target_buf, "OK"))
- warning (_("Target does not support source download."));
- }
- if (b->cond_string)
- {
- strcpy (buf, "QTDPsrc:");
- encode_source_string (b->number, loc->address,
- "cond", b->cond_string, buf + strlen (buf),
- 2048 - strlen (buf));
- putpkt (buf);
- remote_get_noisy_reply (&target_buf, &target_buf_size);
- if (strcmp (target_buf, "OK"))
- warning (_("Target does not support source download."));
- }
- remote_download_command_source (b->number, loc->address,
- breakpoint_commands (b));
- }
- do_cleanups (old_chain);
- }
- static int
- remote_can_download_tracepoint (struct target_ops *self)
- {
- struct remote_state *rs = get_remote_state ();
- struct trace_status *ts;
- int status;
-
- if (rs->starting_up)
- return 0;
- ts = current_trace_status ();
- status = remote_get_trace_status (self, ts);
- if (status == -1 || !ts->running_known || !ts->running)
- return 0;
-
- if (!remote_supports_install_in_trace ())
- return 0;
- return 1;
- }
- static void
- remote_download_trace_state_variable (struct target_ops *self,
- struct trace_state_variable *tsv)
- {
- struct remote_state *rs = get_remote_state ();
- char *p;
- xsnprintf (rs->buf, get_remote_packet_size (), "QTDV:%x:%s:%x:",
- tsv->number, phex ((ULONGEST) tsv->initial_value, 8),
- tsv->builtin);
- p = rs->buf + strlen (rs->buf);
- if ((p - rs->buf) + strlen (tsv->name) * 2 >= get_remote_packet_size ())
- error (_("Trace state variable name too long for tsv definition packet"));
- p += 2 * bin2hex ((gdb_byte *) (tsv->name), p, strlen (tsv->name));
- *p++ = '\0';
- putpkt (rs->buf);
- remote_get_noisy_reply (&target_buf, &target_buf_size);
- if (*target_buf == '\0')
- error (_("Target does not support this command."));
- if (strcmp (target_buf, "OK") != 0)
- error (_("Error on target while downloading trace state variable."));
- }
- static void
- remote_enable_tracepoint (struct target_ops *self,
- struct bp_location *location)
- {
- struct remote_state *rs = get_remote_state ();
- char addr_buf[40];
- sprintf_vma (addr_buf, location->address);
- xsnprintf (rs->buf, get_remote_packet_size (), "QTEnable:%x:%s",
- location->owner->number, addr_buf);
- putpkt (rs->buf);
- remote_get_noisy_reply (&rs->buf, &rs->buf_size);
- if (*rs->buf == '\0')
- error (_("Target does not support enabling tracepoints while a trace run is ongoing."));
- if (strcmp (rs->buf, "OK") != 0)
- error (_("Error on target while enabling tracepoint."));
- }
- static void
- remote_disable_tracepoint (struct target_ops *self,
- struct bp_location *location)
- {
- struct remote_state *rs = get_remote_state ();
- char addr_buf[40];
- sprintf_vma (addr_buf, location->address);
- xsnprintf (rs->buf, get_remote_packet_size (), "QTDisable:%x:%s",
- location->owner->number, addr_buf);
- putpkt (rs->buf);
- remote_get_noisy_reply (&rs->buf, &rs->buf_size);
- if (*rs->buf == '\0')
- error (_("Target does not support disabling tracepoints while a trace run is ongoing."));
- if (strcmp (rs->buf, "OK") != 0)
- error (_("Error on target while disabling tracepoint."));
- }
- static void
- remote_trace_set_readonly_regions (struct target_ops *self)
- {
- asection *s;
- bfd *abfd = NULL;
- bfd_size_type size;
- bfd_vma vma;
- int anysecs = 0;
- int offset = 0;
- if (!exec_bfd)
- return;
- strcpy (target_buf, "QTro");
- offset = strlen (target_buf);
- for (s = exec_bfd->sections; s; s = s->next)
- {
- char tmp1[40], tmp2[40];
- int sec_length;
- if ((s->flags & SEC_LOAD) == 0 ||
-
- (s->flags & SEC_READONLY) == 0)
- continue;
- anysecs = 1;
- vma = bfd_get_section_vma (abfd, s);
- size = bfd_get_section_size (s);
- sprintf_vma (tmp1, vma);
- sprintf_vma (tmp2, vma + size);
- sec_length = 1 + strlen (tmp1) + 1 + strlen (tmp2);
- if (offset + sec_length + 1 > target_buf_size)
- {
- if (packet_support (PACKET_qXfer_traceframe_info) != PACKET_ENABLE)
- warning (_("\
- Too many sections for read-only sections definition packet."));
- break;
- }
- xsnprintf (target_buf + offset, target_buf_size - offset, ":%s,%s",
- tmp1, tmp2);
- offset += sec_length;
- }
- if (anysecs)
- {
- putpkt (target_buf);
- getpkt (&target_buf, &target_buf_size, 0);
- }
- }
- static void
- remote_trace_start (struct target_ops *self)
- {
- putpkt ("QTStart");
- remote_get_noisy_reply (&target_buf, &target_buf_size);
- if (*target_buf == '\0')
- error (_("Target does not support this command."));
- if (strcmp (target_buf, "OK") != 0)
- error (_("Bogus reply from target: %s"), target_buf);
- }
- static int
- remote_get_trace_status (struct target_ops *self, struct trace_status *ts)
- {
-
- char *p = NULL;
- FIXME
- extern int trace_regblock_size;
- volatile struct gdb_exception ex;
- enum packet_result result;
- if (packet_support (PACKET_qTStatus) == PACKET_DISABLE)
- return -1;
- trace_regblock_size = get_remote_arch_state ()->sizeof_g_packet;
- putpkt ("qTStatus");
- TRY_CATCH (ex, RETURN_MASK_ERROR)
- {
- p = remote_get_noisy_reply (&target_buf, &target_buf_size);
- }
- if (ex.reason < 0)
- {
- if (ex.error != TARGET_CLOSE_ERROR)
- {
- exception_fprintf (gdb_stderr, ex, "qTStatus: ");
- return -1;
- }
- throw_exception (ex);
- }
- result = packet_ok (p, &remote_protocol_packets[PACKET_qTStatus]);
-
- if (result == PACKET_UNKNOWN)
- return -1;
-
- ts->filename = NULL;
- if (*p++ != 'T')
- error (_("Bogus trace status reply from target: %s"), target_buf);
-
- parse_trace_status (p, ts);
- return ts->running;
- }
- static void
- remote_get_tracepoint_status (struct target_ops *self, struct breakpoint *bp,
- struct uploaded_tp *utp)
- {
- struct remote_state *rs = get_remote_state ();
- char *reply;
- struct bp_location *loc;
- struct tracepoint *tp = (struct tracepoint *) bp;
- size_t size = get_remote_packet_size ();
- if (tp)
- {
- tp->base.hit_count = 0;
- tp->traceframe_usage = 0;
- for (loc = tp->base.loc; loc; loc = loc->next)
- {
-
- if (tp->number_on_target == 0)
- continue;
- xsnprintf (rs->buf, size, "qTP:%x:%s", tp->number_on_target,
- phex_nz (loc->address, 0));
- putpkt (rs->buf);
- reply = remote_get_noisy_reply (&target_buf, &target_buf_size);
- if (reply && *reply)
- {
- if (*reply == 'V')
- parse_tracepoint_status (reply + 1, bp, utp);
- }
- }
- }
- else if (utp)
- {
- utp->hit_count = 0;
- utp->traceframe_usage = 0;
- xsnprintf (rs->buf, size, "qTP:%x:%s", utp->number,
- phex_nz (utp->addr, 0));
- putpkt (rs->buf);
- reply = remote_get_noisy_reply (&target_buf, &target_buf_size);
- if (reply && *reply)
- {
- if (*reply == 'V')
- parse_tracepoint_status (reply + 1, bp, utp);
- }
- }
- }
- static void
- remote_trace_stop (struct target_ops *self)
- {
- putpkt ("QTStop");
- remote_get_noisy_reply (&target_buf, &target_buf_size);
- if (*target_buf == '\0')
- error (_("Target does not support this command."));
- if (strcmp (target_buf, "OK") != 0)
- error (_("Bogus reply from target: %s"), target_buf);
- }
- static int
- remote_trace_find (struct target_ops *self,
- enum trace_find_type type, int num,
- CORE_ADDR addr1, CORE_ADDR addr2,
- int *tpp)
- {
- struct remote_state *rs = get_remote_state ();
- char *endbuf = rs->buf + get_remote_packet_size ();
- char *p, *reply;
- int target_frameno = -1, target_tracept = -1;
-
- if (type != tfind_number)
- set_remote_traceframe ();
- p = rs->buf;
- strcpy (p, "QTFrame:");
- p = strchr (p, '\0');
- switch (type)
- {
- case tfind_number:
- xsnprintf (p, endbuf - p, "%x", num);
- break;
- case tfind_pc:
- xsnprintf (p, endbuf - p, "pc:%s", phex_nz (addr1, 0));
- break;
- case tfind_tp:
- xsnprintf (p, endbuf - p, "tdp:%x", num);
- break;
- case tfind_range:
- xsnprintf (p, endbuf - p, "range:%s:%s", phex_nz (addr1, 0),
- phex_nz (addr2, 0));
- break;
- case tfind_outside:
- xsnprintf (p, endbuf - p, "outside:%s:%s", phex_nz (addr1, 0),
- phex_nz (addr2, 0));
- break;
- default:
- error (_("Unknown trace find type %d"), type);
- }
- putpkt (rs->buf);
- reply = remote_get_noisy_reply (&(rs->buf), &rs->buf_size);
- if (*reply == '\0')
- error (_("Target does not support this command."));
- while (reply && *reply)
- switch (*reply)
- {
- case 'F':
- p = ++reply;
- target_frameno = (int) strtol (p, &reply, 16);
- if (reply == p)
- error (_("Unable to parse trace frame number"));
-
- if (target_frameno == -1)
- return -1;
- break;
- case 'T':
- p = ++reply;
- target_tracept = (int) strtol (p, &reply, 16);
- if (reply == p)
- error (_("Unable to parse tracepoint number"));
- break;
- case 'O':
- if (reply[1] == 'K' && reply[2] == '\0')
- reply += 2;
- else
- error (_("Bogus reply from target: %s"), reply);
- break;
- default:
- error (_("Bogus reply from target: %s"), reply);
- }
- if (tpp)
- *tpp = target_tracept;
- rs->remote_traceframe_number = target_frameno;
- return target_frameno;
- }
- static int
- remote_get_trace_state_variable_value (struct target_ops *self,
- int tsvnum, LONGEST *val)
- {
- struct remote_state *rs = get_remote_state ();
- char *reply;
- ULONGEST uval;
- set_remote_traceframe ();
- xsnprintf (rs->buf, get_remote_packet_size (), "qTV:%x", tsvnum);
- putpkt (rs->buf);
- reply = remote_get_noisy_reply (&target_buf, &target_buf_size);
- if (reply && *reply)
- {
- if (*reply == 'V')
- {
- unpack_varlen_hex (reply + 1, &uval);
- *val = (LONGEST) uval;
- return 1;
- }
- }
- return 0;
- }
- static int
- remote_save_trace_data (struct target_ops *self, const char *filename)
- {
- struct remote_state *rs = get_remote_state ();
- char *p, *reply;
- p = rs->buf;
- strcpy (p, "QTSave:");
- p += strlen (p);
- if ((p - rs->buf) + strlen (filename) * 2 >= get_remote_packet_size ())
- error (_("Remote file name too long for trace save packet"));
- p += 2 * bin2hex ((gdb_byte *) filename, p, strlen (filename));
- *p++ = '\0';
- putpkt (rs->buf);
- reply = remote_get_noisy_reply (&target_buf, &target_buf_size);
- if (*reply == '\0')
- error (_("Target does not support this command."));
- if (strcmp (reply, "OK") != 0)
- error (_("Bogus reply from target: %s"), reply);
- return 0;
- }
- static LONGEST
- remote_get_raw_trace_data (struct target_ops *self,
- gdb_byte *buf, ULONGEST offset, LONGEST len)
- {
- struct remote_state *rs = get_remote_state ();
- char *reply;
- char *p;
- int rslt;
- p = rs->buf;
- strcpy (p, "qTBuffer:");
- p += strlen (p);
- p += hexnumstr (p, offset);
- *p++ = ',';
- p += hexnumstr (p, len);
- *p++ = '\0';
- putpkt (rs->buf);
- reply = remote_get_noisy_reply (&target_buf, &target_buf_size);
- if (reply && *reply)
- {
-
- if (*reply == 'l')
- return 0;
-
- rslt = hex2bin (target_buf, buf, len);
- return rslt;
- }
-
- return -1;
- }
- static void
- remote_set_disconnected_tracing (struct target_ops *self, int val)
- {
- struct remote_state *rs = get_remote_state ();
- if (packet_support (PACKET_DisconnectedTracing_feature) == PACKET_ENABLE)
- {
- char *reply;
- xsnprintf (rs->buf, get_remote_packet_size (), "QTDisconnected:%x", val);
- putpkt (rs->buf);
- reply = remote_get_noisy_reply (&target_buf, &target_buf_size);
- if (*reply == '\0')
- error (_("Target does not support this command."));
- if (strcmp (reply, "OK") != 0)
- error (_("Bogus reply from target: %s"), reply);
- }
- else if (val)
- warning (_("Target does not support disconnected tracing."));
- }
- static int
- remote_core_of_thread (struct target_ops *ops, ptid_t ptid)
- {
- struct thread_info *info = find_thread_ptid (ptid);
- if (info && info->private)
- return info->private->core;
- return -1;
- }
- static void
- remote_set_circular_trace_buffer (struct target_ops *self, int val)
- {
- struct remote_state *rs = get_remote_state ();
- char *reply;
- xsnprintf (rs->buf, get_remote_packet_size (), "QTBuffer:circular:%x", val);
- putpkt (rs->buf);
- reply = remote_get_noisy_reply (&target_buf, &target_buf_size);
- if (*reply == '\0')
- error (_("Target does not support this command."));
- if (strcmp (reply, "OK") != 0)
- error (_("Bogus reply from target: %s"), reply);
- }
- static struct traceframe_info *
- remote_traceframe_info (struct target_ops *self)
- {
- char *text;
- text = target_read_stralloc (¤t_target,
- TARGET_OBJECT_TRACEFRAME_INFO, NULL);
- if (text != NULL)
- {
- struct traceframe_info *info;
- struct cleanup *back_to = make_cleanup (xfree, text);
- info = parse_traceframe_info (text);
- do_cleanups (back_to);
- return info;
- }
- return NULL;
- }
- static int
- remote_get_min_fast_tracepoint_insn_len (struct target_ops *self)
- {
- struct remote_state *rs = get_remote_state ();
- char *reply;
-
- if (!target_has_execution)
- return 0;
-
- set_general_process ();
- xsnprintf (rs->buf, get_remote_packet_size (), "qTMinFTPILen");
- putpkt (rs->buf);
- reply = remote_get_noisy_reply (&target_buf, &target_buf_size);
- if (*reply == '\0')
- return -1;
- else
- {
- ULONGEST min_insn_len;
- unpack_varlen_hex (reply, &min_insn_len);
- return (int) min_insn_len;
- }
- }
- static void
- remote_set_trace_buffer_size (struct target_ops *self, LONGEST val)
- {
- if (packet_support (PACKET_QTBuffer_size) != PACKET_DISABLE)
- {
- struct remote_state *rs = get_remote_state ();
- char *buf = rs->buf;
- char *endbuf = rs->buf + get_remote_packet_size ();
- enum packet_result result;
- gdb_assert (val >= 0 || val == -1);
- buf += xsnprintf (buf, endbuf - buf, "QTBuffer:size:");
-
- if (val < 0)
- {
- *buf++ = '-';
- buf += hexnumstr (buf, (ULONGEST) -val);
- }
- else
- buf += hexnumstr (buf, (ULONGEST) val);
- putpkt (rs->buf);
- remote_get_noisy_reply (&rs->buf, &rs->buf_size);
- result = packet_ok (rs->buf,
- &remote_protocol_packets[PACKET_QTBuffer_size]);
- if (result != PACKET_OK)
- warning (_("Bogus reply from target: %s"), rs->buf);
- }
- }
- static int
- remote_set_trace_notes (struct target_ops *self,
- const char *user, const char *notes,
- const char *stop_notes)
- {
- struct remote_state *rs = get_remote_state ();
- char *reply;
- char *buf = rs->buf;
- char *endbuf = rs->buf + get_remote_packet_size ();
- int nbytes;
- buf += xsnprintf (buf, endbuf - buf, "QTNotes:");
- if (user)
- {
- buf += xsnprintf (buf, endbuf - buf, "user:");
- nbytes = bin2hex ((gdb_byte *) user, buf, strlen (user));
- buf += 2 * nbytes;
- *buf++ = ';';
- }
- if (notes)
- {
- buf += xsnprintf (buf, endbuf - buf, "notes:");
- nbytes = bin2hex ((gdb_byte *) notes, buf, strlen (notes));
- buf += 2 * nbytes;
- *buf++ = ';';
- }
- if (stop_notes)
- {
- buf += xsnprintf (buf, endbuf - buf, "tstop:");
- nbytes = bin2hex ((gdb_byte *) stop_notes, buf, strlen (stop_notes));
- buf += 2 * nbytes;
- *buf++ = ';';
- }
-
- *buf = '\0';
- putpkt (rs->buf);
- reply = remote_get_noisy_reply (&target_buf, &target_buf_size);
- if (*reply == '\0')
- return 0;
- if (strcmp (reply, "OK") != 0)
- error (_("Bogus reply from target: %s"), reply);
- return 1;
- }
- static int
- remote_use_agent (struct target_ops *self, int use)
- {
- if (packet_support (PACKET_QAgent) != PACKET_DISABLE)
- {
- struct remote_state *rs = get_remote_state ();
-
- xsnprintf (rs->buf, get_remote_packet_size (), "QAgent:%d", use);
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
- if (strcmp (rs->buf, "OK") == 0)
- {
- use_agent = use;
- return 1;
- }
- }
- return 0;
- }
- static int
- remote_can_use_agent (struct target_ops *self)
- {
- return (packet_support (PACKET_QAgent) != PACKET_DISABLE);
- }
- struct btrace_target_info
- {
-
- ptid_t ptid;
- };
- static int
- remote_supports_btrace (struct target_ops *self)
- {
- if (packet_support (PACKET_Qbtrace_off) != PACKET_ENABLE)
- return 0;
- if (packet_support (PACKET_Qbtrace_bts) != PACKET_ENABLE)
- return 0;
- if (packet_support (PACKET_qXfer_btrace) != PACKET_ENABLE)
- return 0;
- return 1;
- }
- static struct btrace_target_info *
- remote_enable_btrace (struct target_ops *self, ptid_t ptid)
- {
- struct btrace_target_info *tinfo = NULL;
- struct packet_config *packet = &remote_protocol_packets[PACKET_Qbtrace_bts];
- struct remote_state *rs = get_remote_state ();
- char *buf = rs->buf;
- char *endbuf = rs->buf + get_remote_packet_size ();
- if (packet_config_support (packet) != PACKET_ENABLE)
- error (_("Target does not support branch tracing."));
- set_general_thread (ptid);
- buf += xsnprintf (buf, endbuf - buf, "%s", packet->name);
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
- if (packet_ok (rs->buf, packet) == PACKET_ERROR)
- {
- if (rs->buf[0] == 'E' && rs->buf[1] == '.')
- error (_("Could not enable branch tracing for %s: %s"),
- target_pid_to_str (ptid), rs->buf + 2);
- else
- error (_("Could not enable branch tracing for %s."),
- target_pid_to_str (ptid));
- }
- tinfo = xzalloc (sizeof (*tinfo));
- tinfo->ptid = ptid;
- return tinfo;
- }
- static void
- remote_disable_btrace (struct target_ops *self,
- struct btrace_target_info *tinfo)
- {
- struct packet_config *packet = &remote_protocol_packets[PACKET_Qbtrace_off];
- struct remote_state *rs = get_remote_state ();
- char *buf = rs->buf;
- char *endbuf = rs->buf + get_remote_packet_size ();
- if (packet_config_support (packet) != PACKET_ENABLE)
- error (_("Target does not support branch tracing."));
- set_general_thread (tinfo->ptid);
- buf += xsnprintf (buf, endbuf - buf, "%s", packet->name);
- putpkt (rs->buf);
- getpkt (&rs->buf, &rs->buf_size, 0);
- if (packet_ok (rs->buf, packet) == PACKET_ERROR)
- {
- if (rs->buf[0] == 'E' && rs->buf[1] == '.')
- error (_("Could not disable branch tracing for %s: %s"),
- target_pid_to_str (tinfo->ptid), rs->buf + 2);
- else
- error (_("Could not disable branch tracing for %s."),
- target_pid_to_str (tinfo->ptid));
- }
- xfree (tinfo);
- }
- static void
- remote_teardown_btrace (struct target_ops *self,
- struct btrace_target_info *tinfo)
- {
-
- xfree (tinfo);
- }
- static enum btrace_error
- remote_read_btrace (struct target_ops *self,
- VEC (btrace_block_s) **btrace,
- struct btrace_target_info *tinfo,
- enum btrace_read_type type)
- {
- struct packet_config *packet = &remote_protocol_packets[PACKET_qXfer_btrace];
- struct remote_state *rs = get_remote_state ();
- struct cleanup *cleanup;
- const char *annex;
- char *xml;
- if (packet_config_support (packet) != PACKET_ENABLE)
- error (_("Target does not support branch tracing."));
- #if !defined(HAVE_LIBEXPAT)
- error (_("Cannot process branch tracing result. XML parsing not supported."));
- #endif
- switch (type)
- {
- case BTRACE_READ_ALL:
- annex = "all";
- break;
- case BTRACE_READ_NEW:
- annex = "new";
- break;
- case BTRACE_READ_DELTA:
- annex = "delta";
- break;
- default:
- internal_error (__FILE__, __LINE__,
- _("Bad branch tracing read type: %u."),
- (unsigned int) type);
- }
- xml = target_read_stralloc (¤t_target,
- TARGET_OBJECT_BTRACE, annex);
- if (xml == NULL)
- return BTRACE_ERR_UNKNOWN;
- cleanup = make_cleanup (xfree, xml);
- *btrace = parse_xml_btrace (xml);
- do_cleanups (cleanup);
- return BTRACE_ERR_NONE;
- }
- static int
- remote_augmented_libraries_svr4_read (struct target_ops *self)
- {
- return (packet_support (PACKET_augmented_libraries_svr4_read_feature)
- == PACKET_ENABLE);
- }
- static void
- remote_load (struct target_ops *self, const char *name, int from_tty)
- {
- generic_load (name, from_tty);
- }
- static void
- init_remote_ops (void)
- {
- remote_ops.to_shortname = "remote";
- remote_ops.to_longname = "Remote serial target in gdb-specific protocol";
- remote_ops.to_doc =
- "Use a remote computer via a serial line, using a gdb-specific protocol.\n\
- Specify the serial device it is connected to\n\
- (e.g. /dev/ttyS0, /dev/ttya, COM1, etc.).";
- remote_ops.to_open = remote_open;
- remote_ops.to_close = remote_close;
- remote_ops.to_detach = remote_detach;
- remote_ops.to_disconnect = remote_disconnect;
- remote_ops.to_resume = remote_resume;
- remote_ops.to_wait = remote_wait;
- remote_ops.to_fetch_registers = remote_fetch_registers;
- remote_ops.to_store_registers = remote_store_registers;
- remote_ops.to_prepare_to_store = remote_prepare_to_store;
- remote_ops.to_files_info = remote_files_info;
- remote_ops.to_insert_breakpoint = remote_insert_breakpoint;
- remote_ops.to_remove_breakpoint = remote_remove_breakpoint;
- remote_ops.to_stopped_by_watchpoint = remote_stopped_by_watchpoint;
- remote_ops.to_stopped_data_address = remote_stopped_data_address;
- remote_ops.to_watchpoint_addr_within_range =
- remote_watchpoint_addr_within_range;
- remote_ops.to_can_use_hw_breakpoint = remote_check_watch_resources;
- remote_ops.to_insert_hw_breakpoint = remote_insert_hw_breakpoint;
- remote_ops.to_remove_hw_breakpoint = remote_remove_hw_breakpoint;
- remote_ops.to_region_ok_for_hw_watchpoint
- = remote_region_ok_for_hw_watchpoint;
- remote_ops.to_insert_watchpoint = remote_insert_watchpoint;
- remote_ops.to_remove_watchpoint = remote_remove_watchpoint;
- remote_ops.to_kill = remote_kill;
- remote_ops.to_load = remote_load;
- remote_ops.to_mourn_inferior = remote_mourn;
- remote_ops.to_pass_signals = remote_pass_signals;
- remote_ops.to_program_signals = remote_program_signals;
- remote_ops.to_thread_alive = remote_thread_alive;
- remote_ops.to_update_thread_list = remote_update_thread_list;
- remote_ops.to_pid_to_str = remote_pid_to_str;
- remote_ops.to_extra_thread_info = remote_threads_extra_info;
- remote_ops.to_get_ada_task_ptid = remote_get_ada_task_ptid;
- remote_ops.to_stop = remote_stop;
- remote_ops.to_xfer_partial = remote_xfer_partial;
- remote_ops.to_rcmd = remote_rcmd;
- remote_ops.to_log_command = serial_log_command;
- remote_ops.to_get_thread_local_address = remote_get_thread_local_address;
- remote_ops.to_stratum = process_stratum;
- remote_ops.to_has_all_memory = default_child_has_all_memory;
- remote_ops.to_has_memory = default_child_has_memory;
- remote_ops.to_has_stack = default_child_has_stack;
- remote_ops.to_has_registers = default_child_has_registers;
- remote_ops.to_has_execution = default_child_has_execution;
- remote_ops.to_has_thread_control = tc_schedlock;
- remote_ops.to_can_execute_reverse = remote_can_execute_reverse;
- remote_ops.to_magic = OPS_MAGIC;
- remote_ops.to_memory_map = remote_memory_map;
- remote_ops.to_flash_erase = remote_flash_erase;
- remote_ops.to_flash_done = remote_flash_done;
- remote_ops.to_read_description = remote_read_description;
- remote_ops.to_search_memory = remote_search_memory;
- remote_ops.to_can_async_p = remote_can_async_p;
- remote_ops.to_is_async_p = remote_is_async_p;
- remote_ops.to_async = remote_async;
- remote_ops.to_terminal_inferior = remote_terminal_inferior;
- remote_ops.to_terminal_ours = remote_terminal_ours;
- remote_ops.to_supports_non_stop = remote_supports_non_stop;
- remote_ops.to_supports_multi_process = remote_supports_multi_process;
- remote_ops.to_supports_disable_randomization
- = remote_supports_disable_randomization;
- remote_ops.to_fileio_open = remote_hostio_open;
- remote_ops.to_fileio_pwrite = remote_hostio_pwrite;
- remote_ops.to_fileio_pread = remote_hostio_pread;
- remote_ops.to_fileio_close = remote_hostio_close;
- remote_ops.to_fileio_unlink = remote_hostio_unlink;
- remote_ops.to_fileio_readlink = remote_hostio_readlink;
- remote_ops.to_supports_enable_disable_tracepoint = remote_supports_enable_disable_tracepoint;
- remote_ops.to_supports_string_tracing = remote_supports_string_tracing;
- remote_ops.to_supports_evaluation_of_breakpoint_conditions = remote_supports_cond_breakpoints;
- remote_ops.to_can_run_breakpoint_commands = remote_can_run_breakpoint_commands;
- remote_ops.to_trace_init = remote_trace_init;
- remote_ops.to_download_tracepoint = remote_download_tracepoint;
- remote_ops.to_can_download_tracepoint = remote_can_download_tracepoint;
- remote_ops.to_download_trace_state_variable
- = remote_download_trace_state_variable;
- remote_ops.to_enable_tracepoint = remote_enable_tracepoint;
- remote_ops.to_disable_tracepoint = remote_disable_tracepoint;
- remote_ops.to_trace_set_readonly_regions = remote_trace_set_readonly_regions;
- remote_ops.to_trace_start = remote_trace_start;
- remote_ops.to_get_trace_status = remote_get_trace_status;
- remote_ops.to_get_tracepoint_status = remote_get_tracepoint_status;
- remote_ops.to_trace_stop = remote_trace_stop;
- remote_ops.to_trace_find = remote_trace_find;
- remote_ops.to_get_trace_state_variable_value
- = remote_get_trace_state_variable_value;
- remote_ops.to_save_trace_data = remote_save_trace_data;
- remote_ops.to_upload_tracepoints = remote_upload_tracepoints;
- remote_ops.to_upload_trace_state_variables
- = remote_upload_trace_state_variables;
- remote_ops.to_get_raw_trace_data = remote_get_raw_trace_data;
- remote_ops.to_get_min_fast_tracepoint_insn_len = remote_get_min_fast_tracepoint_insn_len;
- remote_ops.to_set_disconnected_tracing = remote_set_disconnected_tracing;
- remote_ops.to_set_circular_trace_buffer = remote_set_circular_trace_buffer;
- remote_ops.to_set_trace_buffer_size = remote_set_trace_buffer_size;
- remote_ops.to_set_trace_notes = remote_set_trace_notes;
- remote_ops.to_core_of_thread = remote_core_of_thread;
- remote_ops.to_verify_memory = remote_verify_memory;
- remote_ops.to_get_tib_address = remote_get_tib_address;
- remote_ops.to_set_permissions = remote_set_permissions;
- remote_ops.to_static_tracepoint_marker_at
- = remote_static_tracepoint_marker_at;
- remote_ops.to_static_tracepoint_markers_by_strid
- = remote_static_tracepoint_markers_by_strid;
- remote_ops.to_traceframe_info = remote_traceframe_info;
- remote_ops.to_use_agent = remote_use_agent;
- remote_ops.to_can_use_agent = remote_can_use_agent;
- remote_ops.to_supports_btrace = remote_supports_btrace;
- remote_ops.to_enable_btrace = remote_enable_btrace;
- remote_ops.to_disable_btrace = remote_disable_btrace;
- remote_ops.to_teardown_btrace = remote_teardown_btrace;
- remote_ops.to_read_btrace = remote_read_btrace;
- remote_ops.to_augmented_libraries_svr4_read =
- remote_augmented_libraries_svr4_read;
- }
- static void
- init_extended_remote_ops (void)
- {
- extended_remote_ops = remote_ops;
- extended_remote_ops.to_shortname = "extended-remote";
- extended_remote_ops.to_longname =
- "Extended remote serial target in gdb-specific protocol";
- extended_remote_ops.to_doc =
- "Use a remote computer via a serial line, using a gdb-specific protocol.\n\
- Specify the serial device it is connected to (e.g. /dev/ttya).";
- extended_remote_ops.to_open = extended_remote_open;
- extended_remote_ops.to_create_inferior = extended_remote_create_inferior;
- extended_remote_ops.to_mourn_inferior = extended_remote_mourn;
- extended_remote_ops.to_detach = extended_remote_detach;
- extended_remote_ops.to_attach = extended_remote_attach;
- extended_remote_ops.to_post_attach = extended_remote_post_attach;
- extended_remote_ops.to_kill = extended_remote_kill;
- extended_remote_ops.to_supports_disable_randomization
- = extended_remote_supports_disable_randomization;
- }
- static int
- remote_can_async_p (struct target_ops *ops)
- {
- struct remote_state *rs = get_remote_state ();
- if (!target_async_permitted)
-
- return 0;
-
- return serial_can_async_p (rs->remote_desc);
- }
- static int
- remote_is_async_p (struct target_ops *ops)
- {
- struct remote_state *rs = get_remote_state ();
- if (!target_async_permitted)
-
- return 0;
-
- return serial_is_async_p (rs->remote_desc);
- }
- static serial_event_ftype remote_async_serial_handler;
- static void
- remote_async_serial_handler (struct serial *scb, void *context)
- {
- struct remote_state *rs = context;
-
- rs->async_client_callback (INF_REG_EVENT, rs->async_client_context);
- }
- static void
- remote_async_inferior_event_handler (gdb_client_data data)
- {
- inferior_event_handler (INF_REG_EVENT, NULL);
- }
- static void
- remote_async (struct target_ops *ops,
- void (*callback) (enum inferior_event_type event_type,
- void *context),
- void *context)
- {
- struct remote_state *rs = get_remote_state ();
- if (callback != NULL)
- {
- serial_async (rs->remote_desc, remote_async_serial_handler, rs);
- rs->async_client_callback = callback;
- rs->async_client_context = context;
- }
- else
- serial_async (rs->remote_desc, NULL, NULL);
- }
- static void
- set_remote_cmd (char *args, int from_tty)
- {
- help_list (remote_set_cmdlist, "set remote ", all_commands, gdb_stdout);
- }
- static void
- show_remote_cmd (char *args, int from_tty)
- {
-
- struct cleanup *showlist_chain;
- struct cmd_list_element *list = remote_show_cmdlist;
- struct ui_out *uiout = current_uiout;
- showlist_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "showlist");
- for (; list != NULL; list = list->next)
- if (strcmp (list->name, "Z-packet") == 0)
- continue;
- else if (list->type == not_set_cmd)
-
- continue;
- else
- {
- struct cleanup *option_chain
- = make_cleanup_ui_out_tuple_begin_end (uiout, "option");
- ui_out_field_string (uiout, "name", list->name);
- ui_out_text (uiout, ": ");
- if (list->type == show_cmd)
- do_show_command ((char *) NULL, from_tty, list);
- else
- cmd_func (list, NULL, from_tty);
-
- do_cleanups (option_chain);
- }
-
- do_cleanups (showlist_chain);
- }
- static void
- remote_new_objfile (struct objfile *objfile)
- {
- struct remote_state *rs = get_remote_state ();
- if (rs->remote_desc != 0)
- remote_check_symbols ();
- }
- static int
- remote_upload_tracepoints (struct target_ops *self, struct uploaded_tp **utpp)
- {
- struct remote_state *rs = get_remote_state ();
- char *p;
-
- putpkt ("qTfP");
- getpkt (&rs->buf, &rs->buf_size, 0);
- p = rs->buf;
- while (*p && *p != 'l')
- {
- parse_tracepoint_definition (p, utpp);
-
- putpkt ("qTsP");
- getpkt (&rs->buf, &rs->buf_size, 0);
- p = rs->buf;
- }
- return 0;
- }
- static int
- remote_upload_trace_state_variables (struct target_ops *self,
- struct uploaded_tsv **utsvp)
- {
- struct remote_state *rs = get_remote_state ();
- char *p;
-
- putpkt ("qTfV");
- getpkt (&rs->buf, &rs->buf_size, 0);
- p = rs->buf;
- while (*p && *p != 'l')
- {
- parse_tsv_definition (p, utsvp);
-
- putpkt ("qTsV");
- getpkt (&rs->buf, &rs->buf_size, 0);
- p = rs->buf;
- }
- return 0;
- }
- static void
- show_range_stepping (struct ui_file *file, int from_tty,
- struct cmd_list_element *c,
- const char *value)
- {
- fprintf_filtered (file,
- _("Debugger's willingness to use range stepping "
- "is %s.\n"), value);
- }
- static void
- set_range_stepping (char *ignore_args, int from_tty,
- struct cmd_list_element *c)
- {
- struct remote_state *rs = get_remote_state ();
-
- if (use_range_stepping)
- {
- if (rs->remote_desc != NULL)
- {
- if (packet_support (PACKET_vCont) == PACKET_SUPPORT_UNKNOWN)
- remote_vcont_probe (rs);
- if (packet_support (PACKET_vCont) == PACKET_ENABLE
- && rs->supports_vCont.r)
- return;
- }
- warning (_("Range stepping is not supported by the current target"));
- }
- }
- void
- _initialize_remote (void)
- {
- struct remote_state *rs;
- struct cmd_list_element *cmd;
- const char *cmd_name;
-
- remote_gdbarch_data_handle =
- gdbarch_data_register_post_init (init_remote_state);
- remote_g_packet_data_handle =
- gdbarch_data_register_pre_init (remote_g_packet_data_init);
-
- remote_state = new_remote_state ();
- init_remote_ops ();
- add_target (&remote_ops);
- init_extended_remote_ops ();
- add_target (&extended_remote_ops);
-
- observer_attach_new_objfile (remote_new_objfile);
-
- observer_attach_inferior_exit (discard_pending_stop_replies);
-
- async_sigint_remote_token =
- create_async_signal_handler (async_remote_interrupt, NULL);
- async_sigint_remote_twice_token =
- create_async_signal_handler (async_remote_interrupt_twice, NULL);
- #if 0
- #endif
- stop_reply_queue = QUEUE_alloc (stop_reply_p, stop_reply_xfree);
-
- add_prefix_cmd ("remote", class_maintenance, set_remote_cmd, _("\
- Remote protocol specific variables\n\
- Configure various remote-protocol specific variables such as\n\
- the packets being used"),
- &remote_set_cmdlist, "set remote ",
- 0 , &setlist);
- add_prefix_cmd ("remote", class_maintenance, show_remote_cmd, _("\
- Remote protocol specific variables\n\
- Configure various remote-protocol specific variables such as\n\
- the packets being used"),
- &remote_show_cmdlist, "show remote ",
- 0 , &showlist);
- add_cmd ("compare-sections", class_obscure, compare_sections_command, _("\
- Compare section data on target to the exec file.\n\
- Argument is a single section name (default: all loaded sections).\n\
- To compare only read-only loaded sections, specify the -r option."),
- &cmdlist);
- add_cmd ("packet", class_maintenance, packet_command, _("\
- Send an arbitrary packet to a remote target.\n\
- maintenance packet TEXT\n\
- If GDB is talking to an inferior via the GDB serial protocol, then\n\
- this command sends the string TEXT to the inferior, and displays the\n\
- response packet. GDB supplies the initial `$' character, and the\n\
- terminating `#' character and checksum."),
- &maintenancelist);
- add_setshow_boolean_cmd ("remotebreak", no_class, &remote_break, _("\
- Set whether to send break if interrupted."), _("\
- Show whether to send break if interrupted."), _("\
- If set, a break, instead of a cntrl-c, is sent to the remote target."),
- set_remotebreak, show_remotebreak,
- &setlist, &showlist);
- cmd_name = "remotebreak";
- cmd = lookup_cmd (&cmd_name, setlist, "", -1, 1);
- deprecate_cmd (cmd, "set remote interrupt-sequence");
- cmd_name = "remotebreak";
- cmd = lookup_cmd (&cmd_name, showlist, "", -1, 1);
- deprecate_cmd (cmd, "show remote interrupt-sequence");
- add_setshow_enum_cmd ("interrupt-sequence", class_support,
- interrupt_sequence_modes, &interrupt_sequence_mode,
- _("\
- Set interrupt sequence to remote target."), _("\
- Show interrupt sequence to remote target."), _("\
- Valid value is \"Ctrl-C\", \"BREAK\" or \"BREAK-g\". The default is \"Ctrl-C\"."),
- NULL, show_interrupt_sequence,
- &remote_set_cmdlist,
- &remote_show_cmdlist);
- add_setshow_boolean_cmd ("interrupt-on-connect", class_support,
- &interrupt_on_connect, _("\
- Set whether interrupt-sequence is sent to remote target when gdb connects to."), _(" \
- Show whether interrupt-sequence is sent to remote target when gdb connects to."), _(" \
- If set, interrupt sequence is sent to remote target."),
- NULL, NULL,
- &remote_set_cmdlist, &remote_show_cmdlist);
-
- add_cmd ("remotewritesize", no_class, set_memory_write_packet_size, _("\
- Set the maximum number of bytes per memory write packet (deprecated)."),
- &setlist);
- add_cmd ("remotewritesize", no_class, show_memory_write_packet_size, _("\
- Show the maximum number of bytes per memory write packet (deprecated)."),
- &showlist);
- add_cmd ("memory-write-packet-size", no_class,
- set_memory_write_packet_size, _("\
- Set the maximum number of bytes per memory-write packet.\n\
- Specify the number of bytes in a packet or 0 (zero) for the\n\
- default packet size. The actual limit is further reduced\n\
- dependent on the target. Specify ``fixed'' to disable the\n\
- further restriction and ``limit'' to enable that restriction."),
- &remote_set_cmdlist);
- add_cmd ("memory-read-packet-size", no_class,
- set_memory_read_packet_size, _("\
- Set the maximum number of bytes per memory-read packet.\n\
- Specify the number of bytes in a packet or 0 (zero) for the\n\
- default packet size. The actual limit is further reduced\n\
- dependent on the target. Specify ``fixed'' to disable the\n\
- further restriction and ``limit'' to enable that restriction."),
- &remote_set_cmdlist);
- add_cmd ("memory-write-packet-size", no_class,
- show_memory_write_packet_size,
- _("Show the maximum number of bytes per memory-write packet."),
- &remote_show_cmdlist);
- add_cmd ("memory-read-packet-size", no_class,
- show_memory_read_packet_size,
- _("Show the maximum number of bytes per memory-read packet."),
- &remote_show_cmdlist);
- add_setshow_zinteger_cmd ("hardware-watchpoint-limit", no_class,
- &remote_hw_watchpoint_limit, _("\
- Set the maximum number of target hardware watchpoints."), _("\
- Show the maximum number of target hardware watchpoints."), _("\
- Specify a negative limit for unlimited."),
- NULL, NULL, FIXME
- &remote_set_cmdlist, &remote_show_cmdlist);
- add_setshow_zinteger_cmd ("hardware-watchpoint-length-limit", no_class,
- &remote_hw_watchpoint_length_limit, _("\
- Set the maximum length (in bytes) of a target hardware watchpoint."), _("\
- Show the maximum length (in bytes) of a target hardware watchpoint."), _("\
- Specify a negative limit for unlimited."),
- NULL, NULL, FIXME
- &remote_set_cmdlist, &remote_show_cmdlist);
- add_setshow_zinteger_cmd ("hardware-breakpoint-limit", no_class,
- &remote_hw_breakpoint_limit, _("\
- Set the maximum number of target hardware breakpoints."), _("\
- Show the maximum number of target hardware breakpoints."), _("\
- Specify a negative limit for unlimited."),
- NULL, NULL, FIXME
- &remote_set_cmdlist, &remote_show_cmdlist);
- add_setshow_zuinteger_cmd ("remoteaddresssize", class_obscure,
- &remote_address_size, _("\
- Set the maximum size of the address (in bits) in a memory packet."), _("\
- Show the maximum size of the address (in bits) in a memory packet."), NULL,
- NULL,
- NULL, FIXME
- &setlist, &showlist);
- init_all_packet_configs ();
- add_packet_config_cmd (&remote_protocol_packets[PACKET_X],
- "X", "binary-download", 1);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_vCont],
- "vCont", "verbose-resume", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_QPassSignals],
- "QPassSignals", "pass-signals", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_QProgramSignals],
- "QProgramSignals", "program-signals", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_qSymbol],
- "qSymbol", "symbol-lookup", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_P],
- "P", "set-register", 1);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_p],
- "p", "fetch-register", 1);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_Z0],
- "Z0", "software-breakpoint", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_Z1],
- "Z1", "hardware-breakpoint", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_Z2],
- "Z2", "write-watchpoint", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_Z3],
- "Z3", "read-watchpoint", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_Z4],
- "Z4", "access-watchpoint", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_auxv],
- "qXfer:auxv:read", "read-aux-vector", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_features],
- "qXfer:features:read", "target-features", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_libraries],
- "qXfer:libraries:read", "library-info", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_libraries_svr4],
- "qXfer:libraries-svr4:read", "library-info-svr4", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_memory_map],
- "qXfer:memory-map:read", "memory-map", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_spu_read],
- "qXfer:spu:read", "read-spu-object", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_spu_write],
- "qXfer:spu:write", "write-spu-object", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_osdata],
- "qXfer:osdata:read", "osdata", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_threads],
- "qXfer:threads:read", "threads", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_siginfo_read],
- "qXfer:siginfo:read", "read-siginfo-object", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_siginfo_write],
- "qXfer:siginfo:write", "write-siginfo-object", 0);
- add_packet_config_cmd
- (&remote_protocol_packets[PACKET_qXfer_traceframe_info],
- "qXfer:traceframe-info:read", "traceframe-info", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_uib],
- "qXfer:uib:read", "unwind-info-block", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_qGetTLSAddr],
- "qGetTLSAddr", "get-thread-local-storage-address",
- 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_qGetTIBAddr],
- "qGetTIBAddr", "get-thread-information-block-address",
- 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_bc],
- "bc", "reverse-continue", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_bs],
- "bs", "reverse-step", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_qSupported],
- "qSupported", "supported-packets", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_qSearch_memory],
- "qSearch:memory", "search-memory", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_qTStatus],
- "qTStatus", "trace-status", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_vFile_open],
- "vFile:open", "hostio-open", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_vFile_pread],
- "vFile:pread", "hostio-pread", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_vFile_pwrite],
- "vFile:pwrite", "hostio-pwrite", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_vFile_close],
- "vFile:close", "hostio-close", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_vFile_unlink],
- "vFile:unlink", "hostio-unlink", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_vFile_readlink],
- "vFile:readlink", "hostio-readlink", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_vAttach],
- "vAttach", "attach", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_vRun],
- "vRun", "run", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_QStartNoAckMode],
- "QStartNoAckMode", "noack", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_vKill],
- "vKill", "kill", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_qAttached],
- "qAttached", "query-attached", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_ConditionalTracepoints],
- "ConditionalTracepoints",
- "conditional-tracepoints", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_ConditionalBreakpoints],
- "ConditionalBreakpoints",
- "conditional-breakpoints", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_BreakpointCommands],
- "BreakpointCommands",
- "breakpoint-commands", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_FastTracepoints],
- "FastTracepoints", "fast-tracepoints", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_TracepointSource],
- "TracepointSource", "TracepointSource", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_QAllow],
- "QAllow", "allow", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_StaticTracepoints],
- "StaticTracepoints", "static-tracepoints", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_InstallInTrace],
- "InstallInTrace", "install-in-trace", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_statictrace_read],
- "qXfer:statictrace:read", "read-sdata-object", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_fdpic],
- "qXfer:fdpic:read", "read-fdpic-loadmap", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_QDisableRandomization],
- "QDisableRandomization", "disable-randomization", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_QAgent],
- "QAgent", "agent", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_QTBuffer_size],
- "QTBuffer:size", "trace-buffer-size", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_Qbtrace_off],
- "Qbtrace:off", "disable-btrace", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_Qbtrace_bts],
- "Qbtrace:bts", "enable-btrace", 0);
- add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_btrace],
- "qXfer:btrace", "read-btrace", 0);
-
- {
- int i;
- for (i = 0; i < PACKET_MAX; i++)
- {
-
- int excepted;
- switch (i)
- {
- case PACKET_QNonStop:
- case PACKET_multiprocess_feature:
- case PACKET_EnableDisableTracepoints_feature:
- case PACKET_tracenz_feature:
- case PACKET_DisconnectedTracing_feature:
- case PACKET_augmented_libraries_svr4_read_feature:
- case PACKET_qCRC:
-
- excepted = 1;
- break;
- default:
- excepted = 0;
- break;
- }
-
- gdb_assert (excepted == (remote_protocol_packets[i].name == NULL));
- }
- }
-
- add_setshow_auto_boolean_cmd ("Z-packet", class_obscure,
- &remote_Z_packet_detect, _("\
- Set use of remote protocol `Z' packets"), _("\
- Show use of remote protocol `Z' packets "), _("\
- When set, GDB will attempt to use the remote breakpoint and watchpoint\n\
- packets."),
- set_remote_protocol_Z_packet_cmd,
- show_remote_protocol_Z_packet_cmd,
- FIXME
- &remote_set_cmdlist, &remote_show_cmdlist);
- add_prefix_cmd ("remote", class_files, remote_command, _("\
- Manipulate files on the remote system\n\
- Transfer files to and from the remote target system."),
- &remote_cmdlist, "remote ",
- 0 , &cmdlist);
- add_cmd ("put", class_files, remote_put_command,
- _("Copy a local file to the remote system."),
- &remote_cmdlist);
- add_cmd ("get", class_files, remote_get_command,
- _("Copy a remote file to the local system."),
- &remote_cmdlist);
- add_cmd ("delete", class_files, remote_delete_command,
- _("Delete a remote file."),
- &remote_cmdlist);
- remote_exec_file = xstrdup ("");
- add_setshow_string_noescape_cmd ("exec-file", class_files,
- &remote_exec_file, _("\
- Set the remote pathname for \"run\""), _("\
- Show the remote pathname for \"run\""), NULL, NULL, NULL,
- &remote_set_cmdlist, &remote_show_cmdlist);
- add_setshow_boolean_cmd ("range-stepping", class_run,
- &use_range_stepping, _("\
- Enable or disable range stepping."), _("\
- Show whether target-assisted range stepping is enabled."), _("\
- If on, and the target supports it, when stepping a source line, GDB\n\
- tells the target to step the corresponding range of addresses itself instead\n\
- of issuing multiple single-steps. This speeds up source level\n\
- stepping. If off, GDB always issues single-steps, even if range\n\
- stepping is supported by the target. The default is on."),
- set_range_stepping,
- show_range_stepping,
- &setlist,
- &showlist);
-
- initialize_remote_fileio (remote_set_cmdlist, remote_show_cmdlist);
-
- magic_null_ptid = ptid_build (42000, -1, 1);
- not_sent_ptid = ptid_build (42000, -2, 1);
- any_thread_ptid = ptid_build (42000, 0, 1);
- target_buf_size = 2048;
- target_buf = xmalloc (target_buf_size);
- }