From patchwork Thu Apr 30 12:05:40 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gary Benson X-Patchwork-Id: 6505 Received: (qmail 116081 invoked by alias); 30 Apr 2015 12:15:28 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 116063 invoked by uid 89); 30 Apr 2015 12:15:27 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.6 required=5.0 tests=AWL, BAYES_00, KAM_LAZY_DOMAIN_SECURITY, SPF_HELO_PASS, T_RP_MATCHES_RCVD autolearn=no version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Thu, 30 Apr 2015 12:15:26 +0000 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 02BEE91752; Thu, 30 Apr 2015 12:05:51 +0000 (UTC) Received: from blade.nx (ovpn-116-76.ams2.redhat.com [10.36.116.76]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t3UC5nR1021528; Thu, 30 Apr 2015 08:05:50 -0400 Received: from blade.nx (localhost [127.0.0.1]) by blade.nx (Postfix) with ESMTP id 143C8263E8A; Thu, 30 Apr 2015 13:05:48 +0100 (BST) From: Gary Benson To: gdb-patches@sourceware.org Cc: Eli Zaretskii , Pedro Alves , Doug Evans , =?UTF-8?q?Iago=20L=C3=B3pez=20Galeiras?= Subject: [PATCH 7/9 v2] Implement multiple-filesystem support for remote targets Date: Thu, 30 Apr 2015 13:05:40 +0100 Message-Id: <1430395542-16017-8-git-send-email-gbenson@redhat.com> In-Reply-To: <1429186791-6867-1-git-send-email-gbenson@redhat.com> References: <1429186791-6867-1-git-send-email-gbenson@redhat.com> X-IsSubscribed: yes This commit allows GDB to access executables and shared libraries on remote targets where the remote stub does not share a common filesystem with the inferior(s). A new packet "vFile:setfs" is added to the remote protocol and the three remote hostio functions with filename arguments are modified to send "vFile:setfs" packets as necessary. gdb/ChangeLog: * remote.c (struct remote_state) : New field. (new_remote_state): Initialize the above. (PACKET_vFile_setfs): New enum value. (remote_hostio_set_filesystem): New function. (remote_hostio_open): Call the above. (remote_hostio_unlink): Likewise. (remote_hostio_readlink): Likewise. (_initialize_remote): Register new "set/show remote hostio-setfs-packet" command. * NEWS: Announce new vFile:setfs packet. gdb/doc/ChangeLog: * gdb.texinfo (Remote Configuration): Document the "set/show remote hostio-setfs-packet" command. (Host I/O Packets): Document the vFile:setfs packet. --- gdb/ChangeLog | 13 +++++++++++ gdb/NEWS | 6 +++++ gdb/doc/ChangeLog | 6 +++++ gdb/doc/gdb.texinfo | 18 ++++++++++++++++ gdb/remote.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 100 insertions(+), 0 deletions(-) diff --git a/gdb/NEWS b/gdb/NEWS index 1c0e5ea..b4ce282 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -126,6 +126,12 @@ qXfer:exec-file:read Return the full absolute name of the file that was executed to create a process running on the remote system. +vFile:setfs: + Select the filesystem on which vFile: operations with filename + arguments will operate. This is required for GDB to be able to + access files on remote targets where the remote stub does not + share a common filesystem with the inferior(s). + * The info record command now shows the recording format and the branch tracing configuration for the current thread when using the btrace record target. diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 9e2787d..d684579 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -19890,6 +19890,10 @@ are: @tab @code{vFile:fstat} @tab Host I/O +@item @code{hostio-setfs-packet} +@tab @code{vFile:setfs} +@tab Host I/O + @item @code{noack-packet} @tab @code{QStartNoAckMode} @tab Packet acknowledgment @@ -37591,6 +37595,20 @@ attachment (i.e.@: a trailing semicolon). The return value is the number of target bytes read; the binary attachment may be longer if some characters were escaped. +@item vFile:setfs: @var{pid} +Select the filesystem on which @code{vFile} operations with +@var{filename} arguments will operate. This is required for +@value{GDBN} to be able to access files on remote targets where +the remote stub does not share a common filesystem with the +inferior(s). + +If @var{pid} is nonzero, select the filesystem as seen by process +@var{pid}. If @var{pid} is zero, select the filesystem as seen by +the remote stub. Return 0 on success, or -1 if an error occurs. +If @code{vFile:setfs:} indicates success, the selected filesystem +remains selected until the next successful @code{vFile:setfs:} +operation. + @end table @node Interrupts diff --git a/gdb/remote.c b/gdb/remote.c index 330fbeb..ddb6cf6 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -367,6 +367,12 @@ struct remote_state /* The branch trace configuration. */ struct btrace_config btrace_config; + + /* The argument to the last "vFile:setfs:" packet we sent, used + to avoid sending repeated unnecessary "vFile:setfs:" packets. + Initialized to -1 to indicate that no "vFile:setfs:" packet + has yet been sent. */ + int fs_pid; }; /* Private data that we'll store in (struct thread_info)->private. */ @@ -409,6 +415,7 @@ new_remote_state (void) result->buf = xmalloc (result->buf_size); result->remote_traceframe_number = -1; result->last_sent_signal = GDB_SIGNAL_0; + result->fs_pid = -1; return result; } @@ -1243,6 +1250,7 @@ enum { PACKET_Z2, PACKET_Z3, PACKET_Z4, + PACKET_vFile_setfs, PACKET_vFile_open, PACKET_vFile_pread, PACKET_vFile_pwrite, @@ -9879,6 +9887,43 @@ remote_hostio_send_command (int command_bytes, int which_packet, return ret; } +/* Set the filesystem remote_hostio functions that take FILENAME + arguments will use. Return 0 on success, or -1 if an error + occurs (and set *REMOTE_ERRNO). */ + +static int +remote_hostio_set_filesystem (struct inferior *inf, int *remote_errno) +{ + struct remote_state *rs = get_remote_state (); + int required_pid = (inf == NULL || inf->fake_pid_p) ? 0 : inf->pid; + char *p = rs->buf; + int left = get_remote_packet_size () - 1; + char arg[9]; + int ret; + + if (packet_support (PACKET_vFile_setfs) == PACKET_DISABLE) + return 0; + + if (rs->fs_pid != -1 && required_pid == rs->fs_pid) + return 0; + + remote_buffer_add_string (&p, &left, "vFile:setfs:"); + + xsnprintf (arg, sizeof (arg), "%x", required_pid); + remote_buffer_add_string (&p, &left, arg); + + ret = remote_hostio_send_command (p - rs->buf, PACKET_vFile_setfs, + remote_errno, NULL, NULL); + + if (packet_support (PACKET_vFile_setfs) == PACKET_DISABLE) + return 0; + + if (ret == 0) + rs->fs_pid = required_pid; + + return ret; +} + /* Implementation of to_fileio_open. */ static int @@ -9890,6 +9935,9 @@ remote_hostio_open (struct target_ops *self, char *p = rs->buf; int left = get_remote_packet_size () - 1; + if (remote_hostio_set_filesystem (inf, remote_errno) != 0) + return -1; + remote_buffer_add_string (&p, &left, "vFile:open:"); remote_buffer_add_bytes (&p, &left, (const gdb_byte *) filename, @@ -9999,6 +10047,9 @@ remote_hostio_unlink (struct target_ops *self, char *p = rs->buf; int left = get_remote_packet_size () - 1; + if (remote_hostio_set_filesystem (inf, remote_errno) != 0) + return -1; + remote_buffer_add_string (&p, &left, "vFile:unlink:"); remote_buffer_add_bytes (&p, &left, (const gdb_byte *) filename, @@ -10023,6 +10074,9 @@ remote_hostio_readlink (struct target_ops *self, int read_len; char *ret; + if (remote_hostio_set_filesystem (inf, remote_errno) != 0) + return NULL; + remote_buffer_add_string (&p, &left, "vFile:readlink:"); remote_buffer_add_bytes (&p, &left, (const gdb_byte *) filename, @@ -12355,6 +12409,9 @@ Show the maximum size of the address (in bits) in a memory packet."), NULL, add_packet_config_cmd (&remote_protocol_packets[PACKET_qTStatus], "qTStatus", "trace-status", 0); + add_packet_config_cmd (&remote_protocol_packets[PACKET_vFile_setfs], + "vFile:setfs", "hostio-setfs", 0); + add_packet_config_cmd (&remote_protocol_packets[PACKET_vFile_open], "vFile:open", "hostio-open", 0);