From patchwork Tue Mar 19 13:58:29 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Alexandra_H=C3=A1jkov=C3=A1?= X-Patchwork-Id: 87356 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id E5450385841A for ; Tue, 19 Mar 2024 13:59:33 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mail0.khirnov.net (mail0.khirnov.net [IPv6:2001:67c:1138:4304::3]) by sourceware.org (Postfix) with ESMTPS id D1EE43858CD1 for ; Tue, 19 Mar 2024 13:58:34 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org D1EE43858CD1 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=khirnov.net Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=khirnov.net ARC-Filter: OpenARC Filter v1.0.0 sourceware.org D1EE43858CD1 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2001:67c:1138:4304::3 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1710856718; cv=none; b=SgLDPCZ5vkwSkLlEMiYnJfyDsFCYkeanrKjqC1gHBT09rzPAWdGYX1J1OLywutFEJljQhHD5SBXYPIt5lNNTn0Bu3YYnTf1wDgZN68lfyy5CeLBYiWufu7QWRR6qhiggDcfRNpoAtnY1WEI4qAUGSIhIxtDe4JieVnvZMd50vkg= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1710856718; c=relaxed/simple; bh=ZN2dmU9yMzb37daxFnC0fhPIFPS+IGzAUpSAv20SgVM=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=ZrN51nmZb9dc/vD08Kkiv5YaVvZ84c+884Usx6HVuSCgvQ9rPVQEcckFFCgXgqVxJWfFHHfmSn1A24fnkpmXFUT0L1gU1iSJcwoZlkb8dKjjqe7sR0lU4lx84rHTR77TaAsJ5FMMcUbIcMvAIDf62/2GhSwQ+YzrGm1DcVg5a9A= ARC-Authentication-Results: i=1; server2.sourceware.org Authentication-Results: mail0.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=f7WPukBa; dkim-atps=neutral Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 64B19240DB4; Tue, 19 Mar 2024 14:58:33 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id mW6cUjqQoVj5; Tue, 19 Mar 2024 14:58:32 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1710856712; bh=ZN2dmU9yMzb37daxFnC0fhPIFPS+IGzAUpSAv20SgVM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=f7WPukBaE9uDMiz2Cl3RmWMmU7Qbh6Gr/blPfSZNT8mTGo1TXWyOaRrMI9JloSsKk m7NAXyr2+mcxcK4ruNHkxYqgJ/dgXSvjnxPZo4sLGS9W1/GQBwjG6KBRstK7R8uW42 xagVJXha39YuAQsAV4GTiUG/pXIpW7nczaw0swZg6+09VArymyIZerhxxz+2heM23W yrw+vPBateOGY2pKQwUrkc75i1w4H0wXyMg3xv4BeegoAAWzmu3OYTVqFXUAhnN3ke yx//vu7aa8q9M80BsN85KVrFS/6w4X4uvjzh/SAheSveFF3y23GxiJ8+gtBSinF8Zt THG6FNK8Pkhrg== Received: from fedora.khirnov.net (ip-244-183.pel.cz [IPv6:2002:b061:f0a:201::d5e2:f4b7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "sasshka SMTP cert", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail0.khirnov.net (Postfix) with ESMTPS id 65B8E2404AF; Tue, 19 Mar 2024 14:58:32 +0100 (CET) Received: from fedora.redhat.com (localhost [IPv6:::1]) by fedora.khirnov.net (Postfix) with ESMTP id F3A6C83363A; Tue, 19 Mar 2024 14:58:31 +0100 (CET) From: =?utf-8?q?Alexandra_H=C3=A1jkov=C3=A1?= To: gdb-patches@sourceware.org Cc: ahajkova@redhat.com Subject: [PATCH v2 2/2] remote.c: Make packet_ok return struct packet_result Date: Tue, 19 Mar 2024 14:58:29 +0100 Message-ID: <20240319135829.662941-2-ahajkova@khirnov.net> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240319135829.662941-1-ahajkova@khirnov.net> References: <20240319135829.662941-1-ahajkova@khirnov.net> MIME-Version: 1.0 X-Spam-Status: No, score=-13.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, JMQ_SPF_NEUTRAL, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org From: Alexandra Hájková This allows to print the error message stored in a packet_result to be easily used in the calling function. --- gdb/remote.c | 199 +++++++++++++++++++++++++-------------------------- 1 file changed, 96 insertions(+), 103 deletions(-) diff --git a/gdb/remote.c b/gdb/remote.c index 8462b7e4e60..95e193ba543 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -765,8 +765,8 @@ struct remote_features /* Check result value in BUF for packet WHICH_PACKET and update the packet's support configuration accordingly. */ - packet_status packet_ok (const char *buf, const int which_packet); - packet_status packet_ok (const gdb::char_vector &buf, const int which_packet); + packet_result packet_ok (const char *buf, const int which_packet); + packet_result packet_ok (const gdb::char_vector &buf, const int which_packet); /* Configuration of a remote target's memory read packet. */ memory_packet_config m_memory_read_packet_config; @@ -2503,7 +2503,7 @@ packet_check_result (const gdb::char_vector &buf, bool accept_msg) return packet_check_result (buf.data (), accept_msg); } -packet_status +packet_result remote_features::packet_ok (const char *buf, const int which_packet) { packet_config *config = &m_protocol_packets[which_packet]; @@ -2549,10 +2549,10 @@ remote_features::packet_ok (const char *buf, const int which_packet) break; } - return result.status (); + return result; } -packet_status +packet_result remote_features::packet_ok (const gdb::char_vector &buf, const int which_packet) { return packet_ok (buf.data (), which_packet); @@ -2739,14 +2739,15 @@ remote_target::remote_query_attached (int pid) putpkt (rs->buf); getpkt (&rs->buf); - switch (m_features.packet_ok (rs->buf, PACKET_qAttached)) + packet_result result = m_features.packet_ok (rs->buf, PACKET_qAttached); + switch (result.status()) { case PACKET_OK: if (strcmp (rs->buf.data (), "1") == 0) return 1; break; case PACKET_ERROR: - warning (_("Remote failure reply: %s"), rs->buf.data ()); + warning (_("Remote failure reply: %s"), result.err_msg()); break; case PACKET_UNKNOWN: break; @@ -3051,7 +3052,6 @@ remote_target::set_syscall_catchpoint (int pid, bool needed, int any_count, gdb::array_view syscall_counts) { const char *catch_packet; - enum packet_status result; int n_sysno = 0; if (m_features.packet_support (PACKET_QCatchSyscalls) == PACKET_DISABLE) @@ -3107,8 +3107,8 @@ remote_target::set_syscall_catchpoint (int pid, bool needed, int any_count, putpkt (catch_packet); getpkt (&rs->buf); - result = m_features.packet_ok (rs->buf, PACKET_QCatchSyscalls); - if (result == PACKET_OK) + packet_result result = m_features.packet_ok (rs->buf, PACKET_QCatchSyscalls); + if (result.status() == PACKET_OK) return 0; else return -1; @@ -5113,7 +5113,8 @@ remote_target::start_remote_1 (int from_tty, int extended_p) { putpkt ("QStartNoAckMode"); getpkt (&rs->buf); - if (m_features.packet_ok (rs->buf, PACKET_QStartNoAckMode) == PACKET_OK) + if ((m_features.packet_ok (rs->buf, PACKET_QStartNoAckMode)).status () + == PACKET_OK) rs->noack_mode = 1; } @@ -5898,9 +5899,10 @@ remote_target::remote_query_supported () /* If an error occurred, warn, but do not return - just reset the buffer to empty and go on to disable features. */ - if (m_features.packet_ok (rs->buf, PACKET_qSupported) == PACKET_ERROR) + packet_result result = m_features.packet_ok (rs->buf, PACKET_qSupported); + if (result.status () == PACKET_ERROR) { - warning (_("Remote failure reply: %s"), rs->buf.data ()); + warning (_("Remote failure reply: %s"), result.err_msg ()); rs->buf[0] = 0; } } @@ -6552,7 +6554,8 @@ extended_remote_target::attach (const char *args, int from_tty) putpkt (rs->buf); getpkt (&rs->buf); - switch (m_features.packet_ok (rs->buf, PACKET_vAttach)) + packet_result result = m_features.packet_ok (rs->buf, PACKET_vAttach); + switch (result.status ()) { case PACKET_OK: if (!target_is_non_stop_p ()) @@ -6568,9 +6571,9 @@ extended_remote_target::attach (const char *args, int from_tty) break; case PACKET_UNKNOWN: error (_("This target does not support attaching to a process")); - default: - error (_("Attaching to %s failed"), - target_pid_to_str (ptid_t (pid)).c_str ()); + case PACKET_ERROR: + error (_("Attaching to %s failed: %s"), + target_pid_to_str (ptid_t (pid)).c_str (), result.err_msg ()); } switch_to_inferior_no_thread (remote_add_inferior (false, pid, 1, 0)); @@ -7493,14 +7496,15 @@ remote_target::remote_interrupt_ns () putpkt (rs->buf); getpkt (&rs->buf); - switch (m_features.packet_ok (rs->buf, PACKET_vCtrlC)) + packet_result result = m_features.packet_ok (rs->buf, PACKET_vCtrlC); + switch (result.status ()) { case PACKET_OK: break; case PACKET_UNKNOWN: error (_("No support for interrupting the remote target.")); case PACKET_ERROR: - error (_("Interrupting target failed: %s"), rs->buf.data ()); + error (_("Interrupting target failed: %s"), result.err_msg ()); } } @@ -8796,7 +8800,8 @@ remote_target::fetch_register_using_p (struct regcache *regcache, buf = rs->buf.data (); - switch (m_features.packet_ok (rs->buf, PACKET_p)) + packet_result result = m_features.packet_ok (rs->buf, PACKET_p); + switch (result.status ()) { case PACKET_OK: break; @@ -8805,7 +8810,7 @@ remote_target::fetch_register_using_p (struct regcache *regcache, case PACKET_ERROR: error (_("Could not fetch register \"%s\"; remote failure reply '%s'"), gdbarch_register_name (regcache->arch (), reg->regnum), - buf); + result.err_msg ()); } /* If this register is unfetchable, tell the regcache. */ @@ -9102,13 +9107,14 @@ remote_target::store_register_using_P (const struct regcache *regcache, putpkt (rs->buf); getpkt (&rs->buf); - switch (m_features.packet_ok (rs->buf, PACKET_P)) + packet_result result = m_features.packet_ok (rs->buf, PACKET_P); + switch (result.status ()) { 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.data ()); + gdbarch_register_name (gdbarch, reg->regnum), result.err_msg ()); case PACKET_UNKNOWN: return 0; default: @@ -10539,7 +10545,7 @@ remote_target::remote_vkill (int pid) putpkt (rs->buf); getpkt (&rs->buf); - switch (m_features.packet_ok (rs->buf, PACKET_vKill)) + switch ((m_features.packet_ok (rs->buf, PACKET_vKill)).status ()) { case PACKET_OK: return 0; @@ -10695,7 +10701,7 @@ remote_target::extended_remote_run (const std::string &args) putpkt (rs->buf); getpkt (&rs->buf); - switch (m_features.packet_ok (rs->buf, PACKET_vRun)) + switch ((m_features.packet_ok (rs->buf, PACKET_vRun)).status ()) { case PACKET_OK: /* We have a wait response. All is well. */ @@ -10802,11 +10808,14 @@ remote_target::extended_remote_set_inferior_cwd () putpkt (rs->buf); getpkt (&rs->buf); - if (m_features.packet_ok (rs->buf, PACKET_QSetWorkingDir) != PACKET_OK) + packet_result result = m_features.packet_ok (rs->buf, PACKET_QSetWorkingDir); + if (result.status () == PACKET_ERROR) error (_("\ Remote replied unexpectedly while setting the inferior's working\n\ directory: %s"), - rs->buf.data ()); + result.err_msg ()); + if (result.status () == PACKET_UNKNOWN) + error (_("Remote target failed to process setting the inferior's working directory")); } } @@ -10975,7 +10984,7 @@ remote_target::insert_breakpoint (struct gdbarch *gdbarch, putpkt (rs->buf); getpkt (&rs->buf); - switch (m_features.packet_ok (rs->buf, PACKET_Z0)) + switch ((m_features.packet_ok (rs->buf, PACKET_Z0)).status ()) { case PACKET_ERROR: return -1; @@ -11076,8 +11085,8 @@ remote_target::insert_watchpoint (CORE_ADDR addr, int len, putpkt (rs->buf); getpkt (&rs->buf); - switch (m_features.packet_ok (rs->buf, (to_underlying (PACKET_Z0) - + to_underlying (packet)))) + switch ((m_features.packet_ok (rs->buf, (to_underlying (PACKET_Z0) + + to_underlying (packet)))).status ()) { case PACKET_ERROR: return -1; @@ -11125,8 +11134,8 @@ remote_target::remove_watchpoint (CORE_ADDR addr, int len, putpkt (rs->buf); getpkt (&rs->buf); - switch (m_features.packet_ok (rs->buf, (to_underlying (PACKET_Z0) - + to_underlying (packet)))) + switch ((m_features.packet_ok (rs->buf, (to_underlying (PACKET_Z0) + + to_underlying (packet)))).status ()) { case PACKET_ERROR: case PACKET_UNKNOWN: @@ -11257,7 +11266,6 @@ remote_target::insert_hw_breakpoint (struct gdbarch *gdbarch, CORE_ADDR addr = bp_tgt->reqstd_address; struct remote_state *rs; char *p, *endbuf; - char *message; if (m_features.packet_support (PACKET_Z1) == PACKET_DISABLE) return -1; @@ -11288,16 +11296,11 @@ remote_target::insert_hw_breakpoint (struct gdbarch *gdbarch, putpkt (rs->buf); getpkt (&rs->buf); - switch (m_features.packet_ok (rs->buf, PACKET_Z1)) + packet_result result = m_features.packet_ok (rs->buf, PACKET_Z1); + switch (result.status ()) { case PACKET_ERROR: - if (rs->buf[1] == '.') - { - message = strchr (&rs->buf[2], '.'); - if (message) - error (_("Remote failure reply: %s"), message + 1); - } - return -1; + error (_("Remote failure reply: %s"), result.err_msg ()); case PACKET_UNKNOWN: return -1; case PACKET_OK: @@ -11335,7 +11338,7 @@ remote_target::remove_hw_breakpoint (struct gdbarch *gdbarch, putpkt (rs->buf); getpkt (&rs->buf); - switch (m_features.packet_ok (rs->buf, PACKET_Z1)) + switch ((m_features.packet_ok (rs->buf, PACKET_Z1)).status ()) { case PACKET_ERROR: case PACKET_UNKNOWN: @@ -11376,7 +11379,7 @@ remote_target::verify_memory (const gdb_byte *data, CORE_ADDR lma, ULONGEST size getpkt (&rs->buf); - status = m_features.packet_ok (rs->buf, PACKET_qCRC); + status = (m_features.packet_ok (rs->buf, PACKET_qCRC)).status (); if (status == PACKET_ERROR) return -1; else if (status == PACKET_OK) @@ -11498,7 +11501,7 @@ remote_target::remote_write_qxfer (const char *object_name, if (putpkt_binary (rs->buf.data (), i + buf_len) < 0 || getpkt (&rs->buf) < 0 - || m_features.packet_ok (rs->buf, which_packet) != PACKET_OK) + || (m_features.packet_ok (rs->buf, which_packet)).status () != PACKET_OK) return TARGET_XFER_E_IO; unpack_varlen_hex (rs->buf.data (), &n); @@ -11563,7 +11566,7 @@ remote_target::remote_read_qxfer (const char *object_name, rs->buf[0] = '\0'; packet_len = getpkt (&rs->buf); if (packet_len < 0 - || m_features.packet_ok (rs->buf, which_packet) != PACKET_OK) + || (m_features.packet_ok (rs->buf, which_packet)).status () != PACKET_OK) return TARGET_XFER_E_IO; if (rs->buf[0] != 'l' && rs->buf[0] != 'm') @@ -11868,7 +11871,8 @@ remote_target::search_memory (CORE_ADDR start_addr, ULONGEST search_space_len, if (putpkt_binary (rs->buf.data (), i + escaped_pattern_len) < 0 || getpkt (&rs->buf) < 0 - || m_features.packet_ok (rs->buf, PACKET_qSearch_memory) != PACKET_OK) + || (m_features.packet_ok (rs->buf, PACKET_qSearch_memory)).status () + != PACKET_OK) { /* The request may not have worked because the command is not supported. If so, fall back to the simple way. */ @@ -12261,7 +12265,6 @@ remote_target::get_thread_local_address (ptid_t ptid, CORE_ADDR lm, struct remote_state *rs = get_remote_state (); char *p = rs->buf.data (); char *endp = p + get_remote_packet_size (); - enum packet_status result; strcpy (p, "qGetTLSAddr:"); p += strlen (p); @@ -12274,15 +12277,15 @@ remote_target::get_thread_local_address (ptid_t ptid, CORE_ADDR lm, putpkt (rs->buf); getpkt (&rs->buf); - result = m_features.packet_ok (rs->buf, PACKET_qGetTLSAddr); - if (result == PACKET_OK) + packet_result result = m_features.packet_ok (rs->buf, PACKET_qGetTLSAddr); + if (result.status () == PACKET_OK) { ULONGEST addr; unpack_varlen_hex (rs->buf.data (), &addr); return addr; } - else if (result == PACKET_UNKNOWN) + else if (result.status () == PACKET_UNKNOWN) throw_error (TLS_GENERIC_ERROR, _("Remote target doesn't support qGetTLSAddr packet")); else @@ -12307,7 +12310,6 @@ remote_target::get_tib_address (ptid_t ptid, CORE_ADDR *addr) struct remote_state *rs = get_remote_state (); char *p = rs->buf.data (); char *endp = p + get_remote_packet_size (); - enum packet_status result; strcpy (p, "qGetTIBAddr:"); p += strlen (p); @@ -12316,8 +12318,8 @@ remote_target::get_tib_address (ptid_t ptid, CORE_ADDR *addr) putpkt (rs->buf); getpkt (&rs->buf); - result = m_features.packet_ok (rs->buf, PACKET_qGetTIBAddr); - if (result == PACKET_OK) + packet_result result = m_features.packet_ok (rs->buf, PACKET_qGetTIBAddr); + if (result.status () == PACKET_OK) { ULONGEST val; unpack_varlen_hex (rs->buf.data (), &val); @@ -12325,10 +12327,11 @@ remote_target::get_tib_address (ptid_t ptid, CORE_ADDR *addr) *addr = (CORE_ADDR) val; return true; } - else if (result == PACKET_UNKNOWN) + else if (result.status () == PACKET_UNKNOWN) error (_("Remote target doesn't support qGetTIBAddr packet")); else - error (_("Remote target failed to process qGetTIBAddr request")); + error (_("Remote target failed to process qGetTIBAddr request, %s"), + result.err_msg ()); } else error (_("qGetTIBAddr not supported or disabled on this target")); @@ -12584,7 +12587,7 @@ remote_target::remote_hostio_send_command (int command_bytes, int which_packet, return -1; } - switch (m_features.packet_ok (rs->buf, which_packet)) + switch ((m_features.packet_ok (rs->buf, which_packet)).status ()) { case PACKET_ERROR: *remote_errno = FILEIO_EINVAL; @@ -13872,7 +13875,6 @@ remote_target::get_trace_status (struct trace_status *ts) { /* Initialize it just to avoid a GCC false warning. */ char *p = NULL; - enum packet_status result; struct remote_state *rs = get_remote_state (); if (m_features.packet_support (PACKET_qTStatus) == PACKET_DISABLE) @@ -13898,11 +13900,16 @@ remote_target::get_trace_status (struct trace_status *ts) throw; } - result = m_features.packet_ok (p, PACKET_qTStatus); + packet_result result = m_features.packet_ok (p, PACKET_qTStatus); - /* If the remote target doesn't do tracing, flag it. */ - if (result == PACKET_UNKNOWN) - return -1; + switch (result.status ()) + { + case PACKET_ERROR: + error (_("Remote failure reply: %s"), result.err_msg ()); + /* If the remote target doesn't do tracing, flag it. */ + case PACKET_UNKNOWN: + return -1; + } /* We're working with a live target. */ ts->filename = NULL; @@ -14252,7 +14259,6 @@ remote_target::set_trace_buffer_size (LONGEST val) struct remote_state *rs = get_remote_state (); char *buf = rs->buf.data (); char *endbuf = buf + get_remote_packet_size (); - enum packet_status result; gdb_assert (val >= 0 || val == -1); buf += xsnprintf (buf, endbuf - buf, "QTBuffer:size:"); @@ -14267,10 +14273,15 @@ remote_target::set_trace_buffer_size (LONGEST val) putpkt (rs->buf); remote_get_noisy_reply (); - result = m_features.packet_ok (rs->buf, PACKET_QTBuffer_size); - - if (result != PACKET_OK) - warning (_("Bogus reply from target: %s"), rs->buf.data ()); + packet_result result = m_features.packet_ok (rs->buf, PACKET_QTBuffer_size); + switch (result.status ()) + { + case PACKET_ERROR: + warning (_("Bogus reply from target: %s"), result.err_msg ()); + break; + case PACKET_UNKNOWN: + warning (_("Remote target failed to process the request ")); + } } } @@ -14696,14 +14707,9 @@ remote_target::btrace_sync_conf (const btrace_config *conf) putpkt (buf); getpkt (&rs->buf); - if (m_features.packet_ok (buf, PACKET_Qbtrace_conf_bts_size) - == PACKET_ERROR) - { - if (buf[0] == 'E' && buf[1] == '.') - error (_("Failed to configure the BTS buffer size: %s"), buf + 2); - else - error (_("Failed to configure the BTS buffer size.")); - } + packet_result result = m_features.packet_ok (buf, PACKET_Qbtrace_conf_bts_size); + if (result.status () == PACKET_ERROR) + error (_("Failed to configure the BTS buffer size: %s"), result.err_msg ()); rs->btrace_config.bts.size = conf->bts.size; } @@ -14719,14 +14725,9 @@ remote_target::btrace_sync_conf (const btrace_config *conf) putpkt (buf); getpkt (&rs->buf); - if (m_features.packet_ok (buf, PACKET_Qbtrace_conf_pt_size) - == PACKET_ERROR) - { - if (buf[0] == 'E' && buf[1] == '.') - error (_("Failed to configure the trace buffer size: %s"), buf + 2); - else - error (_("Failed to configure the trace buffer size.")); - } + packet_result result = m_features.packet_ok (buf, PACKET_Qbtrace_conf_pt_size); + if (result.status () == PACKET_ERROR) + error (_("Failed to configure the trace buffer size: %s"), result.err_msg ()); rs->btrace_config.pt.size = conf->pt.size; } @@ -14841,15 +14842,10 @@ remote_target::enable_btrace (thread_info *tp, putpkt (rs->buf); getpkt (&rs->buf); - if (m_features.packet_ok (rs->buf, which_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).c_str (), &rs->buf[2]); - else - error (_("Could not enable branch tracing for %s."), - target_pid_to_str (ptid).c_str ()); - } + packet_result result = m_features.packet_ok (rs->buf, which_packet); + if (result.status () == PACKET_ERROR) + error (_("Could not enable branch tracing for %s: %s"), + target_pid_to_str (ptid).c_str (), result.err_msg ()); btrace_target_info *tinfo = new btrace_target_info { ptid }; @@ -14887,15 +14883,10 @@ remote_target::disable_btrace (struct btrace_target_info *tinfo) putpkt (rs->buf); getpkt (&rs->buf); - if (m_features.packet_ok (rs->buf, PACKET_Qbtrace_off) == PACKET_ERROR) - { - if (rs->buf[0] == 'E' && rs->buf[1] == '.') + packet_result result = m_features.packet_ok (rs->buf, PACKET_Qbtrace_off); + if (result.status () == PACKET_ERROR) error (_("Could not disable branch tracing for %s: %s"), - target_pid_to_str (tinfo->ptid).c_str (), &rs->buf[2]); - else - error (_("Could not disable branch tracing for %s."), - target_pid_to_str (tinfo->ptid).c_str ()); - } + target_pid_to_str (tinfo->ptid).c_str (), result.err_msg ()); delete tinfo; } @@ -15160,7 +15151,8 @@ remote_target::thread_events (int enable) putpkt (rs->buf); getpkt (&rs->buf); - switch (m_features.packet_ok (rs->buf, PACKET_QThreadEvents)) + packet_result result = m_features.packet_ok (rs->buf, PACKET_QThreadEvents); + switch (result.status ()) { case PACKET_OK: if (strcmp (rs->buf.data (), "OK") != 0) @@ -15168,7 +15160,7 @@ remote_target::thread_events (int enable) rs->last_thread_events = enable; break; case PACKET_ERROR: - warning (_("Remote failure reply: %s"), rs->buf.data ()); + warning (_("Remote failure reply: %s"), result.err_msg ()); break; case PACKET_UNKNOWN: break; @@ -15215,14 +15207,15 @@ remote_target::commit_requested_thread_options () putpkt (rs->buf); getpkt (&rs->buf, 0); - switch (m_features.packet_ok (rs->buf, PACKET_QThreadOptions)) + packet_result result = m_features.packet_ok (rs->buf, PACKET_QThreadOptions); + switch (result.status ()) { case PACKET_OK: if (strcmp (rs->buf.data (), "OK") != 0) error (_("Remote refused setting thread options: %s"), rs->buf.data ()); break; case PACKET_ERROR: - error (_("Remote failure reply: %s"), rs->buf.data ()); + error (_("Remote failure reply: %s"), result.err_msg ()); case PACKET_UNKNOWN: gdb_assert_not_reached ("PACKET_UNKNOWN"); break;