From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3942 invoked by alias); 2 Jun 2014 09:12:50 -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 3932 invoked by uid 89); 2 Jun 2014 09:12:50 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.2 X-HELO: mail-wg0-f48.google.com Received: from mail-wg0-f48.google.com (HELO mail-wg0-f48.google.com) (74.125.82.48) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Mon, 02 Jun 2014 09:12:48 +0000 Received: by mail-wg0-f48.google.com with SMTP id k14so4784573wgh.19 for ; Mon, 02 Jun 2014 02:12:45 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:date:from:user-agent:mime-version:to :subject:references:in-reply-to:content-type :content-transfer-encoding; bh=GIY+VO5p0PSfN8nnOA4fFumPN/uV39kK36Q56zWt68E=; b=E7RqoDu2mCHK0e34FojqGydKROs9yvnjK8lrTK8QmshuQR7HhYOB9shXAfa4Wcb4jM JN+Pj0MglrVGsdpIDWrvDRh8a3MG5GbX7fBhrqV7yKGl40uLmGerhKq85VmPrwRF+1Kx Ccli7CgBcDBdsYVFUoyTYvpNRekRioeXP+B1wrxMAxKYUxYTDUhTwCH6CAywgKQaRVBU rVioT20gXwKfur5NdbsnQ1zexPiWGgfWToYyJnG2JoX6fLxu2oYFKu3EawbN/jM8CKx9 KBgIg2PKXR5k+jvHKyfTg6i4xa4uobT2KwbA5lJyPRfbeDvs0s7J1ammmbqZLXQFw1Hu Y1+Q== X-Gm-Message-State: ALoCoQlCOrXV01F/L2RLgKQhCyHS0v6whHPVyhC7RBiCkUB024HQ++Z7dDY8nUxZnmohyTbG+uTa X-Received: by 10.180.212.107 with SMTP id nj11mr20655453wic.40.1401700365368; Mon, 02 Jun 2014 02:12:45 -0700 (PDT) Received: from [192.168.0.134] (cust64-dsl91-135-5.idnet.net. [91.135.5.64]) by mx.google.com with ESMTPSA id o10sm33870637wjy.0.2014.06.02.02.12.44 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 02 Jun 2014 02:12:44 -0700 (PDT) Message-ID: <538C400B.609@embecosm.com> Date: Mon, 02 Jun 2014 09:12:00 -0000 From: Pierre Langlois User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: gdb-patches@sourceware.org, palves@redhat.com Subject: [PING][RFC][PATCH v2][PR remote/16896] Invalidate a register in cache when a remote target failed to write it. References: <537E086A.9030803@embecosm.com> In-Reply-To: <537E086A.9030803@embecosm.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-IsSubscribed: yes X-SW-Source: 2014-06/txt/msg00015.txt.bz2 Ping. On 22/05/14 15:23, Pierre Langlois wrote: > Hello all, > > This patch addresses the issue in patch [1] generically as pointed out by > a comment [2]. > > As opposed to invalidating a register in cache in the remote target before > throwing an error, we can do this using a cleanup in regcache_raw_write. This > patch adds routines to add a regcache_invalidate cleanup to the current chain. > We can use this before target_store_registers and discard it after if an error > was not thrown. > > [1] https://sourceware.org/ml/gdb-patches/2014-05/msg00083.html > [2] https://sourceware.org/ml/gdb-patches/2014-05/msg00357.html > > 2014-05-20 Pierre Langlois > > PR remote/16896 > * regcache.c (register_to_invalidate): New structure. Combines a pointer > to a struct regcache and a register number. > (do_register_invalidate): New function. Call regcache_invalidate. > (make_cleanup_regcache_invalidate): New function. Construct a cleanup > for invalidating a register. > (regcache_raw_write): Call make_cleanup_regcache_invalidate > * regcache.h (make_cleanup_regcache_invalidate): New prototype. > > --- > gdb/regcache.c | 41 ++++++++++++++++++++++++++++++++++++++--- > gdb/regcache.h | 2 ++ > 2 files changed, 40 insertions(+), 3 deletions(-) > > diff --git a/gdb/regcache.c b/gdb/regcache.c > index 8b588c6..87a6b02 100644 > --- a/gdb/regcache.c > +++ b/gdb/regcache.c > @@ -267,6 +267,30 @@ make_cleanup_regcache_xfree (struct regcache *regcache) > return make_cleanup (do_regcache_xfree, regcache); > } > > +/* Cleanup routines for invalidating a register. */ > + > +struct register_to_invalidate > +{ > + struct regcache *regcache; > + int regnum; > +}; > + > +static void > +do_regcache_invalidate (void *data) > +{ > + struct register_to_invalidate *reg = data; > + regcache_invalidate (reg->regcache, reg->regnum); > +} > + > +struct cleanup * > +make_cleanup_regcache_invalidate (struct regcache *regcache, int regnum) > +{ > + struct register_to_invalidate* reg = XNEW (struct register_to_invalidate); > + reg->regcache = regcache; > + reg->regnum = regnum; > + return make_cleanup_dtor (do_regcache_invalidate, (void *) reg, xfree); > +} > + > /* Return REGCACHE's architecture. */ > > struct gdbarch * > @@ -846,7 +870,8 @@ void > regcache_raw_write (struct regcache *regcache, int regnum, > const gdb_byte *buf) > { > - struct cleanup *old_chain; > + struct cleanup *chain_before_save_inferior; > + struct cleanup *chain_before_invalidate_register; > > gdb_assert (regcache != NULL && buf != NULL); > gdb_assert (regnum >= 0 && regnum < regcache->descr->nr_raw_registers); > @@ -864,16 +889,26 @@ regcache_raw_write (struct regcache *regcache, int regnum, > regcache->descr->sizeof_register[regnum]) == 0)) > return; > > - old_chain = save_inferior_ptid (); > + chain_before_save_inferior = save_inferior_ptid (); > inferior_ptid = regcache->ptid; > > target_prepare_to_store (regcache); > memcpy (register_buffer (regcache, regnum), buf, > regcache->descr->sizeof_register[regnum]); > regcache->register_status[regnum] = REG_VALID; > + > + /* Register a cleanup function for invalidating the register after it is > + written, in case of a failure. */ > + chain_before_invalidate_register = > + make_cleanup_regcache_invalidate (regcache, regnum); > + > target_store_registers (regcache, regnum); > > - do_cleanups (old_chain); > + /* The target did not throw an error so we can discard invalidating the > + register and restore the cleanup chain to what it was. */ > + discard_cleanups (chain_before_invalidate_register); > + > + do_cleanups (chain_before_save_inferior); > } > > void > diff --git a/gdb/regcache.h b/gdb/regcache.h > index 8423f57..bb40b65 100644 > --- a/gdb/regcache.h > +++ b/gdb/regcache.h > @@ -33,6 +33,8 @@ extern struct regcache *get_thread_arch_aspace_regcache (ptid_t, > > void regcache_xfree (struct regcache *regcache); > struct cleanup *make_cleanup_regcache_xfree (struct regcache *regcache); > +struct cleanup *make_cleanup_regcache_invalidate (struct regcache *regcache, > + int regnum); > struct regcache *regcache_xmalloc (struct gdbarch *gdbarch, > struct address_space *aspace); >