From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18071 invoked by alias); 11 Jun 2014 16:58:37 -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 17853 invoked by uid 89); 11 Jun 2014 16:58:36 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.4 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; Wed, 11 Jun 2014 16:58:34 +0000 Received: by mail-wg0-f48.google.com with SMTP id n12so23001wgh.31 for ; Wed, 11 Jun 2014 09:58:28 -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=7VXQh34xJHtg9HtftRJ6eueIXcVzwSx1QibjFOVMys8=; b=ehfL2VjFOOfqdUR5FtZ05QARolSjQaQKW2mZk28HDu3+kX2lYzzqzYGXfxlg8D+Mgp LpKzcAmJf6aPM2wl25EY08Zrw9Immvtkzzhl9TFdbv0rHyEtnbOMfrK0Odis0nrzuYBT 5CuEKNL/Mns7fMrQybJxPwxx2a5JckGXrMd5WC5JZSoxf7adANfm7iYx/pteKA8WI7KG FbZ/gaPqlvywkkOFXw9SAGUD4EquotwZ3NFBXqUCEl4YhMfpHx6ijrFEagI5gfLGB0eC 3yKu2rsorAAj5L0z4U7lyoucqPUYvJy03kJYqWd3Ds7Wieyye5Nz1NdoKOlEe3PXNOAc TqFQ== X-Gm-Message-State: ALoCoQnlYDfH9IPEAAgkHn45HyXFwM8u2CnajDGuJq8B/BJg1efWW/kmet4EAcm66E8XBCBmC5m9 X-Received: by 10.180.126.97 with SMTP id mx1mr22271249wib.29.1402505908508; Wed, 11 Jun 2014 09:58:28 -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 bq7sm23744747wib.7.2014.06.11.09.58.27 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 11 Jun 2014 09:58:27 -0700 (PDT) Message-ID: <53988AB0.5070205@embecosm.com> Date: Wed, 11 Jun 2014 16:58: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^2][RFC][PATCH v2][PR remote/16896] Invalidate a register in cache when a remote target failed to write it. References: <537E086A.9030803@embecosm.com> <538C400B.609@embecosm.com> In-Reply-To: <538C400B.609@embecosm.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-IsSubscribed: yes X-SW-Source: 2014-06/txt/msg00458.txt.bz2 Ping. On 02/06/14 10:12, Pierre Langlois wrote: > 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); >> >