[RFC PATCH] gdb, rsp: clarify a 0-length memory access
Aktemur, Tankut Baris
tankut.baris.aktemur@intel.com
Tue Apr 9 06:39:54 GMT 2024
On Friday, April 5, 2024 3:10 PM, Andrew Burgess wrote:
> "Aktemur, Tankut Baris" <tankut.baris.aktemur@intel.com> writes:
>
> > On Thursday, March 28, 2024 3:13 PM, Andrew Burgess wrote:
> >> Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> writes:
> >>
> >> > Currently GDB uses a 0-length write access to probe for the 'X' packet
> >> > support. However, it is not clear from the document what a 0-length
> >> > read or write attempt should do. Clarify the document that it is
> >> > an error. Also update gdbserver's implementation to return an error.
> >>
> >> We're usually pretty conservative about changing existing remote
> >> protocol behaviour.
> >>
> >> If I understand the current behaviour correctly, we treat the zero
> >> length access as always succeeding, but you propose to change this to
> >> always fail.
> >>
> >> What's the motivation for this change? Does the existing behaviour
> >> cause some problem?
> >>
> >> Usually, when the docs are ambiguous we update the docs to reflect GDB's
> >> current behaviour, unless the current behaviour is clearly wrong.
> >>
> >> Thanks,
> >> Andrew
> >
> > Hi Andrew,
> >
> > The background of the submission is the thread linked below, where Tom expressed
> > his tendency to think that a 0-length access should be an error:
> >
> > https://sourceware.org/pipermail/gdb-patches/2024-March/207411.html
>
> OK. But here's my real worry. Right now gdbserver always succeeds for
> a zero length read/write, and it's possible that there exists other
> remote targets that have copied this behaviour.
>
> If we change the behaviour for this case, and an updated GDB, that
> expects zero length will result in failure, connects to an old gdbserver
> (or some other remote target), what happens?
>
> Even if *this* patch doesn't introduce a dependency on the new
> behaviour, future patches might, so the question I think is still a
> valid one to ask.
>
> Maybe we can show that older GDBs would _never_ send a zero length
> request? In that case maybe this is OK.
I'm not sure how we could show that feasibly. Currently in
`check_binary_download`, GDB sends a 0-length memory write ('X')
packet to see if the packet is supported. Receiving a success or a failure
does not matter, they both denote support. We can check the git history of
the `check_binary_download` function; it was most likely always like that.
But maybe there was a time an older GDB sent a 0-length access packet
somewhere else and explicitly expected success or failure, and that code was
removed later on, I don't know. It seems very difficult to me to prove that
no such check existed in the past.
I can update the document to match gdbserver's current behavior of sending
success. One glitch there is the 'm' packet, which replies with an empty
response if the length is 0; so, distinguishing success from unsupported
is not possible.
(gdb) maintenance packet m01234,0
sending: m01234,0
received: ""
(gdb) maintenance packet foo
sending: foo
received: ""
(gdb)
But maybe 'm' is always supposed to be supported?
> The solid solution would be to add a qSupported packet to control the
> behaviour of a zero length access. The default would continue the
> current "success" strategy, while if the remote supports the new packet
> the behaviour can switch to a "failure" strategy.
>
> Thanks,
> Andrew
Intel Deutschland GmbH
Registered Address: Am Campeon 10, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de <http://www.intel.de>
Managing Directors: Christin Eisenschmid, Sharon Heck, Tiffany Doon Silva
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928
More information about the Gdb-patches
mailing list