From patchwork Tue Mar 19 13:58:28 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: 87355 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 3B029385840E for ; Tue, 19 Mar 2024 13:59:06 +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 DB9433858D1E for ; Tue, 19 Mar 2024 13:58:35 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org DB9433858D1E 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 DB9433858D1E 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=1710856717; cv=none; b=r0t7Ta84Z3oAlYhXSxKXyLsE88pUQsr5MGFoyKHfpuCXo/htusLtdCsBsP/AoqE7DlvEu+spB3HylISO3i54yNy8eqip2+3As+6LOAGHYR1aTpxiyZvJE4LMxSGgNxcEuQHGthK5xDv3Kff927NQNxmBHKLY4a2btsuj0Gnc73I= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1710856717; c=relaxed/simple; bh=0CAKUWRL3taTPKr/junzZltmK70yz+Uex5pox06DES8=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=Q5qKOpNbzytaRgK7rVce/spnWYOFeIchllGOWEvsoMsmtV4B9scnHv2v51KpPhnFozst5keA4qsKoo1K9zgk3ExSghoUNyjtq81Nl+qh2nv7fkQvVso+OeluGPKUUWWTLtlP80kvMyYtdZ6HdZPOvYyJupqUq5YxG3E5o4gABmk= 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=KViwdelQ; dkim-atps=neutral Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 16888240DAC; Tue, 19 Mar 2024 14:58:32 +0100 (CET) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id Bv7lNuPCpogV; Tue, 19 Mar 2024 14:58:31 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1710856711; bh=0CAKUWRL3taTPKr/junzZltmK70yz+Uex5pox06DES8=; h=From:To:Cc:Subject:Date:From; b=KViwdelQ9/HM0TSr2+7dojPh2k2dGNOt/Owo0V49ycq+LKtvsC4V4D3CPgixHh8iC iiTWAtY8ky0R/XRioG33vMRh+nKJqjltkL1PA1TZiZ5KylXy2GeybH+iYYzpPo5XsZ uI5Ov5LpXd0GFHgcmtWevzcUP/KRPSjH/XJgp/A6aw/qveH3z2oBEy7nOUzCKOR7Z2 QdWwyQ8ZOUnbEy5AVOp5ImbHVXH/6JNvgE+wk40eyRvqeBKvlJWQJNOttCZca6yFRo tktJl+D2rjB/lmu/8f71yEVM2gFJk+sW9LJYhvD55bGUqpOC/2176ZW/xYkqn26Qu4 PlQtDWucETcyA== 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 7114B2404AF; Tue, 19 Mar 2024 14:58:31 +0100 (CET) Received: from fedora.redhat.com (localhost [IPv6:::1]) by fedora.khirnov.net (Postfix) with ESMTP id 0E0A4833638; 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 1/2] remote.c: Use packet_check_result Date: Tue, 19 Mar 2024 14:58:28 +0100 Message-ID: <20240319135829.662941-1-ahajkova@khirnov.net> X-Mailer: git-send-email 2.44.0 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á when processing the GDBserver reply to qRcmd packet. Print error message or the error code. Currently, when qRcmd request returns an error, GDB just prints: Protocol error with Rcmd After this change, GDB will also print the error code: Protocol error with Rcmd: 01. Add an accept_msg argument to packet_check result. qRcmd request (such as many other packets) does not recognise "E.msg" form as an error right now. We want to recognise "E.msg" as an error response only for the packets where it's documented. --- gdb/remote.c | 75 +++++++++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 33 deletions(-) diff --git a/gdb/remote.c b/gdb/remote.c index 14c8b020b1e..8462b7e4e60 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -2451,11 +2451,15 @@ add_packet_config_cmd (const unsigned int which_packet, const char *name, } } -/* Check GDBserver's reply packet. Return packet_result - structure which contains the packet_status enum - and an error message for the PACKET_ERROR case. */ +/* Check GDBserver's reply packet. Return packet_result structure + which contains the packet_status enum and an error message for the + PACKET_ERROR case. + + An error packet can always take the form Exx (where xx is a hex + code). When ACCEPT_MSG is true error messages can also take the + form E.msg (where msg is any arbitrary string). */ static packet_result -packet_check_result (const char *buf) +packet_check_result (const char *buf, bool accept_msg) { if (buf[0] != '\0') { @@ -2467,14 +2471,20 @@ packet_check_result (const char *buf) /* "Enn" - definitely an error. */ return { PACKET_ERROR, buf + 1 }; - /* Always treat "E." as an error. This will be used for - more verbose error messages, such as E.memtypes. */ - if (buf[0] == 'E' && buf[1] == '.') + /* Not every request accepts an error in a E.msg form. + Some packets accepts only Enn, in this case E. is not + defined and E. is treated as PACKET_OK. */ + if (accept_msg) { - if (buf[2] != '\0') - return { PACKET_ERROR, buf + 2 }; - else - return { PACKET_ERROR, "no error provided" }; + /* Always treat "E." as an error. This will be used for + more verbose error messages, such as E.memtypes. */ + if (buf[0] == 'E' && buf[1] == '.') + { + if (buf[2] != '\0') + return { PACKET_ERROR, buf + 2 }; + else + return { PACKET_ERROR, "no error provided" }; + } } /* The packet may or may not be OK. Just assume it is. */ @@ -2488,9 +2498,9 @@ packet_check_result (const char *buf) } static packet_result -packet_check_result (const gdb::char_vector &buf) +packet_check_result (const gdb::char_vector &buf, bool accept_msg) { - return packet_check_result (buf.data ()); + return packet_check_result (buf.data (), accept_msg); } packet_status @@ -2503,7 +2513,7 @@ remote_features::packet_ok (const char *buf, const int which_packet) && config->support == PACKET_DISABLE) internal_error (_("packet_ok: attempt to use a disabled packet")); - packet_result result = packet_check_result (buf); + packet_result result = packet_check_result (buf, true); switch (result.status ()) { case PACKET_OK: @@ -8831,7 +8841,7 @@ remote_target::send_g_packet () xsnprintf (rs->buf.data (), get_remote_packet_size (), "g"); putpkt (rs->buf); getpkt (&rs->buf); - packet_result result = packet_check_result (rs->buf); + packet_result result = packet_check_result (rs->buf, true); if (result.status () == PACKET_ERROR) error (_("Could not read registers; remote failure reply '%s'"), result.err_msg ()); @@ -9140,7 +9150,7 @@ remote_target::store_registers_using_G (const struct regcache *regcache) bin2hex (regs, p, rsa->sizeof_g_packet); putpkt (rs->buf); getpkt (&rs->buf); - packet_result pkt_status = packet_check_result (rs->buf); + packet_result pkt_status = packet_check_result (rs->buf, true); if (pkt_status.status () == PACKET_ERROR) error (_("Could not write registers; remote failure reply '%s'"), pkt_status.err_msg ()); @@ -9748,7 +9758,7 @@ remote_target::remote_send_printf (const char *format, ...) rs->buf[0] = '\0'; getpkt (&rs->buf); - return packet_check_result (rs->buf).status (); + return packet_check_result (rs->buf, true).status (); } /* Flash writing can take quite some time. We'll set @@ -11931,20 +11941,19 @@ remote_target::rcmd (const char *command, struct ui_file *outbuf) continue; } buf = rs->buf.data (); - if (buf[0] == '\0') - error (_("Target does not support this command.")); if (buf[0] == 'O' && buf[1] != 'K') { remote_console_output (buf + 1); /* 'O' message from stub. */ continue; } - if (strcmp (buf, "OK") == 0) + packet_result result = packet_check_result (buf, false); + if (result.status () == PACKET_OK) break; - if (strlen (buf) == 3 && buf[0] == 'E' - && isxdigit (buf[1]) && isxdigit (buf[2])) - { - error (_("Protocol error with Rcmd")); - } + else if (result.status () == PACKET_UNKNOWN) + error (_("Target does not support this command.")); + else + error (_("Protocol error with Rcmd: %s."), result.err_msg ()); + for (p = buf; p[0] != '\0' && p[1] != '\0'; p += 2) { char c = (fromhex (p[0]) << 4) + fromhex (p[1]); @@ -15571,7 +15580,7 @@ remote_target::store_memtags (CORE_ADDR address, size_t len, getpkt (&rs->buf); /* Verify if the request was successful. */ - return packet_check_result (rs->buf).status () == PACKET_OK; + return (packet_check_result (rs->buf, true).status () == PACKET_OK); } /* Return true if remote target T is non-stop. */ @@ -15672,26 +15681,26 @@ static void test_packet_check_result () { std::string buf = "E.msg"; - packet_result result = packet_check_result (buf.data ()); + packet_result result = packet_check_result (buf.data (), true); SELF_CHECK (result.status () == PACKET_ERROR); SELF_CHECK (strcmp(result.err_msg (), "msg") == 0); - result = packet_check_result ("E01"); + result = packet_check_result ("E01", true); SELF_CHECK (result.status () == PACKET_ERROR); SELF_CHECK (strcmp(result.err_msg (), "01") == 0); - SELF_CHECK (packet_check_result ("E1").status () == PACKET_OK); + SELF_CHECK (packet_check_result ("E1", true).status () == PACKET_OK); - SELF_CHECK (packet_check_result ("E000").status () == PACKET_OK); + SELF_CHECK (packet_check_result ("E000", true).status () == PACKET_OK); - result = packet_check_result ("E."); + result = packet_check_result ("E.", true); SELF_CHECK (result.status () == PACKET_ERROR); SELF_CHECK (strcmp(result.err_msg (), "no error provided") == 0); - SELF_CHECK (packet_check_result ("some response").status () == PACKET_OK); + SELF_CHECK (packet_check_result ("some response", true).status () == PACKET_OK); - SELF_CHECK (packet_check_result ("").status () == PACKET_UNKNOWN); + SELF_CHECK (packet_check_result ("", true).status () == PACKET_UNKNOWN); } } // namespace selftests #endif /* GDB_SELF_TEST */