From: Andrew Cagney <ac131313@cygnus.com>
To: thorpej@wasabisystems.com
Cc: Richard.Earnshaw@arm.com, gdb@sources.redhat.com
Subject: Re: Saving/restoring the entire register set
Date: Tue, 14 May 2002 13:06:00 -0000 [thread overview]
Message-ID: <3CE16E44.8070807@cygnus.com> (raw)
In-Reply-To: <20020514082856.O3435@dr-evil.shagadelic.org>
Interesting timeing,
> The current implementation of generic_{push,pop}_dummy_frame use
>
> {read,write}_register_bytes (0, addr, REGISTER_BYTES)
>
> to save/restore the entire regset.
Interesting timing, see:
http://sources.redhat.com/ml/gdb/2002-05/msg00116.html
> This is causing a problem for me with the new pseudo/raw register
> separation that I'm trying to create because write_register_bytes calls
> write_register_gen which calls arm_register_write and then aborts because
> we are trying to directly update a raw register rather than a pseudo.
Hmm, {read,write} register bytes can call the legacy {read,write}
register gen. Those functions provide the behavour the {read,write}
bytes functions rely on. I guess I didn't notice this when adding
regcache_read().
For the record (per numerious change requests) {read,write} register
bytes need to be snuffed out.
> While the dummy frame code does seem to be doing something sensible, doing
> it this way is somewhat of a pain, because I really want to fault out
> attempts to directly poke into the raw registers (I've already tracked down
> two or three bugs this way).
>
> For this special case of saving/restoring the entire register bank, I wonder if a more suitable interface might be to have calls such as
>
> struct regcache *regcache_alloc (); /* Allocate a new regcache structure */
> regcache_save (regcache); /* Copy current registers into it */
> regcache_restore (regcache); /* Restore registers from it */
> regcache_free (regcache); /* Release it */
>
> which would directly perform the precise operations that are required.
>
> These routines could then directly use the legacy_{read,write}_register_gen
> interface to fill/restore a copy of the structure.
[Since someone will likely now look at that post]
--
regbuf.[hc] adds just a register buffer. It should be a raw register
only buffer except .... (sigh). The objective is purely to replace
registers[] with an object.
If you look through the patch, you'll notice that I also modify
functions such as extract_struct_value_adress and value_being_returned
to take a ``struct regbuf'' instead of the raw registers array. That
part is strictly a sideways transformation - I'm not trying to fix anything.
--
I think, eventually, there will be a ``struct state'' object that makes
available either the live (call through to the target register/memory
code) or saved (just consult the local cache) state of the target. The
saved state could include both saved registers and memory. This is why
a ``struct regcache'' wouldn't do the trick. I've seen one target that
needs to restore memory to correctly recover from a call dummy
(fortunatly no one has tried to integrate this into current gdb).
Functions such as extract_struct_value_address would take this object
instead of registers[]/regbuf. That code could then call register
{read,write} (which also takes a ``struct state'') to read/write values.
--
At present GDB saves and restores all the raw registers. This is
overkill. After an inferior function call, you probably don't want to
restore all the registers (in fact you probably don't want to save them
- forcing them to be fetched from the target). Hence, architecture
methods like:
raw_register_save_p()
raw_register_restore_p()
will be needed.
--
thoughts,
Andrew
next prev parent reply other threads:[~2002-05-14 20:06 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-05-14 8:18 Richard Earnshaw
2002-05-14 8:28 ` Jason R Thorpe
2002-05-14 13:06 ` Andrew Cagney [this message]
2002-05-15 3:09 ` Richard Earnshaw
2002-05-15 7:13 ` Andrew Cagney
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=3CE16E44.8070807@cygnus.com \
--to=ac131313@cygnus.com \
--cc=Richard.Earnshaw@arm.com \
--cc=gdb@sources.redhat.com \
--cc=thorpej@wasabisystems.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