This is the mail archive of the gdb@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: possible gdb agent expression extension


David Taylor <dtaylor@emc.com> wrote:

> We're thinking of extending gdb agent expreswions by adding additional
> bytecodes.  Before doing this I'd like to determine whether the idea of
> doing this would be looked upon favorably and what form it should take.
> 
> [One of our current goals with regard to GDB is to use stock GDB sources
> as much as possible and to only make changes that are either bug fixes
> or extensions that when contributed back are likely to be looked upon
> favorably in concept and hopefully in implementation.]
> 
> We would like to be able to set variables using byte code expressions.
> In practice this means being able to set memory and being able to set
> registers.  There are no byte code for either of these.
> 
> For setting registers, a new opcode 'setreg'.  Like 'reg' the next two
> bytes of the bytecode stream are the register number.  Top of expression
> stack is the value to set it to.  And the top of the expression stack is
> popped.
> 
> For setting memory, two possibilities come to mind:
> 
> . either, one opcode 'set' or 'setmem' with next byte in byte code
> stream saying how big a chunk of memory to set, with top two values on
> expression stack being the address to set and the value to set it to.
> 
> . or, four new opcodes (similar to 'ref' and 'const') -- set8, set16,
> set32, and set64 with, again, top two values on expression stack being
> the address to set and the value to set it to.
> 
> Is this something people would like to see added?
> 
> Which approach do people feel is better?  Which should be top of stack?
> Address?  Or value?  And should they be popped?
> 
> As I have other, higher priority, items to work on, it will likely be
> awhile before I start on this.  

I never saw any responses to this.  My inclination is to make setmem
like const and ref and have 4 versions one each for 8, 16, 32, and 64
bits -- though I could be persuaded that there should be just one which
takes the bit size as an argument.

Hopefully the markup is correct:

@item @code{setmem8} (0x??): @var{addr} @var{value} @result{}
@item @code{setmem16} (0x??): @var{addr} @var{value} @result{}
@item @code{setmem32} (0x??): @var{addr} @var{value} @result{}
@item @code{setmem64} (0x??): @var{addr} @var{value} @result{}

Pop an address @var{addr} and a value @{value} from the stack.  For
bytecode @code{setmem}@var{n}, set the @var{n}-bit value at @var{addr}
to the least significant @var{n}-bits of @var{value}.  Ignoring
architecture pointer alignment issues, it is as if the operation

*@code{uint}@var{n}@code{_t}@var{addr} = @code{uint}@var{n}@code{_t}@var{value}

What I'm trying to say is:

setmem8 (0x??):  <addr> <value> ==>
setmem16 (0x??): <addr> <value> ==>
setmem32 (0x??): <addr> <value> ==>
setmem64 (0x??): <addr> <value> ==>

Pop an address <addr> and a value <value> from the stack.

For bytecode setmem<n>, set the <n>-bit value at <addr> to the least
significant <n>-bits of <value>.  Ignoring architecture pointer alignment
issues, it is as if the operation

    *(uint<n>_t *)addr = (uint<n>_t)<value>

was performed.

If attempting to set memory address <addr> to <value> would cause a
processor exception, terminate with an error.

Similarly, for setreg:

@item @code{setreg} (0x??) @var{regnum}: @var{value} @result{{}

Or:

setreg (0x??) <regnum>: <value> ==>

Pop <value> off the stack and set <regnum> to <value>.

If register <regnum> does not exist or cannot be set, terminate with an
error.

<regnum> is a 16 bit value with the same interpretation as for the reg
operation.

Looking at gdb/common/ax.def, the last opcode that appears to be
allocated is 0x34 for printf.  So, how about opcodes:

    0x35 for setmem8
    0x36 for setmem16
    0x37 for setmem32
    0x38 for setmem64
    0x39 for setreg

?

Also, should there be a string to place within the qSupported response
to tell GDB that these operations are supported?  Maybe:

    SetOps+

?  Or something else?

David
--
dtaylor at emc dot com


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