Mirror of the gdb mailing list
 help / color / mirror / Atom feed
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



  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