This is the mail archive of the gdb@sourceware.cygnus.com mailing list for the GDB project. See the GDB home page for more information.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

remote protocol extensions for reading and writing registers


After composing a patch that implements 'P' (set the value of one
register) in i386-stub.c, I noted that the remote protocol does not
define a corresponding command to read a specific register.  I have
not had a chance to see if this would be useful in practice, but it
should be reasonablely easy to implement.  As 'p' is available, it
could be used to complete the sequence 'G'/'g'/'P'/'p' for all
combinations of reading and writing registers.

I was also thinking of some alternative to obtaining all registers
when a subset is needed.  I had two contexts in mind: obtaining just
the control registers when returning from a step or continue, and
avoiding transferring FP, MMU, MMX, etc. registers when those are 
not in use or on a processor varient that doesn't include them.  

A stub that implements the 'T' response eliminates some of need for
this, since it can return whatever "important" registers are needed.
However, register read/write commands that can write subsets of all
the registers may be useful.  They may be even more useful when the
remote protocol is being used with another front end (perhaps a
monitor-like control panel)

Some ideas:
     * Define register "sets" that define a particular registers.  The
       new register read/write commands would operate on a set in the
       same way the global read/write operate today.

       read registers:	R<set-id>
       reply		XX....X

       write regs:	W<set-id>=XX....X
       reply		OK / ENN

       Possible sets are:
       0 - all registers
       1 - integer registers
       2 - FP registers
       3 - control registers???
       4 - MMX/multimedia registers

       As each set is represented by a number, the commands will be
       short; but the stub will have to contain a mapping of what
       registers are in each set and what their offset is.

     * Use a bitmask that represents what registers will be read or
       written in the transaction.

       read registers:	R<bitmask>
       reply		XX....X

       write regs:	W<bitmask>=XX....X
       reply		OK / ENN

       The width of the bitmask would have to be sufficent to represent
       all registers on a machine.  This may be excessive on machines
       with lots of registers.

     * Use a scheme like the 'T' response to read/write a sequence of
       registers.

       read registers:	Rn...;r...;n...;r...;n...;r...
       reply		XX....X

       write regs:	Wn...;r...;n...;r...;n...;r...=XX....X
       or:		Wn...;r...=XX..X;n...;r...=XX..X;n...;r...=XX..X
       reply		OK / ENN

       There's not much to recommend this scheme, as it exchanges long
       responses with long commands.


Thoughts?

	--jtc