From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12822 invoked by alias); 4 Mar 2013 17:07:26 -0000 Received: (qmail 12664 invoked by uid 22791); 4 Mar 2013 17:07:19 -0000 X-SWARE-Spam-Status: No, hits=-7.8 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_SPAMHAUS_DROP,KHOP_THREADED,RCVD_IN_DNSWL_HI,RCVD_IN_HOSTKARMA_W,RP_MATCHES_RCVD,TW_CP,TW_QB,TW_XS,TW_XZ X-Spam-Check-By: sourceware.org Received: from mga03.intel.com (HELO mga03.intel.com) (143.182.124.21) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 04 Mar 2013 17:06:23 +0000 Received: from azsmga001.ch.intel.com ([10.2.17.19]) by azsmga101.ch.intel.com with ESMTP; 04 Mar 2013 09:06:22 -0800 X-ExtLoop1: 1 Received: from swsutil001.isw.intel.com ([10.237.237.11]) by azsmga001.ch.intel.com with ESMTP; 04 Mar 2013 09:06:20 -0800 Received: from ulslx001.iul.intel.com (ulslx001.iul.intel.com [172.28.207.63]) by swsutil001.isw.intel.com (8.13.6/8.13.6/MailSET/Hub) with ESMTP id r24H6DrF004086; Mon, 4 Mar 2013 17:06:14 GMT Received: from ulslx001.iul.intel.com (localhost [127.0.0.1]) by ulslx001.iul.intel.com with ESMTP id r24H6DJL020075; Mon, 4 Mar 2013 18:06:13 +0100 Received: (from mmetzger@localhost) by ulslx001.iul.intel.com with id r24H6DvU020071; Mon, 4 Mar 2013 18:06:13 +0100 From: Markus Metzger To: jan.kratochvil@redhat.com Cc: gdb-patches@sourceware.org, markus.t.metzger@gmail.com, Pedro Alves Subject: [patch v9 10/23] remote, btrace: add branch tracing protocol to Qbtrace packet Date: Mon, 04 Mar 2013 17:07:00 -0000 Message-Id: <1362416770-19750-11-git-send-email-markus.t.metzger@intel.com> In-Reply-To: <1362416770-19750-1-git-send-email-markus.t.metzger@intel.com> References: <1362416770-19750-1-git-send-email-markus.t.metzger@intel.com> X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2013-03/txt/msg00098.txt.bz2 We might want to add support for LBR branch tracing in the future. To prepare for this, I would specify the branch trace recording method in the Qbtrace packet when requesting branch tracing. Similar to qXfer, I am adding separate packets for each recording method plus one packet to disable tracing. The currently supported packets are: Qbtrace:off Qbtrace:bts CC: Pedro Alves 2013-03-04 Markus Metzger --- gdb/doc/gdb.texinfo | 18 +++++++++--- gdb/gdbserver/server.c | 7 +++-- gdb/remote.c | 69 +++++++++++++++++++++++++---------------------- 3 files changed, 54 insertions(+), 40 deletions(-) diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 5ac450c..337675c 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -37321,7 +37321,12 @@ These are the currently defined stub features and their properties: @tab @samp{-} @tab Yes -@item @samp{Qbtrace} +@item @samp{Qbtrace:off} +@tab Yes +@tab @samp{-} +@tab Yes + +@item @samp{Qbtrace:bts} @tab Yes @tab @samp{-} @tab Yes @@ -37562,8 +37567,11 @@ rather than reporting the hit to @value{GDBN}. @item qbtrace The remote stub understands the @samp{qbtrace} packet. -@item Qbtrace -The remote stub understands the @samp{Qbtrace} packet. +@item Qbtrace:off +The remote stub understands the @samp{Qbtrace:off} packet. + +@item Qbtrace:bts +The remote stub understands the @samp{Qbtrace:bts} packet. @end table @@ -37942,8 +37950,8 @@ No new branch trace data is available. A badly formed request or an error was encountered. @end table -@item Qbtrace:on -Enable branch tracing for the current thread. +@item Qbtrace:bts +Enable branch tracing for the current thread using bts tracing. Reply: @table @samp diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index e755ba0..00cac8e 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -463,12 +463,12 @@ handle_btrace_general_set (char *own_buf) err = NULL; - if (strcmp (op, "on") == 0) + if (strcmp (op, "bts") == 0) err = handle_btrace_enable (thread); else if (strcmp (op, "off") == 0) err = handle_btrace_disable (thread); else - err = "E.Bad Qbtrace operation. Use on or off."; + err = "E.Bad Qbtrace operation. Use bts or off."; if (err != 0) strcpy (own_buf, err); @@ -1828,7 +1828,8 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p) if (target_supports_btrace ()) { strcat (own_buf, ";qbtrace+"); - strcat (own_buf, ";Qbtrace+"); + strcat (own_buf, ";Qbtrace:bts+"); + strcat (own_buf, ";Qbtrace:off+"); strcat (own_buf, ";qXfer:btrace:read+"); } diff --git a/gdb/remote.c b/gdb/remote.c index 787c596..2365713 100755 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -1286,7 +1286,8 @@ enum { PACKET_QDisableRandomization, PACKET_QAgent, PACKET_qbtrace, - PACKET_Qbtrace, + PACKET_Qbtrace_off, + PACKET_Qbtrace_bts, PACKET_qXfer_btrace, PACKET_MAX }; @@ -4000,7 +4001,8 @@ static struct protocol_feature remote_protocol_features[] = { { "tracenz", PACKET_DISABLE, remote_string_tracing_feature, -1 }, { "qbtrace", PACKET_DISABLE, remote_supported_packet, PACKET_qbtrace }, - { "Qbtrace", PACKET_DISABLE, remote_supported_packet, PACKET_Qbtrace }, + { "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 } }; @@ -11140,7 +11142,9 @@ remote_supports_btrace (void) { if (remote_protocol_packets[PACKET_qbtrace].support != PACKET_ENABLE) return 0; - if (remote_protocol_packets[PACKET_Qbtrace].support != PACKET_ENABLE) + if (remote_protocol_packets[PACKET_Qbtrace_off].support != PACKET_ENABLE) + return 0; + if (remote_protocol_packets[PACKET_Qbtrace_bts].support != PACKET_ENABLE) return 0; if (remote_protocol_packets[PACKET_qXfer_btrace].support != PACKET_ENABLE) return 0; @@ -11148,12 +11152,13 @@ remote_supports_btrace (void) return 1; } -/* Send the Qbtrace packet and check the response. */ +/* Enable branch tracing. */ -static void -send_Qbtrace (ptid_t ptid, int enable) +static struct btrace_target_info * +remote_enable_btrace (ptid_t ptid) { - struct packet_config *packet = &remote_protocol_packets[PACKET_Qbtrace]; + 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 (); @@ -11163,31 +11168,13 @@ send_Qbtrace (ptid_t ptid, int enable) set_general_thread (ptid); - buf += xsnprintf (buf, endbuf - buf, "%s:", packet->name); - buf += xsnprintf (buf, endbuf - buf, enable ? "on" : "off"); + 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 (enable != 0) - error (_("Could not enable branch tracing for %s: %s"), - target_pid_to_str (ptid), rs->buf); - else - error (_("Could not disable branch tracing for %s: %s"), - target_pid_to_str (ptid), rs->buf); - } -} - -/* Enable branch tracing. */ - -static struct btrace_target_info * -remote_enable_btrace (ptid_t ptid) -{ - struct btrace_target_info *tinfo = NULL; - - /* This will throw an error if enabling failed. */ - send_Qbtrace (ptid, 1); + error (_("Could not enable branch tracing for %s: %s"), + target_pid_to_str (ptid), rs->buf); tinfo = xzalloc (sizeof (*tinfo)); tinfo->ptid = ptid; @@ -11200,8 +11187,23 @@ remote_enable_btrace (ptid_t ptid) static void remote_disable_btrace (struct btrace_target_info *tinfo) { - /* This will throw an error if disabling failed. */ - send_Qbtrace (tinfo->ptid, 0); + 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->support != 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) + error (_("Could not disable branch tracing for %s: %s"), + target_pid_to_str (tinfo->ptid), rs->buf); xfree (tinfo); } @@ -11927,8 +11929,11 @@ Show the maximum size of the address (in bits) in a memory packet."), NULL, add_packet_config_cmd (&remote_protocol_packets[PACKET_qbtrace], "qbtrace", "query-btrace", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_Qbtrace], - "Qbtrace", "enable-btrace", 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); -- 1.7.1