From: Pierre Langlois <pierre.langlois@embecosm.com>
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.
Date: Mon, 02 Jun 2014 09:12:00 -0000 [thread overview]
Message-ID: <538C400B.609@embecosm.com> (raw)
In-Reply-To: <537E086A.9030803@embecosm.com>
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 <pierre.langlois@embecosm.com>
>
> 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);
>
next prev parent reply other threads:[~2014-06-02 9:12 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-05-22 14:23 [RFC][PATCH " Pierre Langlois
2014-06-02 9:12 ` Pierre Langlois [this message]
2014-06-11 16:58 ` [PING^2][RFC][PATCH " Pierre Langlois
2014-06-12 13:23 ` [RFC][PATCH " Pedro Alves
2014-06-12 16:03 ` Pierre Langlois
2014-06-12 16:31 ` Pedro Alves
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=538C400B.609@embecosm.com \
--to=pierre.langlois@embecosm.com \
--cc=gdb-patches@sourceware.org \
--cc=palves@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox