From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11032 invoked by alias); 13 Dec 2013 18:43:43 -0000 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 Received: (qmail 11022 invoked by uid 89); 13 Dec 2013 18:43:43 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.5 required=5.0 tests=AWL,BAYES_00,RP_MATCHES_RCVD,SPF_HELO_PASS,SPF_PASS autolearn=ham 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 ESMTP; Fri, 13 Dec 2013 18:43:42 +0000 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id rBDIhetx003358 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 13 Dec 2013 13:43:40 -0500 Received: from [127.0.0.1] (ovpn01.gateway.prod.ext.ams2.redhat.com [10.39.146.11]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id rBDIhcW7012613; Fri, 13 Dec 2013 13:43:39 -0500 Message-ID: <52AB555A.3070301@redhat.com> Date: Fri, 13 Dec 2013 18:43:00 -0000 From: Pedro Alves User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130625 Thunderbird/17.0.7 MIME-Version: 1.0 To: Markus Metzger CC: jan.kratochvil@redhat.com, gdb-patches@sourceware.org Subject: Re: [patch v8 17/24] record-btrace: provide xfer_partial target method References: <1386839747-8860-1-git-send-email-markus.t.metzger@intel.com> <1386839747-8860-18-git-send-email-markus.t.metzger@intel.com> In-Reply-To: <1386839747-8860-18-git-send-email-markus.t.metzger@intel.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-SW-Source: 2013-12/txt/msg00539.txt.bz2 On 12/12/2013 09:15 AM, Markus Metzger wrote: > Provide the xfer_partial target method for the btrace record target. > > Only allow memory accesses to readonly memory while we're replaying. > > 2013-12-12 Markus Metzger > > * record-btrace.c (record_btrace_xfer_partial): New. > (init_record_btrace_ops): Initialize xfer_partial. > > > --- > gdb/record-btrace.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 51 insertions(+) > > diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c > index cf30e17..ec99ba2 100644 > --- a/gdb/record-btrace.c > +++ b/gdb/record-btrace.c > @@ -753,6 +753,56 @@ record_btrace_is_replaying (void) > return 0; > } > > +/* The to_xfer_partial method of target record-btrace. */ > + > +static LONGEST > +record_btrace_xfer_partial (struct target_ops *ops, enum target_object object, > + const char *annex, gdb_byte *readbuf, > + const gdb_byte *writebuf, ULONGEST offset, > + LONGEST len) > +{ > + struct target_ops *t; > + > + /* Filter out requests that don't make sense during replay. */ This allows writes to pass through? > + if (record_btrace_is_replaying ()) > + { > + switch (object) > + { > + case TARGET_OBJECT_MEMORY: > + case TARGET_OBJECT_RAW_MEMORY: > + case TARGET_OBJECT_STACK_MEMORY: I don't think we actually ever see TARGET_OBJECT_RAW_MEMORY and TARGET_OBJECT_STACK_MEMORY here? Those are supposedly handled by target.c, and translated to TARGET_OBJECT_MEMORY before reaching the actual targets. > + { > + /* We allow reading readonly memory. */ > + struct target_section *section; A comment on this being an heuristic would be good. The _current_ readonly sections might well not be the same as the ones the target had when the trace was recorded. > + > + section = target_section_by_addr (ops, offset); > + if (section != NULL) > + { > + /* Check if the section we found is readonly. */ > + if ((bfd_get_section_flags (section->the_bfd_section->owner, > + section->the_bfd_section) > + & SEC_READONLY) != 0) > + { > + /* Truncate the request to fit into this section. */ > + len = min (len, section->endaddr - offset); > + break; > + } > + } > + > + return -1; I must be missing something, but won't raw_memory_xfer_partial keep trying in the target beneath, anyway? > + } > + } > + } > + > + /* Forward the request. */ > + for (t = ops->beneath; t != NULL; t = t->beneath) > + if (t->to_xfer_partial != NULL) > + return t->to_xfer_partial (t, object, annex, readbuf, writebuf, > + offset, len); > + > + return -1; > +} > + > /* The to_fetch_registers method of target record-btrace. */ > > static void > @@ -930,6 +980,7 @@ init_record_btrace_ops (void) > ops->to_call_history_from = record_btrace_call_history_from; > ops->to_call_history_range = record_btrace_call_history_range; > ops->to_record_is_replaying = record_btrace_is_replaying; > + ops->to_xfer_partial = record_btrace_xfer_partial; > ops->to_fetch_registers = record_btrace_fetch_registers; > ops->to_store_registers = record_btrace_store_registers; > ops->to_prepare_to_store = record_btrace_prepare_to_store; > -- Pedro Alves