X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Fremote.c;h=aa6a67a96e0a5be78243729611566358a20e96f4;hb=29ef4c0699e1b46d41ade00ae07a54f979ea21cc;hp=f0f3dcbabb000abe656c12da042f07064c600bc1;hpb=4f626cad041b96f78bae75a2d24d1573f382e12b;p=binutils-gdb.git diff --git a/gdb/remote.c b/gdb/remote.c index f0f3dcbabb0..aa6a67a96e0 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -1,6 +1,6 @@ /* Remote target communications for serial-line targets in custom GDB protocol - Copyright (C) 1988-2021 Free Software Foundation, Inc. + Copyright (C) 1988-2022 Free Software Foundation, Inc. This file is part of GDB. @@ -391,7 +391,7 @@ private: static const target_info remote_target_info = { "remote", - N_("Remote serial target in gdb-specific protocol"), + N_("Remote target using gdb-specific protocol"), remote_doc }; @@ -426,8 +426,6 @@ public: void store_registers (struct regcache *, int) override; void prepare_to_store (struct regcache *) override; - void files_info () override; - int insert_breakpoint (struct gdbarch *, struct bp_target_info *) override; int remove_breakpoint (struct gdbarch *, struct bp_target_info *, @@ -660,8 +658,8 @@ public: bool use_agent (bool use) override; bool can_use_agent () override; - struct btrace_target_info *enable_btrace (ptid_t ptid, - const struct btrace_config *conf) override; + struct btrace_target_info * + enable_btrace (thread_info *tp, const struct btrace_config *conf) override; void disable_btrace (struct btrace_target_info *tinfo) override; @@ -760,7 +758,8 @@ public: /* Remote specific methods. */ void print_one_stopped_thread (thread_info *thread); void process_initial_stop_replies (int from_tty); - thread_info *remote_add_thread (ptid_t ptid, bool running, bool executing); + thread_info *remote_add_thread (ptid_t ptid, bool running, bool executing, + bool silent_p); void btrace_sync_conf (const btrace_config *conf); @@ -958,7 +957,7 @@ private: static const target_info extended_remote_target_info = { "extended-remote", - N_("Extended remote serial target in gdb-specific protocol"), + N_("Extended remote target using gdb-specific protocol"), remote_doc }; @@ -1064,8 +1063,6 @@ static int stub_unpack_int (const char *buff, int fieldlength); 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, @@ -1912,7 +1909,7 @@ 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) +show_packet_config_cmd (ui_file *file, struct packet_config *config) { const char *support = "internal-error"; @@ -1931,14 +1928,16 @@ show_packet_config_cmd (struct packet_config *config) switch (config->detect) { case AUTO_BOOLEAN_AUTO: - printf_filtered (_("Support for the `%s' packet " - "is auto-detected, currently %s.\n"), - config->name, support); + fprintf_filtered (file, + _("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); + fprintf_filtered (file, + _("Support for the `%s' packet is currently %s.\n"), + config->name, support); break; } } @@ -2274,7 +2273,7 @@ show_remote_protocol_packet_cmd (struct ui_file *file, int from_tty, { if (c == packet->show_cmd) { - show_packet_config_cmd (packet); + show_packet_config_cmd (file, packet); return; } } @@ -2318,7 +2317,7 @@ show_remote_protocol_Z_packet_cmd (struct ui_file *file, int from_tty, for (i = 0; i < NR_Z_PACKET_TYPES; i++) { - show_packet_config_cmd (&remote_protocol_packets[PACKET_Z0 + i]); + show_packet_config_cmd (file, &remote_protocol_packets[PACKET_Z0 + i]); } } @@ -2551,10 +2550,13 @@ static remote_thread_info *get_remote_thread_info (remote_target *target, ptid_t ptid); /* Add thread PTID to GDB's thread list. Tag it as executing/running - according to RUNNING. */ + according to EXECUTING and RUNNING respectively. If SILENT_P (or the + remote_state::starting_up flag) is true then the new thread is added + silently, otherwise the new thread will be announced to the user. */ thread_info * -remote_target::remote_add_thread (ptid_t ptid, bool running, bool executing) +remote_target::remote_add_thread (ptid_t ptid, bool running, bool executing, + bool silent_p) { struct remote_state *rs = get_remote_state (); struct thread_info *thread; @@ -2565,7 +2567,7 @@ remote_target::remote_add_thread (ptid_t ptid, bool running, bool executing) consider that a single-threaded target, mentioning a new thread might be confusing to the user. Be silent then, preserving the age old behavior. */ - if (rs->starting_up) + if (rs->starting_up || silent_p) thread = add_thread_silent (this, ptid); else thread = add_thread (this, ptid); @@ -2603,7 +2605,7 @@ remote_target::remote_notice_new_inferior (ptid_t currthread, bool executing) { /* We're seeing an event on a thread id we knew had exited. This has to be a new thread reusing the old id. Add it. */ - remote_add_thread (currthread, running, executing); + remote_add_thread (currthread, running, executing, false); return; } @@ -2625,7 +2627,7 @@ remote_target::remote_notice_new_inferior (ptid_t currthread, bool executing) else { thread_info *thr - = remote_add_thread (currthread, running, executing); + = remote_add_thread (currthread, running, executing, false); switch_to_thread (thr); } return; @@ -2657,7 +2659,7 @@ remote_target::remote_notice_new_inferior (ptid_t currthread, bool executing) /* This is really a new thread. Add it. */ thread_info *new_thr - = remote_add_thread (currthread, running, executing); + = remote_add_thread (currthread, running, executing, false); /* If we found a new inferior, let the common code do whatever it needs to with it (e.g., read shared libraries, insert @@ -6111,17 +6113,7 @@ extended_remote_target::attach (const char *args, int from_tty) if (packet_support (PACKET_vAttach) == PACKET_DISABLE) error (_("This target does not support attaching to a process")); - if (from_tty) - { - const char *exec_file = get_exec_file (0); - - if (exec_file) - printf_unfiltered (_("Attaching to program: %s, %s\n"), exec_file, - target_pid_to_str (ptid_t (pid)).c_str ()); - else - printf_unfiltered (_("Attaching to %s\n"), - target_pid_to_str (ptid_t (pid)).c_str ()); - } + target_announce_attach (from_tty, pid); xsnprintf (rs->buf.data (), get_remote_packet_size (), "vAttach;%x", pid); putpkt (rs->buf); @@ -6171,14 +6163,11 @@ extended_remote_target::attach (const char *args, int from_tty) ptid. */ ptid_t curr_ptid = remote_current_thread (ptid_t (pid)); - /* Add the main thread to the thread list. */ - thread_info *thr = add_thread_silent (this, curr_ptid); + /* Add the main thread to the thread list. We add the thread + silently in this case (the final true parameter). */ + thread_info *thr = remote_add_thread (curr_ptid, true, true, true); switch_to_thread (thr); - - /* Don't consider the thread stopped until we've processed the - saved stop reply. */ - set_executing (this, thr->ptid, true); } /* Next, if the target can specify a description, read it. We do @@ -6194,16 +6183,12 @@ extended_remote_target::attach (const char *args, int from_tty) = remote_notif_parse (this, ¬if_client_stop, wait_status); push_stop_reply ((struct stop_reply *) reply); - - if (target_can_async_p ()) - target_async (1); } else { gdb_assert (wait_status == NULL); gdb_assert (target_can_async_p ()); - target_async (1); } } @@ -6582,16 +6567,6 @@ remote_target::resume (ptid_t ptid, int step, enum gdb_signal siggnal) for (thread_info *tp : all_non_exited_threads (this, ptid)) get_remote_thread_info (tp)->set_resumed (); - /* We are about to start executing the inferior, let's register it - with the event loop. NOTE: this is the one place where all the - execution commands end up. We could alternatively do this in each - of the execution commands in infcmd.c. */ - /* FIXME: ezannoni 1999-09-28: We may need to move this out of here - into infcmd.c in order to allow inferior function calls to work - NOT asynchronously. */ - if (target_can_async_p ()) - target_async (1); - /* We've just told the target to resume. The remote server will wait for the inferior to stop, and then send a stop reply. In the mean time, we can't start another command/query ourselves @@ -7447,7 +7422,7 @@ remote_target::remote_notif_remove_queued_reply (ptid_t ptid) if (notif_debug) fprintf_unfiltered (gdb_stdlog, "notif: discard queued event: 'Stop' in %s\n", - target_pid_to_str (ptid).c_str ()); + ptid.to_string ().c_str ()); return result; } @@ -7485,7 +7460,7 @@ remote_target::push_stop_reply (struct stop_reply *new_event) if (notif_debug) fprintf_unfiltered (gdb_stdlog, "notif: push 'Stop' %s to queue %d\n", - target_pid_to_str (new_event->ptid).c_str (), + new_event->ptid.to_string ().c_str (), int (rs->stop_reply_queue.size ())); /* Mark the pending event queue only if async mode is currently enabled. @@ -8010,12 +7985,12 @@ remote_target::select_thread_for_ambiguous_stop_reply ambiguous = true; } + gdb_assert (first_resumed_thread != nullptr); + remote_debug_printf ("first resumed thread is %s", pid_to_str (first_resumed_thread->ptid).c_str ()); remote_debug_printf ("is this guess ambiguous? = %d", ambiguous); - gdb_assert (first_resumed_thread != nullptr); - /* Warn if the remote target is sending ambiguous stop replies. */ if (ambiguous) { @@ -8348,9 +8323,13 @@ remote_target::wait (ptid_t ptid, struct target_waitstatus *status, remote_state *rs = get_remote_state (); /* Start by clearing the flag that asks for our wait method to be called, - we'll mark it again at the end if needed. */ + we'll mark it again at the end if needed. If the target is not in + async mode then the async token should not be marked. */ if (target_is_async_p ()) clear_async_event_handler (rs->remote_async_inferior_event_token); + else + gdb_assert (!async_event_handler_marked + (rs->remote_async_inferior_event_token)); ptid_t event_ptid; @@ -9425,11 +9404,6 @@ remote_target::flash_done () } } -void -remote_target::files_info () -{ - puts_filtered ("Debugging a target over a serial line.\n"); -} /* Stuff for dealing with the packets which are part of this protocol. See comment at top of file for details. */ @@ -9531,7 +9505,7 @@ escape_buffer (const char *buf, int n) string_file stb; stb.putstrn (buf, n, '\\'); - return std::move (stb.string ()); + return stb.release (); } int @@ -14115,12 +14089,15 @@ remote_target::btrace_sync_conf (const btrace_config *conf) } } -/* Read the current thread's btrace configuration from the target and - store it into CONF. */ +/* Read TP's btrace configuration from the target and store it into CONF. */ static void -btrace_read_config (struct btrace_config *conf) +btrace_read_config (thread_info *tp, struct btrace_config *conf) { + /* target_read_stralloc relies on INFERIOR_PTID. */ + scoped_restore_current_thread restore_thread; + switch_to_thread (tp); + gdb::optional xml = target_read_stralloc (current_inferior ()->top_target (), TARGET_OBJECT_BTRACE_CONF, ""); @@ -14144,14 +14121,10 @@ remote_target::remote_btrace_maybe_reopen () if (packet_support (PACKET_qXfer_btrace_conf) != PACKET_ENABLE) return; - scoped_restore_current_thread restore_thread; - for (thread_info *tp : all_non_exited_threads (this)) { - set_general_thread (tp->ptid); - memset (&rs->btrace_config, 0x00, sizeof (struct btrace_config)); - btrace_read_config (&rs->btrace_config); + btrace_read_config (tp, &rs->btrace_config); if (rs->btrace_config.format == BTRACE_FORMAT_NONE) continue; @@ -14190,7 +14163,8 @@ remote_target::remote_btrace_maybe_reopen () /* Enable branch tracing. */ struct btrace_target_info * -remote_target::enable_btrace (ptid_t ptid, const struct btrace_config *conf) +remote_target::enable_btrace (thread_info *tp, + const struct btrace_config *conf) { struct btrace_target_info *tinfo = NULL; struct packet_config *packet = NULL; @@ -14214,6 +14188,7 @@ remote_target::enable_btrace (ptid_t ptid, const struct btrace_config *conf) btrace_sync_conf (conf); + ptid_t ptid = tp->ptid; set_general_thread (ptid); buf += xsnprintf (buf, endbuf - buf, "%s", packet->name); @@ -14237,7 +14212,7 @@ remote_target::enable_btrace (ptid_t ptid, const struct btrace_config *conf) tracing itself is not impacted. */ try { - btrace_read_config (&tinfo->conf); + btrace_read_config (tp, &tinfo->conf); } catch (const gdb_exception_error &err) {